Fix compatible format check for vkCmdCopyImage.
Change-Id: I4553bbdb7be5f5bd9e6efc12f4e3aba7557c4549
Reviewed-on: https://skia-review.googlesource.com/c/skia/+/213133
Reviewed-by: Jim Van Verth <jvanverth@google.com>
Commit-Queue: Greg Daniel <egdaniel@google.com>
diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp
index 76230a1..bbcd688 100644
--- a/src/gpu/vk/GrVkCaps.cpp
+++ b/src/gpu/vk/GrVkCaps.cpp
@@ -75,6 +75,46 @@
return true;
}
+static int get_compatible_format_class(GrPixelConfig config) {
+ switch (config) {
+ case kAlpha_8_GrPixelConfig:
+ case kAlpha_8_as_Red_GrPixelConfig:
+ case kGray_8_GrPixelConfig:
+ case kGray_8_as_Red_GrPixelConfig:
+ return 1;
+ case kRGB_565_GrPixelConfig:
+ case kRGBA_4444_GrPixelConfig:
+ case kRG_88_GrPixelConfig:
+ case kAlpha_half_GrPixelConfig:
+ case kAlpha_half_as_Red_GrPixelConfig:
+ return 2;
+ case kRGB_888_GrPixelConfig:
+ return 3;
+ case kRGBA_8888_GrPixelConfig:
+ case kRGB_888X_GrPixelConfig:
+ case kBGRA_8888_GrPixelConfig:
+ case kSRGBA_8888_GrPixelConfig:
+ case kSBGRA_8888_GrPixelConfig:
+ case kRGBA_1010102_GrPixelConfig:
+ return 4;
+ case kRGBA_half_GrPixelConfig:
+ case kRGBA_half_Clamped_GrPixelConfig:
+ case kRG_float_GrPixelConfig:
+ return 5;
+ case kRGBA_float_GrPixelConfig:
+ return 6;
+ case kRGB_ETC1_GrPixelConfig:
+ return 7;
+ case kUnknown_GrPixelConfig:
+ case kAlpha_8_as_Alpha_GrPixelConfig:
+ case kGray_8_as_Lum_GrPixelConfig:
+ SK_ABORT("Unsupported Vulkan pixel config");
+ return 0;
+ }
+ SK_ABORT("Invalid pixel config");
+ return 0;
+}
+
bool GrVkCaps::canCopyImage(GrPixelConfig dstConfig, int dstSampleCnt, GrSurfaceOrigin dstOrigin,
bool dstHasYcbcr, GrPixelConfig srcConfig, int srcSampleCnt,
GrSurfaceOrigin srcOrigin, bool srcHasYcbcr) const {
@@ -88,7 +128,8 @@
// We require that all vulkan GrSurfaces have been created with transfer_dst and transfer_src
// as image usage flags.
- if (srcOrigin != dstOrigin || GrBytesPerPixel(srcConfig) != GrBytesPerPixel(dstConfig)) {
+ if (srcOrigin != dstOrigin ||
+ get_compatible_format_class(srcConfig) != get_compatible_format_class(dstConfig)) {
return false;
}
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 5aca28c..6daf28d 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -809,6 +809,17 @@
if (!copyTexture) {
return false;
}
+
+ bool dstHasYcbcr = tex->ycbcrConversionInfo().isValid();
+ if (!this->vkCaps().canCopyAsBlit(tex->config(), 1, false, dstHasYcbcr,
+ copyTexture->config(), 1, false,
+ false) &&
+ !this->vkCaps().canCopyAsDraw(tex->config(), SkToBool(tex->asRenderTarget()),
+ dstHasYcbcr,
+ copyTexture->config(), true, false)) {
+ return false;
+ }
+
uploadTexture = copyTexture.get();
uploadLeft = 0;
uploadTop = 0;
@@ -2292,9 +2303,8 @@
srcSampleCount = rt->numColorSamples();
}
bool srcHasYcbcr = image->ycbcrConversionInfo().isValid();
- static const GrSurfaceOrigin kOrigin = kTopLeft_GrSurfaceOrigin;
- if (!this->vkCaps().canCopyAsBlit(copySurface->config(), 1, kOrigin, false,
- surface->config(), srcSampleCount, kOrigin,
+ if (!this->vkCaps().canCopyAsBlit(copySurface->config(), 1, false, false,
+ surface->config(), srcSampleCount, image->isLinearTiled(),
srcHasYcbcr) &&
!this->vkCaps().canCopyAsDraw(copySurface->config(), false, false,
surface->config(), SkToBool(surface->asTexture()),
@@ -2302,6 +2312,7 @@
return false;
}
SkIRect srcRect = SkIRect::MakeXYWH(left, top, width, height);
+ static const GrSurfaceOrigin kOrigin = kTopLeft_GrSurfaceOrigin;
if (!this->copySurface(copySurface.get(), kOrigin, surface, kOrigin,
srcRect, SkIPoint::Make(0,0))) {
return false;
diff --git a/src/gpu/vk/GrVkUtil.cpp b/src/gpu/vk/GrVkUtil.cpp
index 6738bc9..3d32b16 100644
--- a/src/gpu/vk/GrVkUtil.cpp
+++ b/src/gpu/vk/GrVkUtil.cpp
@@ -71,8 +71,6 @@
*format = VK_FORMAT_R32G32_SFLOAT;
return true;
case kRGBA_half_GrPixelConfig:
- *format = VK_FORMAT_R16G16B16A16_SFLOAT;
- return true;
case kRGBA_half_Clamped_GrPixelConfig:
*format = VK_FORMAT_R16G16B16A16_SFLOAT;
return true;