aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/gpu/vk
diff options
context:
space:
mode:
authorGravatar egdaniel <egdaniel@google.com>2016-06-27 12:57:00 -0700
committerGravatar Commit bot <commit-bot@chromium.org>2016-06-27 12:57:00 -0700
commit4583ec51d9ddc830eeb854db068235be96ce59c4 (patch)
treefb98aa1bd78dc79617f324592c64bde6a41a337e /src/gpu/vk
parent8e0a09c1a14adf246fabfd88185c918911d3603c (diff)
Add support for draws in vulkan read and write pixels
GL has a lot more optimizations checks here to make sure we do the most effecient and correct draw here, but for now as long as the features are support we just do basic draws for both reads and writes when we need certain conversions. BUG=skia: GOLD_TRYBOT_URL= https://gold.skia.org/search?issue=2105433002 Review-Url: https://codereview.chromium.org/2105433002
Diffstat (limited to 'src/gpu/vk')
-rw-r--r--src/gpu/vk/GrVkGpu.cpp60
1 files changed, 42 insertions, 18 deletions
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index ee5d324dc8..bfda30a033 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -252,18 +252,42 @@ bool GrVkGpu::onGetWritePixelsInfo(GrSurface* dstSurface, int width, int height,
return false;
}
- // Currently we don't handle draws, so if the caller wants/needs to do a draw we need to fail
- if (kNoDraw_DrawPreference != *drawPreference) {
- return false;
+ if (dstSurface->config() == srcConfig) {
+ return true;
}
- if (dstSurface->config() != srcConfig) {
- // TODO: This should fall back to drawing or copying to change config of dstSurface to
- // match that of srcConfig.
- return false;
+ GrRenderTarget* renderTarget = dstSurface->asRenderTarget();
+
+ // Start off assuming no swizzling
+ tempDrawInfo->fSwizzle = GrSwizzle::RGBA();
+ tempDrawInfo->fWriteConfig = srcConfig;
+
+ // These settings we will always want if a temp draw is performed. Initially set the config
+ // to srcConfig, though that may be modified if we decide to do a R/B swap
+ tempDrawInfo->fTempSurfaceDesc.fFlags = kNone_GrSurfaceFlags;
+ tempDrawInfo->fTempSurfaceDesc.fConfig = srcConfig;
+ tempDrawInfo->fTempSurfaceDesc.fWidth = width;
+ tempDrawInfo->fTempSurfaceDesc.fHeight = height;
+ tempDrawInfo->fTempSurfaceDesc.fSampleCnt = 0;
+ tempDrawInfo->fTempSurfaceDesc.fOrigin = kTopLeft_GrSurfaceOrigin;
+
+ if (renderTarget && this->vkCaps().isConfigRenderable(renderTarget->config(), false)) {
+ ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference);
+
+ bool configsAreRBSwaps = GrPixelConfigSwapRAndB(srcConfig) == dstSurface->config();
+
+ if (!this->vkCaps().isConfigTexturable(srcConfig) && configsAreRBSwaps) {
+ if (!this->vkCaps().isConfigTexturable(dstSurface->config())) {
+ return false;
+ }
+ tempDrawInfo->fTempSurfaceDesc.fConfig = dstSurface->config();
+ tempDrawInfo->fSwizzle = GrSwizzle::BGRA();
+ tempDrawInfo->fWriteConfig = dstSurface->config();
+ }
+ return true;
}
- return true;
+ return false;
}
bool GrVkGpu::onWritePixels(GrSurface* surface,
@@ -324,7 +348,7 @@ bool GrVkGpu::onWritePixels(GrSurface* surface,
success = this->uploadTexDataOptimal(vkTex, left, top, width, height, config, texels);
}
}
-
+
return success;
}
@@ -502,7 +526,7 @@ bool GrVkGpu::uploadTexDataOptimal(GrVkTexture* tex,
region.imageSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, SkToU32(currentMipLevel), 0, 1 };
region.imageOffset = { left, flipY ? tex->height() - top - currentHeight : top, 0 };
region.imageExtent = { (uint32_t)currentWidth, (uint32_t)currentHeight, 1 };
-
+
currentWidth = SkTMax(1, currentWidth/2);
currentHeight = SkTMax(1, currentHeight/2);
}
@@ -1332,18 +1356,18 @@ void GrVkGpu::onGetMultisampleSpecs(GrRenderTarget* rt, const GrStencilSettings&
bool GrVkGpu::onGetReadPixelsInfo(GrSurface* srcSurface, int width, int height, size_t rowBytes,
GrPixelConfig readConfig, DrawPreference* drawPreference,
ReadPixelTempDrawInfo* tempDrawInfo) {
- // Currently we don't handle draws, so if the caller wants/needs to do a draw we need to fail
- if (kNoDraw_DrawPreference != *drawPreference) {
- return false;
+ if (srcSurface->config() == readConfig) {
+ return true;
}
- if (srcSurface->config() != readConfig) {
- // TODO: This should fall back to drawing or copying to change config of srcSurface to match
- // that of readConfig.
- return false;
+ if (this->vkCaps().isConfigRenderable(readConfig, false)) {
+ ElevateDrawPreference(drawPreference, kRequireDraw_DrawPreference);
+ tempDrawInfo->fTempSurfaceDesc.fConfig = readConfig;
+ tempDrawInfo->fReadConfig = readConfig;
+ return true;
}
- return true;
+ return false;
}
bool GrVkGpu::onReadPixels(GrSurface* surface,