diff options
author | Brian Salomon <bsalomon@google.com> | 2018-06-20 16:25:26 -0400 |
---|---|---|
committer | Skia Commit-Bot <skia-commit-bot@chromium.org> | 2018-06-20 21:13:27 +0000 |
commit | 930f939c48af1be6005af12bb6f709ca5da9d118 (patch) | |
tree | 21dbb8b105aa1190237c148358b7993565158335 /src/gpu/vk | |
parent | 2a284de7a51c198096a6f34ec1cbfe9118db554c (diff) |
Ensure that textures exported via SkImage::MakeBackendTextureFromSkImage
have consistent content in their mip map levels.
Bug= chromium:850617
Change-Id: I3ad918aa453bd8e4e625eb145de6ba2a5dab7b0c
Reviewed-on: https://skia-review.googlesource.com/136230
Commit-Queue: Brian Salomon <bsalomon@google.com>
Reviewed-by: Greg Daniel <egdaniel@google.com>
Diffstat (limited to 'src/gpu/vk')
-rw-r--r-- | src/gpu/vk/GrVkGpu.cpp | 54 | ||||
-rw-r--r-- | src/gpu/vk/GrVkGpu.h | 4 | ||||
-rw-r--r-- | src/gpu/vk/GrVkGpuCommandBuffer.cpp | 3 |
3 files changed, 28 insertions, 33 deletions
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp index 1149855b1b..1d89566d9c 100644 --- a/src/gpu/vk/GrVkGpu.cpp +++ b/src/gpu/vk/GrVkGpu.cpp @@ -894,11 +894,12 @@ sk_sp<GrRenderTarget> GrVkGpu::onWrapBackendTextureAsRenderTarget(const GrBacken return GrVkRenderTarget::MakeWrappedRenderTarget(this, desc, imageInfo, std::move(layout)); } -void GrVkGpu::generateMipmap(GrVkTexture* tex, GrSurfaceOrigin texOrigin) { +bool GrVkGpu::onRegenerateMipMapLevels(GrTexture* tex) { + auto* vkTex = static_cast<GrVkTexture*>(tex); // don't do anything for linearly tiled textures (can't have mipmaps) - if (tex->isLinearTiled()) { + if (vkTex->isLinearTiled()) { SkDebugf("Trying to create mipmap for linear tiled texture"); - return; + return false; } // determine if we can blit to and from this format @@ -906,19 +907,13 @@ void GrVkGpu::generateMipmap(GrVkTexture* tex, GrSurfaceOrigin texOrigin) { if (!caps.configCanBeDstofBlit(tex->config(), false) || !caps.configCanBeSrcofBlit(tex->config(), false) || !caps.mipMapSupport()) { - return; + return false; } if (this->vkCaps().mustSubmitCommandsBeforeCopyOp()) { this->submitCommandBuffer(kSkip_SyncQueue); } - // We may need to resolve the texture first if it is also a render target - GrVkRenderTarget* texRT = static_cast<GrVkRenderTarget*>(tex->asRenderTarget()); - if (texRT) { - this->internalResolveRenderTarget(texRT, false); - } - int width = tex->width(); int height = tex->height(); VkImageBlit blitRegion; @@ -926,26 +921,26 @@ void GrVkGpu::generateMipmap(GrVkTexture* tex, GrSurfaceOrigin texOrigin) { // SkMipMap doesn't include the base level in the level count so we have to add 1 uint32_t levelCount = SkMipMap::ComputeLevelCount(tex->width(), tex->height()) + 1; - SkASSERT(levelCount == tex->mipLevels()); + SkASSERT(levelCount == vkTex->mipLevels()); // change layout of the layers so we can write to them. - tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, false); + vkTex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_ACCESS_TRANSFER_WRITE_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, false); // setup memory barrier - SkASSERT(GrVkFormatIsSupported(tex->imageFormat())); + SkASSERT(GrVkFormatIsSupported(vkTex->imageFormat())); VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT; VkImageMemoryBarrier imageMemoryBarrier = { - VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType - nullptr, // pNext - VK_ACCESS_TRANSFER_WRITE_BIT, // srcAccessMask - VK_ACCESS_TRANSFER_READ_BIT, // dstAccessMask - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // oldLayout - VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // newLayout - VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex - VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex - tex->image(), // image - { aspectFlags, 0, 1, 0, 1 } // subresourceRange + VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType + nullptr, // pNext + VK_ACCESS_TRANSFER_WRITE_BIT, // srcAccessMask + VK_ACCESS_TRANSFER_READ_BIT, // dstAccessMask + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, // oldLayout + VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, // newLayout + VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex + VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex + vkTex->image(), // image + {aspectFlags, 0, 1, 0, 1} // subresourceRange }; // Blit the miplevels @@ -967,11 +962,11 @@ void GrVkGpu::generateMipmap(GrVkTexture* tex, GrSurfaceOrigin texOrigin) { blitRegion.dstOffsets[0] = { 0, 0, 0 }; blitRegion.dstOffsets[1] = { width, height, 1 }; fCurrentCmdBuffer->blitImage(this, - tex->resource(), - tex->image(), + vkTex->resource(), + vkTex->image(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - tex->resource(), - tex->image(), + vkTex->resource(), + vkTex->image(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &blitRegion, @@ -984,7 +979,8 @@ void GrVkGpu::generateMipmap(GrVkTexture* tex, GrSurfaceOrigin texOrigin) { imageMemoryBarrier.subresourceRange.baseMipLevel = mipLevel - 1; this->addImageMemoryBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, false, &imageMemoryBarrier); - tex->updateImageLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); + vkTex->updateImageLayout(VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL); + return true; } //////////////////////////////////////////////////////////////////////////////// diff --git a/src/gpu/vk/GrVkGpu.h b/src/gpu/vk/GrVkGpu.h index 5df1675794..052476098d 100644 --- a/src/gpu/vk/GrVkGpu.h +++ b/src/gpu/vk/GrVkGpu.h @@ -114,6 +114,8 @@ public: return fCompiler; } + bool onRegenerateMipMapLevels(GrTexture* tex) override; + void onResolveRenderTarget(GrRenderTarget* target) override { this->internalResolveRenderTarget(target, true); } @@ -137,8 +139,6 @@ public: sk_sp<GrSemaphore> prepareTextureForCrossContextUsage(GrTexture*) override; - void generateMipmap(GrVkTexture* tex, GrSurfaceOrigin texOrigin); - void copyBuffer(GrVkBuffer* srcBuffer, GrVkBuffer* dstBuffer, VkDeviceSize srcOffset, VkDeviceSize dstOffset, VkDeviceSize size); bool updateBuffer(GrVkBuffer* buffer, const void* src, VkDeviceSize offset, VkDeviceSize size); diff --git a/src/gpu/vk/GrVkGpuCommandBuffer.cpp b/src/gpu/vk/GrVkGpuCommandBuffer.cpp index e28a532bbb..0058a948fe 100644 --- a/src/gpu/vk/GrVkGpuCommandBuffer.cpp +++ b/src/gpu/vk/GrVkGpuCommandBuffer.cpp @@ -622,8 +622,7 @@ static void prepare_sampled_images(const GrResourceIOProcessor& processor, if (GrSamplerState::Filter::kMipMap == sampler.samplerState().filter()) { SkASSERT(vkTexture->texturePriv().mipMapped() == GrMipMapped::kYes); if (vkTexture->texturePriv().mipMapsAreDirty()) { - gpu->generateMipmap(vkTexture, sampler.proxy()->origin()); - vkTexture->texturePriv().markMipMapsClean(); + gpu->regenerateMipMapLevels(vkTexture); } } sampledImages->push_back(vkTexture); |