diff options
author | 2016-06-27 12:57:00 -0700 | |
---|---|---|
committer | 2016-06-27 12:57:00 -0700 | |
commit | 4583ec51d9ddc830eeb854db068235be96ce59c4 (patch) | |
tree | fb98aa1bd78dc79617f324592c64bde6a41a337e /src/gpu/vk | |
parent | 8e0a09c1a14adf246fabfd88185c918911d3603c (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.cpp | 60 |
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, |