@@ -77,7 +77,9 @@ HnBeginFrameTask::HnBeginFrameTask(pxr::HdSceneDelegate* ParamsDelegate, const p
7777 UNEXPECTED (" ParamsDelegate is null" );
7878 return ;
7979 }
80- pxr::HdRenderIndex& RenderIndex = ParamsDelegate->GetRenderIndex ();
80+ pxr::HdRenderIndex& RenderIndex = ParamsDelegate->GetRenderIndex ();
81+ HnRenderDelegate* pRenderDelegate = static_cast <HnRenderDelegate*>(RenderIndex.GetRenderDelegate ());
82+ USD_Renderer& Renderer = *pRenderDelegate->GetUSDRenderer ();
8183
8284 // Insert empty Bprims for offscreen render targets into the render index.
8385 // The render targets will be created when Prepare() is called and the
@@ -103,6 +105,16 @@ HnBeginFrameTask::HnBeginFrameTask(pxr::HdSceneDelegate* ParamsDelegate, const p
103105 m_ClosestSelLocnTargetId[0 ] = InitBrim (HnRenderResourceTokens->closestSelectedLocation0Target );
104106 m_ClosestSelLocnTargetId[1 ] = InitBrim (HnRenderResourceTokens->closestSelectedLocation1Target );
105107 m_JitteredFinalColorTargetId = InitBrim (HnRenderResourceTokens->jitteredFinalColorTarget );
108+
109+ if (Renderer.GetSettings ().EnableOIT )
110+ {
111+ const std::vector<TextureDesc> OITDescs = Renderer.GetOITTextureDescs ();
112+ m_OITTargetIds.resize (OITDescs.size ());
113+ for (size_t i = 0 ; i < OITDescs.size (); ++i)
114+ {
115+ m_OITTargetIds[i] = InitBrim (pxr::TfToken{HnRenderResourceTokens->oitTarget .GetString () + std::to_string (i)});
116+ }
117+ }
106118}
107119
108120HnBeginFrameTask::~HnBeginFrameTask ()
@@ -192,11 +204,17 @@ void HnBeginFrameTask::PrepareRenderTargets(pxr::HdRenderIndex* RenderIndex,
192204 m_FrameBufferWidth = FinalTargetDesc.Width ;
193205 m_FrameBufferHeight = FinalTargetDesc.Height ;
194206
195- auto UpdateBrim = [&](const pxr::SdfPath& Id, TEXTURE_FORMAT Format, const std::string& Name) -> ITextureView* {
207+ HnRenderDelegate* pRenderDelegate = static_cast <HnRenderDelegate*>(RenderIndex->GetRenderDelegate ());
208+ IRenderDevice* pDevice = pRenderDelegate->GetDevice ();
209+ USD_Renderer& Renderer = *pRenderDelegate->GetUSDRenderer ();
210+
211+ auto UpdateBrim = [&](const pxr::SdfPath& Id,
212+ TEXTURE_FORMAT Format,
213+ BIND_FLAGS BindFlags,
214+ const std::string& Name) -> ITextureView* {
196215 if (Format == TEX_FORMAT_UNKNOWN)
197216 return nullptr ;
198217
199- IRenderDevice* const pDevice = static_cast <HnRenderDelegate*>(RenderIndex->GetRenderDelegate ())->GetDevice ();
200218 if (!pDevice->GetTextureFormatInfo (Format).Supported )
201219 {
202220 Format = GetFallbackTextureFormat (Format);
@@ -211,22 +229,20 @@ void HnBeginFrameTask::PrepareRenderTargets(pxr::HdRenderIndex* RenderIndex,
211229 return nullptr ;
212230 }
213231
214- if (auto * pView = Renderbuffer->GetTarget ())
232+ if (ITextureView * pView = Renderbuffer->GetTarget ())
215233 {
216- const auto & ViewDesc = pView->GetDesc ();
217- const auto & TargetDesc = pView->GetTexture ()->GetDesc ();
234+ const TextureViewDesc & ViewDesc = pView->GetDesc ();
235+ const TextureDesc& TargetDesc = pView->GetTexture ()->GetDesc ();
218236 if (TargetDesc.GetWidth () == FinalTargetDesc.GetWidth () &&
219237 TargetDesc.GetHeight () == FinalTargetDesc.GetHeight () &&
220238 ViewDesc.Format == Format)
221239 return pView;
222240 }
223241
224- const bool IsDepth = GetTextureFormatAttribs (Format).IsDepthStencil ();
225-
226- auto TargetDesc = FinalTargetDesc;
227- TargetDesc.Name = Name.c_str ();
228- TargetDesc.Format = Format;
229- TargetDesc.BindFlags = (IsDepth ? BIND_DEPTH_STENCIL : BIND_RENDER_TARGET) | BIND_SHADER_RESOURCE;
242+ TextureDesc TargetDesc = FinalTargetDesc;
243+ TargetDesc.Name = Name.c_str ();
244+ TargetDesc.Format = Format;
245+ TargetDesc.BindFlags = BindFlags;
230246
231247 RefCntAutoPtr<ITexture> pTarget;
232248 pDevice->CreateTexture (TargetDesc, nullptr , &pTarget);
@@ -237,7 +253,19 @@ void HnBeginFrameTask::PrepareRenderTargets(pxr::HdRenderIndex* RenderIndex,
237253 }
238254 LOG_INFO_MESSAGE (" HnBeginFrameTask: created " , TargetDesc.GetWidth (), " x" , TargetDesc.GetHeight (), " " , Name, " texture" );
239255
240- auto * const pView = pTarget->GetDefaultView (IsDepth ? TEXTURE_VIEW_DEPTH_STENCIL : TEXTURE_VIEW_RENDER_TARGET);
256+ TEXTURE_VIEW_TYPE ViewType = TEXTURE_VIEW_UNDEFINED;
257+ if (BindFlags & BIND_DEPTH_STENCIL)
258+ ViewType = TEXTURE_VIEW_DEPTH_STENCIL;
259+ else if (BindFlags & BIND_UNORDERED_ACCESS)
260+ ViewType = TEXTURE_VIEW_UNORDERED_ACCESS;
261+ else if (BindFlags & BIND_RENDER_TARGET)
262+ ViewType = TEXTURE_VIEW_RENDER_TARGET;
263+ else if (BindFlags & BIND_SHADER_RESOURCE)
264+ ViewType = TEXTURE_VIEW_SHADER_RESOURCE;
265+ else
266+ UNEXPECTED (" Unexpected bind flags" );
267+
268+ ITextureView* const pView = pTarget->GetDefaultView (ViewType);
241269 VERIFY (pView != nullptr , " Failed to get texture view for target " , Name);
242270
243271 Renderbuffer->SetTarget (pView);
@@ -247,10 +275,12 @@ void HnBeginFrameTask::PrepareRenderTargets(pxr::HdRenderIndex* RenderIndex,
247275
248276 m_FrameRenderTargets.FinalColorRTV = pFinalColorRTV;
249277
278+ constexpr BIND_FLAGS BIND_RT_SR = BIND_RENDER_TARGET | BIND_SHADER_RESOURCE;
279+ constexpr BIND_FLAGS BIND_DS_SR = BIND_DEPTH_STENCIL | BIND_SHADER_RESOURCE;
250280 for (Uint32 i = 0 ; i < HnFrameRenderTargets::GBUFFER_TARGET_COUNT; ++i)
251281 {
252282 const char * Name = HnFrameRenderTargets::GetGBufferTargetName (static_cast <HnFrameRenderTargets::GBUFFER_TARGET>(i));
253- m_FrameRenderTargets.GBufferRTVs [i] = UpdateBrim (m_GBufferTargetIds[i], m_Params.Formats .GBuffer [i], Name);
283+ m_FrameRenderTargets.GBufferRTVs [i] = UpdateBrim (m_GBufferTargetIds[i], m_Params.Formats .GBuffer [i], BIND_RT_SR, Name);
254284 if (m_FrameRenderTargets.GBufferRTVs [i])
255285 {
256286 m_FrameRenderTargets.GBufferSRVs [i] = m_FrameRenderTargets.GBufferRTVs [i]->GetTexture ()->GetDefaultView (TEXTURE_VIEW_SHADER_RESOURCE);
@@ -262,12 +292,23 @@ void HnBeginFrameTask::PrepareRenderTargets(pxr::HdRenderIndex* RenderIndex,
262292 }
263293 }
264294
265- m_FrameRenderTargets.SelectionDepthDSV = UpdateBrim (m_SelectionDepthBufferId, m_Params.Formats .Depth , " Selection depth buffer" );
266- m_FrameRenderTargets.DepthDSV = UpdateBrim (m_DepthBufferId[0 ], m_Params.Formats .Depth , " Depth buffer 0" );
267- m_FrameRenderTargets.PrevDepthDSV = UpdateBrim (m_DepthBufferId[1 ], m_Params.Formats .Depth , " Depth buffer 1" );
268- m_FrameRenderTargets.ClosestSelectedLocationRTV [0 ] = UpdateBrim (m_ClosestSelLocnTargetId[0 ], m_Params.Formats .ClosestSelectedLocation , " Closest selected location 0" );
269- m_FrameRenderTargets.ClosestSelectedLocationRTV [1 ] = UpdateBrim (m_ClosestSelLocnTargetId[1 ], m_Params.Formats .ClosestSelectedLocation , " Closest selected location 1" );
270- m_FrameRenderTargets.JitteredFinalColorRTV = UpdateBrim (m_JitteredFinalColorTargetId, m_Params.Formats .JitteredColor , " Jittered final color" );
295+ m_FrameRenderTargets.SelectionDepthDSV = UpdateBrim (m_SelectionDepthBufferId, m_Params.Formats .Depth , BIND_DS_SR, " Selection depth buffer" );
296+ m_FrameRenderTargets.DepthDSV = UpdateBrim (m_DepthBufferId[0 ], m_Params.Formats .Depth , BIND_DS_SR, " Depth buffer 0" );
297+ m_FrameRenderTargets.PrevDepthDSV = UpdateBrim (m_DepthBufferId[1 ], m_Params.Formats .Depth , BIND_DS_SR, " Depth buffer 1" );
298+ m_FrameRenderTargets.ClosestSelectedLocationRTV [0 ] = UpdateBrim (m_ClosestSelLocnTargetId[0 ], m_Params.Formats .ClosestSelectedLocation , BIND_RT_SR, " Closest selected location 0" );
299+ m_FrameRenderTargets.ClosestSelectedLocationRTV [1 ] = UpdateBrim (m_ClosestSelLocnTargetId[1 ], m_Params.Formats .ClosestSelectedLocation , BIND_RT_SR, " Closest selected location 1" );
300+ m_FrameRenderTargets.JitteredFinalColorRTV = UpdateBrim (m_JitteredFinalColorTargetId, m_Params.Formats .JitteredColor , BIND_RT_SR, " Jittered final color" );
301+
302+ if (Renderer.GetSettings ().EnableOIT )
303+ {
304+ const std::vector<TextureDesc> OITDescs = Renderer.GetOITTextureDescs ();
305+ m_FrameRenderTargets.OITUAVs .resize (OITDescs.size ());
306+ for (size_t i = 0 ; i < OITDescs.size (); ++i)
307+ {
308+ const TextureDesc& Desc = OITDescs[i];
309+ m_FrameRenderTargets.OITUAVs [i] = UpdateBrim (m_OITTargetIds[i], Desc.Format , Desc.BindFlags , Desc.Name );
310+ }
311+ }
271312
272313 (*TaskCtx)[HnRenderResourceTokens->frameRenderTargets ] = pxr::VtValue{&m_FrameRenderTargets};
273314
0 commit comments