diff --git a/pxr/imaging/hdSt/renderBuffer.cpp b/pxr/imaging/hdSt/renderBuffer.cpp index 3f25575388..9ac83ada0d 100644 --- a/pxr/imaging/hdSt/renderBuffer.cpp +++ b/pxr/imaging/hdSt/renderBuffer.cpp @@ -23,13 +23,12 @@ HgiTextureUsage _GetTextureUsage(HdFormat format, TfToken const &name) // We are assuming at some point in a render buffer's lifetime it could be // used to read from, so provide that ability to the render buffer. This is // especially useful for the HgiVulkan backend. - - if (HdAovHasDepthSemantic(name)) { - return HgiTextureUsageBitsDepthTarget | HgiTextureUsageBitsShaderRead; - } else if (HdAovHasDepthStencilSemantic(name)) { + if (HdAovHasDepthStencilSemantic(name)) { return HgiTextureUsageBitsDepthTarget | - HgiTextureUsageBitsStencilTarget | - HgiTextureUsageBitsShaderRead; + HgiTextureUsageBitsStencilTarget | + HgiTextureUsageBitsShaderRead; + } else if (HdAovHasDepthSemantic(name)) { + return HgiTextureUsageBitsDepthTarget | HgiTextureUsageBitsShaderRead; } return HgiTextureUsageBitsColorTarget | HgiTextureUsageBitsShaderRead; diff --git a/pxr/imaging/hdSt/renderDelegate.cpp b/pxr/imaging/hdSt/renderDelegate.cpp index d35c0cf1c1..1e308304d1 100644 --- a/pxr/imaging/hdSt/renderDelegate.cpp +++ b/pxr/imaging/hdSt/renderDelegate.cpp @@ -312,13 +312,13 @@ HdStRenderDelegate::GetDefaultAovDescriptor(TfToken const& name) const if (name == HdAovTokens->color) { return HdAovDescriptor( HdFormatFloat16Vec4, colorDepthMSAA, VtValue(GfVec4f(0))); + } else if (HdAovHasDepthStencilSemantic(name)) { + return HdAovDescriptor( + HdFormatFloat32UInt8, colorDepthMSAA, + VtValue(HdDepthStencilType(1.0f, 0))); } else if (HdAovHasDepthSemantic(name)) { return HdAovDescriptor( HdFormatFloat32, colorDepthMSAA, VtValue(1.0f)); - } else if (HdAovHasDepthStencilSemantic(name)) { - return HdAovDescriptor( - HdFormatFloat32UInt8, colorDepthMSAA, - VtValue(HdDepthStencilType(1.0f, 0))); } else if (_AovHasIdSemantic(name)) { return HdAovDescriptor( HdFormatInt32, colorDepthMSAA, VtValue(-1)); diff --git a/pxr/imaging/hdx/pickTask.cpp b/pxr/imaging/hdx/pickTask.cpp index fb2be8b08f..ee87557a90 100644 --- a/pxr/imaging/hdx/pickTask.cpp +++ b/pxr/imaging/hdx/pickTask.cpp @@ -249,7 +249,7 @@ HdxPickTask::_CreateAovBindings() _GetAovPath(_tokens->widgetDepthStencil)); HdAovDescriptor depthDesc = renderDelegate->GetDefaultAovDescriptor( - HdAovTokens->depth); + _depthToken); _widgetAovBindings = _pickableAovBindings; for (auto& binding : _widgetAovBindings) { diff --git a/pxr/imaging/hgiVulkan/conversions.cpp b/pxr/imaging/hgiVulkan/conversions.cpp index 329fa0110b..a2a63d4f41 100644 --- a/pxr/imaging/hgiVulkan/conversions.cpp +++ b/pxr/imaging/hgiVulkan/conversions.cpp @@ -375,8 +375,12 @@ HgiVulkanConversions::GetFormat(HgiFormat inFormat, bool depthFormat) // Special case for float32 depth format not properly handled by // _FormatTable - if (depthFormat && inFormat == HgiFormatFloat32) { - vkFormat = VK_FORMAT_D32_SFLOAT; + if (depthFormat) { + if (inFormat == HgiFormatFloat32) { + vkFormat = VK_FORMAT_D32_SFLOAT; + } else if (inFormat == HgiFormatFloat32UInt8) { + vkFormat = VK_FORMAT_D32_SFLOAT_S8_UINT; + } } return vkFormat; diff --git a/pxr/imaging/hgiVulkan/texture.cpp b/pxr/imaging/hgiVulkan/texture.cpp index 0b25e6618f..888f01bfdc 100644 --- a/pxr/imaging/hgiVulkan/texture.cpp +++ b/pxr/imaging/hgiVulkan/texture.cpp @@ -47,6 +47,7 @@ HgiVulkanTexture::HgiVulkanTexture( { GfVec3i const& dimensions = desc.dimensions; bool const isDepthBuffer = desc.usage & HgiTextureUsageBitsDepthTarget; + bool const isStencilBuffer = desc.usage & HgiTextureUsageBitsStencilTarget; // // Gather image create info @@ -152,11 +153,14 @@ HgiVulkanTexture::HgiVulkanTexture( // that can be accessed through this image view. // It's possible to create multiple image views for a single image // referring to different (and/or overlapping) ranges of the image. - // A 'view' must be either depth or stencil, not both, especially when used - // in a descriptor set. For now we assume we always want the 'depth' aspect. - view.subresourceRange.aspectMask = isDepthBuffer ? - VK_IMAGE_ASPECT_DEPTH_BIT /*| VK_IMAGE_ASPECT_STENCIL_BIT*/ : - VK_IMAGE_ASPECT_COLOR_BIT; + if (isDepthBuffer) { + view.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT; + if (isStencilBuffer) { + view.subresourceRange.aspectMask |= VK_IMAGE_ASPECT_STENCIL_BIT; + } + } else { + view.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + } view.subresourceRange.baseMipLevel = 0; view.subresourceRange.baseArrayLayer = 0;