aboutsummaryrefslogtreecommitdiff
path: root/src/gpu
diff options
context:
space:
mode:
authorGreg Daniel <egdaniel@google.com>2019-05-22 10:09:36 -0400
committerHal Canary <halcanary@google.com>2019-05-22 13:17:07 -0400
commit885be039ca2c69e00e2666df846acdd84eb9076a (patch)
treec12d274064bcd3ce5c99a4f6eea435955c378f87 /src/gpu
parent516750248c7403975f7d34ab77dc4f8c79de2df0 (diff)
downloadskqp-885be039ca2c69e00e2666df846acdd84eb9076a.tar.gz
Fix compatible format check for vkCmdCopyImage.
No-Tree-Checks: true No-Presubmit: true 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> Cherry-Pick: 5c7b54112bca7eb770f29f422b90792cec6a780b Reviewed-on: https://skia-review.googlesource.com/c/skia/+/215383 Reviewed-by: Hal Canary <halcanary@google.com> Cherry-Pick: c0941201f97e0a460e4bd391c8652ac4be74eb92
Diffstat (limited to 'src/gpu')
-rw-r--r--src/gpu/vk/GrVkCaps.cpp41
-rw-r--r--src/gpu/vk/GrVkGpu.cpp15
2 files changed, 52 insertions, 4 deletions
diff --git a/src/gpu/vk/GrVkCaps.cpp b/src/gpu/vk/GrVkCaps.cpp
index a720e72bf1..dabdda76a6 100644
--- a/src/gpu/vk/GrVkCaps.cpp
+++ b/src/gpu/vk/GrVkCaps.cpp
@@ -74,6 +74,44 @@ bool GrVkCaps::initDescForDstCopy(const GrRenderTargetProxy* src, GrSurfaceDesc*
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 kBGRA_8888_GrPixelConfig:
+ case kSRGBA_8888_GrPixelConfig:
+ case kSBGRA_8888_GrPixelConfig:
+ case kRGBA_1010102_GrPixelConfig:
+ return 4;
+ case kRGBA_half_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,
GrPixelConfig srcConfig, int srcSampleCnt,
GrSurfaceOrigin srcOrigin) const {
@@ -83,7 +121,8 @@ bool GrVkCaps::canCopyImage(GrPixelConfig dstConfig, int dstSampleCnt, GrSurface
// 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 2f668051e3..ede31df82f 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -712,6 +712,14 @@ bool GrVkGpu::uploadTexDataOptimal(GrVkTexture* tex, int left, int top, int widt
if (!copyTexture) {
return false;
}
+
+ if (!this->vkCaps().canCopyAsBlit(tex->config(), 1, false,
+ copyTexture->config(), 1, false) &&
+ !this->vkCaps().canCopyAsDraw(tex->config(), SkToBool(tex->asRenderTarget()),
+ copyTexture->config(), true)) {
+ return false;
+ }
+
uploadTexture = copyTexture.get();
uploadLeft = 0;
uploadTop = 0;
@@ -2107,14 +2115,15 @@ bool GrVkGpu::onReadPixels(GrSurface* surface, int left, int top, int width, int
if (rt) {
srcSampleCount = rt->numColorSamples();
}
- static const GrSurfaceOrigin kOrigin = kTopLeft_GrSurfaceOrigin;
- if (!this->vkCaps().canCopyAsBlit(copySurface->config(), 1, kOrigin,
- surface->config(), srcSampleCount, kOrigin) &&
+ if (!this->vkCaps().canCopyAsBlit(copySurface->config(), 1, false,
+ surface->config(), srcSampleCount,
+ image->isLinearTiled()) &&
!this->vkCaps().canCopyAsDraw(copySurface->config(), false,
surface->config(), SkToBool(surface->asTexture()))) {
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;