Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(587)

Unified Diff: src/gpu/vk/GrVkGpu.cpp

Issue 1950713006: Clean up GrVkImage::setLayout() (Closed) Base URL: https://skia.googlesource.com/skia.git@master
Patch Set: Fix one set of flags Created 4 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | src/gpu/vk/GrVkImage.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/gpu/vk/GrVkGpu.cpp
diff --git a/src/gpu/vk/GrVkGpu.cpp b/src/gpu/vk/GrVkGpu.cpp
index 0005f2cd11c05391b564801a491628e76ab5bbbc..c24d8c2799e15d82c5cab5119c55f680981fbd15 100644
--- a/src/gpu/vk/GrVkGpu.cpp
+++ b/src/gpu/vk/GrVkGpu.cpp
@@ -268,17 +268,10 @@ bool GrVkGpu::onWritePixels(GrSurface* surface,
}
if (VK_IMAGE_LAYOUT_PREINITIALIZED != vkTex->currentLayout()) {
// Need to change the layout to general in order to perform a host write
- VkImageLayout layout = vkTex->currentLayout();
- VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(layout);
- VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_HOST_BIT;
- VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout);
- VkAccessFlags dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
vkTex->setImageLayout(this,
VK_IMAGE_LAYOUT_GENERAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_HOST_WRITE_BIT,
+ VK_PIPELINE_STAGE_HOST_BIT,
false);
this->submitCommandBuffer(kForce_SyncQueue);
}
@@ -489,17 +482,10 @@ bool GrVkGpu::uploadTexDataOptimal(GrVkTexture* tex,
false);
// Change layout of our target so it can be copied to
- VkImageLayout layout = tex->currentLayout();
- VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(layout);
- VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
- VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout);
- VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
tex->setImageLayout(this,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
false);
// Copy the buffer to the image
@@ -720,15 +706,8 @@ void GrVkGpu::generateMipmap(GrVkTexture* tex) const {
}
// change the original image's layout
- VkImageLayout origSrcLayout = tex->currentLayout();
- VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origSrcLayout);
- VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
-
- VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origSrcLayout);
- VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
-
tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- srcAccessMask, dstAccessMask, srcStageMask, dstStageMask, false);
+ VK_ACCESS_TRANSFER_READ_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, false);
// grab handle to the original image resource
const GrVkImage::Resource* oldResource = tex->resource();
@@ -742,16 +721,8 @@ void GrVkGpu::generateMipmap(GrVkTexture* tex) const {
}
// change the new image's layout
- VkImageLayout origDstLayout = tex->currentLayout();
-
- srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origDstLayout);
- dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
-
- srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout);
- dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
-
- tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- srcAccessMask, dstAccessMask, srcStageMask, dstStageMask, false);
+ tex->setImageLayout(this, VK_IMAGE_LAYOUT_GENERAL,
+ VK_ACCESS_TRANSFER_WRITE_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT, false);
// Blit original image
int width = tex->width();
@@ -770,10 +741,27 @@ void GrVkGpu::generateMipmap(GrVkTexture* tex) const {
oldResource,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
tex->resource(),
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ VK_IMAGE_LAYOUT_GENERAL,
1,
&blitRegion,
VK_FILTER_LINEAR);
+
+ // setup memory barrier
+ SkASSERT(GrVkFormatToPixelConfig(tex->resource()->fFormat, nullptr));
+ VkImageAspectFlags aspectFlags = VK_IMAGE_ASPECT_COLOR_BIT;
+ VkImageMemoryBarrier imageMemoryBarrier = {
+ VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER, // sType
+ NULL, // pNext
+ VK_ACCESS_TRANSFER_WRITE_BIT, // outputMask
+ VK_ACCESS_TRANSFER_READ_BIT, // inputMask
+ VK_IMAGE_LAYOUT_GENERAL, // oldLayout
+ VK_IMAGE_LAYOUT_GENERAL, // newLayout
+ VK_QUEUE_FAMILY_IGNORED, // srcQueueFamilyIndex
+ VK_QUEUE_FAMILY_IGNORED, // dstQueueFamilyIndex
+ tex->resource()->fImage, // image
+ { aspectFlags, 0, 1, 0, 1 } // subresourceRange
+ };
+
// Blit the miplevels
uint32_t mipLevel = 1;
while (mipLevel < levelCount) {
@@ -782,22 +770,21 @@ void GrVkGpu::generateMipmap(GrVkTexture* tex) const {
width = SkTMax(1, width / 2);
height = SkTMax(1, height / 2);
- blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel-1, 0, 1 };
+ imageMemoryBarrier.subresourceRange.baseMipLevel = mipLevel - 1;
+ this->addImageMemoryBarrier(VK_PIPELINE_STAGE_TRANSFER_BIT, VK_PIPELINE_STAGE_TRANSFER_BIT,
+ false, &imageMemoryBarrier);
+
+ blitRegion.srcSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel - 1, 0, 1 };
blitRegion.srcOffsets[0] = { 0, 0, 0 };
blitRegion.srcOffsets[1] = { prevWidth, prevHeight, 0 };
blitRegion.dstSubresource = { VK_IMAGE_ASPECT_COLOR_BIT, mipLevel, 0, 1 };
blitRegion.dstOffsets[0] = { 0, 0, 0 };
blitRegion.dstOffsets[1] = { width, height, 0 };
-
- tex->setImageLayout(this, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- srcAccessMask, dstAccessMask, srcStageMask, dstStageMask,
- mipLevel-1, 1, false);
-
fCurrentCmdBuffer->blitImage(this,
tex->resource(),
- VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
+ VK_IMAGE_LAYOUT_GENERAL,
tex->resource(),
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ VK_IMAGE_LAYOUT_GENERAL,
1,
&blitRegion,
VK_FILTER_LINEAR);
@@ -1060,23 +1047,12 @@ void GrVkGpu::clearStencil(GrRenderTarget* target) {
VkClearDepthStencilValue vkStencilColor;
memset(&vkStencilColor, 0, sizeof(VkClearDepthStencilValue));
- VkImageLayout origDstLayout = vkStencil->currentLayout();
-
- VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origDstLayout);
- VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
-
- VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout);;
- VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
-
vkStencil->setImageLayout(this,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
false);
-
VkImageSubresourceRange subRange;
memset(&subRange, 0, sizeof(VkImageSubresourceRange));
subRange.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
@@ -1114,32 +1090,18 @@ void GrVkGpu::onClearStencilClip(GrRenderTarget* target, const SkIRect& rect, bo
vkStencilColor.stencil = 0;
}
- VkImageLayout origDstLayout = vkStencil->currentLayout();
- VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout);
- VkAccessFlags dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
- VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origDstLayout);
- VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
vkStencil->setImageLayout(this,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT,
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
false);
// Change layout of our render target so it can be used as the color attachment. This is what
// the render pass expects when it begins.
- VkImageLayout layout = vkRT->currentLayout();
- srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(layout);
- dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
- srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout);
- dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
vkRT->setImageLayout(this,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
false);
VkClearRect clearRect;
@@ -1183,37 +1145,23 @@ void GrVkGpu::onClear(GrRenderTarget* target, const SkIRect& rect, GrColor color
GrColorToRGBAFloat(color, vkColor.float32);
GrVkRenderTarget* vkRT = static_cast<GrVkRenderTarget*>(target);
- VkImageLayout origDstLayout = vkRT->currentLayout();
if (rect.width() != target->width() || rect.height() != target->height()) {
- VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout);
- VkAccessFlags dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
- VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origDstLayout);
- VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
vkRT->setImageLayout(this,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
false);
// If we are using a stencil attachment we also need to change its layout to what the render
// pass is expecting.
if (GrStencilAttachment* stencil = vkRT->renderTargetPriv().getStencilAttachment()) {
GrVkStencilAttachment* vkStencil = (GrVkStencilAttachment*)stencil;
- origDstLayout = vkStencil->currentLayout();
- srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout);
- dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
- srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origDstLayout);
- dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
vkStencil->setImageLayout(this,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT,
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
false);
}
@@ -1246,21 +1194,12 @@ void GrVkGpu::onClear(GrRenderTarget* target, const SkIRect& rect, GrColor color
return;
}
- VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origDstLayout);
- VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
-
- VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout);;
- VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
-
vkRT->setImageLayout(this,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
false);
-
VkImageSubresourceRange subRange;
memset(&subRange, 0, sizeof(VkImageSubresourceRange));
subRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
@@ -1309,37 +1248,18 @@ void GrVkGpu::copySurfaceAsCopyImage(GrSurface* dst,
const SkIPoint& dstPoint) {
SkASSERT(can_copy_image(dst, src, this));
- VkImageLayout origDstLayout = dstImage->currentLayout();
- VkImageLayout origSrcLayout = srcImage->currentLayout();
-
- VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origDstLayout);
- VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
-
// These flags are for flushing/invalidating caches and for the dst image it doesn't matter if
// the cache is flushed since it is only being written to.
- VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout);;
- VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
-
dstImage->setImageLayout(this,
- VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
- false);
-
- srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origSrcLayout);
- dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
-
- srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origSrcLayout);
- dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
+ VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
+ false);
srcImage->setImageLayout(this,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_TRANSFER_READ_BIT,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
false);
// Flip rect if necessary
@@ -1408,35 +1328,16 @@ void GrVkGpu::copySurfaceAsBlit(GrSurface* dst,
const SkIPoint& dstPoint) {
SkASSERT(can_copy_as_blit(dst, src, dstImage, srcImage, this));
- VkImageLayout origDstLayout = dstImage->currentLayout();
- VkImageLayout origSrcLayout = srcImage->currentLayout();
-
- VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origDstLayout);
- VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
-
- VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout);;
- VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
-
dstImage->setImageLayout(this,
VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_TRANSFER_WRITE_BIT,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
false);
- srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(origSrcLayout);
- dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
-
- srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origSrcLayout);
- dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
-
srcImage->setImageLayout(this,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_TRANSFER_READ_BIT,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
false);
// Flip rect if necessary
@@ -1593,17 +1494,10 @@ bool GrVkGpu::onReadPixels(GrSurface* surface,
}
// Change layout of our target so it can be used as copy
- VkImageLayout layout = tgt->currentLayout();
- VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(layout);
- VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TRANSFER_BIT;
- VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout);
- VkAccessFlags dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
tgt->setImageLayout(this,
VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_TRANSFER_READ_BIT,
+ VK_PIPELINE_STAGE_TRANSFER_BIT,
false);
GrVkTransferBuffer* transferBuffer =
@@ -1718,35 +1612,20 @@ void GrVkGpu::onDraw(const GrPipeline& pipeline,
}
// Change layout of our render target so it can be used as the color attachment
- VkImageLayout layout = vkRT->currentLayout();
- VkPipelineStageFlags srcStageMask = GrVkMemory::LayoutToPipelineStageFlags(layout);
- VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
- VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(layout);
- VkAccessFlags dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
vkRT->setImageLayout(this,
VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
false);
// If we are using a stencil attachment we also need to update its layout
if (GrStencilAttachment* stencil = vkRT->renderTargetPriv().getStencilAttachment()) {
GrVkStencilAttachment* vkStencil = (GrVkStencilAttachment*)stencil;
- VkImageLayout origDstLayout = vkStencil->currentLayout();
- VkAccessFlags srcAccessMask = GrVkMemory::LayoutToSrcAccessMask(origDstLayout);
- VkAccessFlags dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
- VkPipelineStageFlags srcStageMask =
- GrVkMemory::LayoutToPipelineStageFlags(origDstLayout);
- VkPipelineStageFlags dstStageMask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
vkStencil->setImageLayout(this,
VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
- srcAccessMask,
- dstAccessMask,
- srcStageMask,
- dstStageMask,
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT |
+ VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT,
+ VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT,
false);
}
« no previous file with comments | « no previous file | src/gpu/vk/GrVkImage.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698