Add swiftshader workaround to resolve full MSAA image in dmsaa RenderPass.
Bug: b/303705884
Change-Id: Ie630c897b739530db1d61b055a9dfee3d03ca539
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/768298
Commit-Queue: Greg Daniel <egdaniel@google.com>
Reviewed-by: John Stiles <johnstiles@google.com>
diff --git a/gm/mesh.cpp b/gm/mesh.cpp
index 92c388b..9487439 100644
--- a/gm/mesh.cpp
+++ b/gm/mesh.cpp
@@ -1455,12 +1455,6 @@
return DrawResult::kFail;
}
- // TODO(b/303705884): The call to `VertexBuffer::update` above has the side effect of
- // preventing the canvas from being cleared in Ganesh's VKDMSAA mode. (Performing the update
- // drops the currently-active op.) This causes garbage to appear in golden images,
- // particularly in Swiftshader. Until this is fixed, we reissue the canvas clear here.
- canvas->drawColor(SK_ColorWHITE, SkBlendMode::kSrc);
-
SkPaint paint;
paint.setShader(fPaintShader);
canvas->drawMesh(result.mesh, SkBlender::Mode(SkBlendMode::kDstOver), paint);
diff --git a/src/gpu/ganesh/vk/GrVkCaps.cpp b/src/gpu/ganesh/vk/GrVkCaps.cpp
index 91e2f18..fc61c8e 100644
--- a/src/gpu/ganesh/vk/GrVkCaps.cpp
+++ b/src/gpu/ganesh/vk/GrVkCaps.cpp
@@ -572,7 +572,11 @@
// On Qualcomm and Arm the gpu resolves an area larger than the render pass bounds when using
// discardable msaa attachments. This causes the resolve to resolve uninitialized data from the
// msaa image into the resolve image.
- if (kQualcomm_VkVendor == properties.vendorID || kARM_VkVendor == properties.vendorID) {
+ // This also occurs on swiftshader: b/303705884
+ if (properties.vendorID == kQualcomm_VkVendor ||
+ properties.vendorID == kARM_VkVendor ||
+ (properties.vendorID == kGoogle_VkVendor &&
+ properties.deviceID == kSwiftshader_DeviceID)) {
fMustLoadFullImageWithDiscardableMSAA = true;
}
diff --git a/src/gpu/ganesh/vk/GrVkCaps.h b/src/gpu/ganesh/vk/GrVkCaps.h
index 21cec11..b1281f5d 100644
--- a/src/gpu/ganesh/vk/GrVkCaps.h
+++ b/src/gpu/ganesh/vk/GrVkCaps.h
@@ -277,6 +277,7 @@
enum VkVendor {
kAMD_VkVendor = 4098,
kARM_VkVendor = 5045,
+ kGoogle_VkVendor = 0x1AE0,
kImagination_VkVendor = 4112,
kIntel_VkVendor = 32902,
kNvidia_VkVendor = 4318,
@@ -298,6 +299,11 @@
kOther
};
+ enum DeviceID {
+ kSwiftshader_DeviceID = 0xC0DE, // As listed in Swiftshader code this may be a placeholder
+ // value but works for now.
+ };
+
static IntelGPUType GetIntelGPUType(uint32_t deviceID);
static int GetIntelGen(IntelGPUType type) {
switch (type) {