@@ -114,17 +114,19 @@ namespace DX12
114114
115115 void GraphicsContext::begin ()
116116 {
117+ reset ();
117118 topology = D3D_PRIMITIVE_TOPOLOGY::D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;
118119 reset_tables ();
119120 index = IndexBufferView ();
120121 }
121122 void GraphicsContext::end ()
122123 {
123- current_root_signature = nullptr ;
124+ // current_root_signature = nullptr;
124125 }
125126
126127 void ComputeContext::begin ()
127128 {
129+ reset ();
128130 reset_tables ();
129131 }
130132 void ComputeContext::end ()
@@ -193,14 +195,9 @@ namespace DX12
193195 });
194196 }
195197
196- void GraphicsContext::set_signature (const RootSignature::ptr& s)
198+ void GraphicsContext::on_set_signature (const RootSignature::ptr& s)
197199 {
198- assert (s);
199- if (current_root_signature != s)
200- {
201- list->SetGraphicsRootSignature (s->get_native ().Get ());
202- current_root_signature = s;
203- }
200+ list->SetGraphicsRootSignature (s->get_native ().Get ());
204201 }
205202
206203 void GraphicsContext::set_heaps (DescriptorHeap::ptr& a, DescriptorHeap::ptr& b)
@@ -478,13 +475,13 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
478475
479476 base.create_transition_point (false );
480477 }
481-
478+ /*
482479 void GraphicsContext::set_pipeline(PipelineState::ptr state)
483480 {
484481 set_signature(state->desc.root_signature);
485482 base.set_pipeline_internal(state.get());
486483 }
487-
484+ */
488485 void GraphicsContext::set_layout (Layouts layout)
489486 {
490487 set_signature (get_Signature (layout));
@@ -626,7 +623,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
626623 void Transitions::create_transition_point (bool end)
627624 {
628625 auto prev_point = transition_points.empty ()?nullptr : &transition_points.back ();
629- auto point = &transition_points.emplace_back ();
626+ auto point = &transition_points.emplace_back (type );
630627
631628 if (prev_point) prev_point->next_point = point;
632629 point->prev_point = prev_point;
@@ -637,9 +634,9 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
637634 {
638635 assert (point->prev_point ->start );
639636 }
640- compiler.func ([point](ID3D12GraphicsCommandList4* list)
637+ compiler.func ([point, this ](ID3D12GraphicsCommandList4* list)
641638 {
642- Barriers transitions;
639+ Barriers transitions (type) ;
643640
644641 for (auto uav : point->uav_transitions )
645642 {
@@ -721,7 +718,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
721718 {
722719 PROFILE (L" fix_pretransitions" );
723720
724- Barriers result;
721+ Barriers result (CommandListType::DIRECT) ;
725722 std::vector<Resource*> discards;
726723
727724
@@ -955,20 +952,16 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
955952 }
956953
957954
958- void ComputeContext::set_signature (const RootSignature::ptr& s)
955+ void ComputeContext::on_set_signature (const RootSignature::ptr& s)
959956 {
960- if (s != current_compute_root_signature)
961- {
962- current_compute_root_signature = s;
963- list->SetComputeRootSignature (s->get_native ().Get ());
964- }
957+ list->SetComputeRootSignature (s->get_native ().Get ());
965958 }
959+
966960 void ComputeContext::dispach (int x, int y, int z)
967961 {
968- PROFILE_GPU (L" Dispatch" );
969- base.setup_debug (this );
970-
962+ PROFILE_GPU (L" Dispatch" );
971963 base.create_transition_point ();
964+ base.setup_debug (this );
972965 commit_tables ();
973966 flush_binds ();
974967
@@ -999,7 +992,8 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
999992 {
1000993 list->SetComputeRootDescriptorTable (i, table.gpu );
1001994 }
1002-
995+
996+ /*
1003997 void ComputeContext::set_pipeline(ComputePipelineState::ptr state)
1004998 {
1005999 if (state->desc.root_signature)
@@ -1009,7 +1003,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
10091003
10101004 base.track_object(*state);
10111005 }
1012-
1006+ */
10131007 void ComputeContext::set_pso (std::shared_ptr<StateObject>& pso)
10141008 {
10151009 base.set_pipeline_internal (nullptr );
@@ -1160,10 +1154,10 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
11601154 void GraphicsContext::execute_indirect (IndirectCommand& command_types, UINT max_commands, Resource* command_buffer, UINT64 command_offset, Resource* counter_buffer, UINT64 counter_offset)
11611155 {
11621156 PROFILE_GPU (L" execute_indirect" );
1163- base.setup_debug (this );
11641157 base.create_transition_point ();
11651158
1166-
1159+ base.setup_debug (this );
1160+
11671161 if (command_buffer) get_base ().transition (command_buffer, ResourceState::INDIRECT_ARGUMENT);
11681162 if (counter_buffer) get_base ().transition (counter_buffer, ResourceState::INDIRECT_ARGUMENT);
11691163
@@ -1320,4 +1314,40 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
13201314 {
13211315 return m_commandList;
13221316 }
1317+
1318+
1319+ void SignatureDataSetter::set_pipeline (std::shared_ptr<PipelineStateBase> pipeline)
1320+ {
1321+ /*
1322+ {
1323+ for (auto& s : used_slots.slots_usage)
1324+ {
1325+ auto slot_id = get_slot_id(s);
1326+ auto& slot = slots[slot_id];
1327+
1328+ auto& used_tables = *slot.tables;
1329+
1330+ for (auto& id : used_tables)
1331+ {
1332+ auto& table = tables[id].table;
1333+
1334+ for (UINT i = 0; i < (UINT)table.get_count(); ++i)
1335+ {
1336+ const auto& h = table[i];
1337+
1338+ base.stop_using(h.resource_info);
1339+
1340+ }
1341+ }
1342+ }
1343+ }
1344+ */
1345+ if (pipeline->root_signature )
1346+ set_signature (pipeline->root_signature );
1347+
1348+ base.set_pipeline_internal (pipeline.get ());
1349+
1350+
1351+ used_slots = pipeline->slots ;
1352+ }
13231353}
0 commit comments