@@ -94,8 +94,9 @@ bool PassDefault<Passes::RTXPass>::setup(
9494 }
9595 else
9696 {
97- builder.create (data.EmulTileBuffer , { 256u * 256u , true }, ResourceFlags::UnorderedAccess);
98- builder.create (data.EmulDispatchArgs , { 1u , false }, ResourceFlags::UnorderedAccess);
97+ // counter_pad(8) + tile_data(256*256 * sizeof(TileRecord))
98+ constexpr uint64_t TILE_SECTION = 8u + 256u * 256u * sizeof (Table::TileRecord); // 524296
99+ builder.create (data.WorkGraphBuffer , { TILE_SECTION }, ResourceFlags::UnorderedAccess);
99100 }
100101
101102 return true ;
@@ -156,12 +157,8 @@ void PassDefault<Passes::RTXPass>::render(
156157 if (RenderSystem::get ().device ().get_properties ().work_graph )
157158 {
158159 auto & backingBuffer = data.WorkGraphBuffer ->resource ;
159- auto work_pso = RenderSystem::get ().device ().get_engine_pso_holder ().GetPSO <PSOS ::WorkGR>();
160-
161- compute.set_program (work_pso.get (),
162- backingBuffer->get_resource_address (),
163- uint (work_pso->buffer_size ),
164- data.WorkGraphBuffer .is_new ());
160+
161+ compute.set_program <PSOS ::WorkGR>(backingBuffer->get_resource_address (), data.WorkGraphBuffer .is_new ());
165162
166163 auto ep = create_entry (compute);
167164 for (auto i = 0 ; i < res.DispatchCount ; i++)
@@ -177,23 +174,24 @@ void PassDefault<Passes::RTXPass>::render(
177174 }
178175 else
179176 {
180- auto & tile_buf = *data.EmulTileBuffer ;
181- auto & disp_args = *data.EmulDispatchArgs ;
177+ // tile_buf: view into WorkGraphBuffer (stays UAV throughout).
178+ // disp_args: separate resource — exec_indirect transitions it to INDIRECT_ARGUMENT
179+ // independently, leaving WorkGraphBuffer in UAV for the Shadows_Node shader.
180+ constexpr uint64_t TILE_SECTION = 8u + 256u * 256u * sizeof (Table::TileRecord); // 524296
182181
183- if (data.EmulDispatchArgs .is_new ())
184- {
185- DispatchArguments init_args{ 0 , 1 , 1 };
186- context.get_list ()->get_copy ().update (disp_args, 0 , std::span{ &init_args, 1 });
187- }
182+ auto tile_buf = data.WorkGraphBuffer ->resource ->create_view <HAL ::StructuredBufferView<Table::TileRecord>>(
183+ *context.frame ,
184+ HAL ::StructuredBufferViewDesc{ 0 , TILE_SECTION , counterType::SELF });
185+ auto & disp_args = context.get_indirect_dispatch_args ();
188186
189187 // WaveCount[0] is always 64 (fixed wave size). Split YZ into chunks of 16
190188 // so each chunk has at most 64*16*64 = 65536 threads = 65536 tiles.
191189 constexpr int MAX_YZ_CHUNK = 16 ;
192190
193191 for (auto i = 0 ; i < res.DispatchCount ; i++)
194192 {
195- auto & e = res.Dispatch [i];
196- int total_yz = e.WaveCount [1 ] * e.WaveCount [2 ];
193+ auto & e = res.Dispatch [i];
194+ int total_yz = e.WaveCount [1 ] * e.WaveCount [2 ];
197195
198196 for (int yz_base = 0 ; yz_base < total_yz; yz_base += MAX_YZ_CHUNK )
199197 {
@@ -208,7 +206,7 @@ void PassDefault<Passes::RTXPass>::render(
208206 classifyEmul.GetShadows_Node () = tile_buf.appendStructuredBuffer ;
209207
210208 Slots::WorkGR_Shadows_NodeEmulation shadowsEmul;
211- shadowsEmul.GetInput () = tile_buf.consumeStructuredBuffer ;
209+ shadowsEmul.GetInput () = tile_buf.consumeStructuredBuffer ;
212210
213211 compute.set_pipeline <PSOS ::WorkGR_ClassifyPixels_Node>();
214212 compute.set (classifyEmul);
@@ -222,9 +220,9 @@ void PassDefault<Passes::RTXPass>::render(
222220 compute.set (shadowsEmul);
223221 compute.exec_indirect (disp_args, 1 );
224222
225- /* context.get_list()->get_copy().read_counter(tile_buf, [](uint remaining) {
223+ context.get_list ()->get_copy ().read_counter (tile_buf, [](uint remaining) {
226224 ASSERT (remaining == 0 );
227- });*/
225+ });
228226 }
229227 }
230228 }
0 commit comments