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, |