| Index: src/gpu/vk/GrVkGpu.cpp
|
| diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
|
| index ee5d324dc8930701607d7cc4f5b08a901822f9ba..bfda30a0338030928eab74b79b4576b719a1d150 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,
|
|
|