_GetTaskContextData(
ctx, HdxAovTokens->colorIntermediate, &aovTextureIntermediate);
- // since we are going to be sampling from this buffer and writing to a color
- // corrected - intermediate buffer.
- // However, the intermediate color corrected buffer is in the correct layout
+ // We need to ensure the incoming color buffer is set to the correct layout
+ // ie: Shader Read Only Optimal
++ // since we are going to be sampling from this buffer and writing to a
++ // color-corrected intermediate buffer.
++ // However, the intermediate color-corrected buffer is in the correct layout
+ // ie: Color Attachment Optimal.
+ // So, no layout transition there.
+ aovTexture->SubmitLayoutChange(HgiTextureUsageBitsShaderRead);
+
if (!TF_VERIFY(_CreateBufferResources())) {
return;
}
_ApplyColorCorrection(aovTextureIntermediate);
- // Before we ping-pong the buffers, we are going to ensure -
- // The color buffer is converted to a Color Attachment Optimal layout.
++ // Before we ping-pong the buffers, we are going to ensure the color buffer
++ // is converted to a Color Attachment Optimal layout.
+ // Hence, preserving the state atomicity of this pass.
- // Otherwise, its business as usual.
++ // Otherwise, it's business as usual.
+ aovTexture->SubmitLayoutChange(HgiTextureUsageBitsColorTarget);
+
// Toggle color and colorIntermediate
_ToggleRenderTarget(ctx);
}
// XXX STORAGE_IMAGE requires VK_IMAGE_USAGE_STORAGE_BIT, but Hgi
// doesn't tell us if a texture will be used as image load/store.
-- if ((desc.usage & HgiTextureUsageBitsShaderRead) ||
- (desc.usage & HgiTextureUsageBitsShaderWrite)) {
- imageCreateInfo.usage |= VK_IMAGE_USAGE_STORAGE_BIT;
- (desc.usage & HgiTextureUsageBitsShaderWrite)){
- // Vulkan does not allow image views of this format to be of type storage.
- // They are used for sampling or presentation
- if (imageCreateInfo.format == VK_FORMAT_R8G8B8A8_SRGB){
- imageCreateInfo.usage |= VK_IMAGE_USAGE_SAMPLED_BIT;
- }
- else{
- imageCreateInfo.usage |= VK_IMAGE_USAGE_STORAGE_BIT;
-- }
-
- }
VkFormatFeatureFlags formatValidationFlags =
HgiVulkanConversions::GetFormatFeature(desc.usage);
VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT); // Consumer stage
}
- VkAccessFlags srcAccessMask, dstAccessMask;
+ void
+ HgiVulkanTexture::SubmitLayoutChange(HgiTextureUsage newLayout)
+ {
+ VkImageLayout newVkLayout =
+ HgiVulkanTexture::GetDefaultImageLayout(newLayout);
+
+ HgiVulkanCommandQueue* queue = _device->GetCommandQueue();
+ HgiVulkanCommandBuffer* cb = queue->AcquireResourceCommandBuffer();
+
- dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
++ VkAccessFlags srcAccessMask, dstAccessMask = VK_ACCESS_NONE;
+
+ // The following cases are based on few initial assumptions to provide
+ // an infrastructure for access mask selection based on layouts.
+ // Feel free to update depending on need and use cases.
+ switch (GetImageLayout()) {
+ case VK_IMAGE_LAYOUT_PREINITIALIZED:
+ srcAccessMask =
+ VK_ACCESS_HOST_WRITE_BIT | VK_ACCESS_TRANSFER_WRITE_BIT;
+ break;
+ case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
+ srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+ break;
+ case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
+ srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ break;
+ case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
+ srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ break;
+ case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
+ srcAccessMask = VK_ACCESS_SHADER_READ_BIT;
+ break;
+ default:
+ srcAccessMask = VK_ACCESS_NONE;
+ break;
+ }
+
+ switch (newVkLayout) {
+ case VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL:
+ dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
+ break;
+ case VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL:
+ srcAccessMask |= VK_ACCESS_TRANSFER_READ_BIT;
+ dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
+ break;
+ case VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL:
- dstAccessMask |=
- VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT;
++ dstAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
+ break;
+ case VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL:
- srcAccessMask =
- VK_ACCESS_SHADER_READ_BIT;
++ dstAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
+ break;
+ case VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL:
- srcAccessMask = VK_ACCESS_NONE;
++ srcAccessMask = VK_ACCESS_SHADER_READ_BIT;
+ dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
+ break;
+ default:
- newVkLayout, // Transition tex to this layout
- srcAccessMask, // No pending writes
- dstAccessMask, // Write access to image
- VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, // Producer stage
- VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT); // Consumer stage
+ dstAccessMask = VK_ACCESS_NONE;
+ break;
+ }
+
+ TransitionImageBarrier(
+ cb,
+ this,
+ GetImageLayout(),
++ newVkLayout,
++ srcAccessMask,
++ dstAccessMask,
++ VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT,
++ VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT);
+ }
+
void
HgiVulkanTexture::TransitionImageBarrier(
HgiVulkanCommandBuffer* cb,
// Assume the ShaderWrite means its a storage image.
return VK_IMAGE_LAYOUT_GENERAL;
} else if (usage & HgiTextureUsageBitsShaderRead) {
- return VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
- // Also check if image is going to be used as a color
- // attachment as well. if yes, then explicitly give
- // it a color attachment layout
- if(usage & HgiTextureUsageBitsColorTarget)
++ // Also check if image is going to be used as a color attachment as
++ // well. If yes, then explicitly give it a color attachment layout.
++ if (usage & HgiTextureUsageBitsColorTarget) {
+ return VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
- else
++ } else {
+ return VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
++ }
} else if (usage & HgiTextureUsageBitsDepthTarget) {
return VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
} else if (usage & HgiTextureUsageBitsColorTarget) {