@@ -100,9 +100,9 @@ namespace DX12
100
100
101
101
void CommandList::end ()
102
102
{
103
- create_transition_point ();
103
+ // create_transition_point(false );
104
104
// id = -1;
105
-
105
+ Transitions::make_split_barriers ();
106
106
current_pipeline = nullptr ;
107
107
108
108
if (graphics) graphics->end ();
@@ -116,6 +116,7 @@ namespace DX12
116
116
{
117
117
topology = D3D_PRIMITIVE_TOPOLOGY::D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;
118
118
reset_tables ();
119
+ index = IndexBufferView ();
119
120
}
120
121
void GraphicsContext::end ()
121
122
{
@@ -248,6 +249,8 @@ namespace DX12
248
249
get_base ().transition_dsv (h.resource_info );
249
250
250
251
list->OMSetRenderTargets (c, &rt.cpu , true , h.is_valid () ? &h.cpu : nullptr );
252
+
253
+ base.create_transition_point (false );
251
254
}
252
255
253
256
void GraphicsContext::set_rtv (std::initializer_list<Handle> rt, Handle h)
@@ -267,7 +270,10 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
267
270
commit_tables ();
268
271
flush_binds ();
269
272
list->DrawInstanced (vertex_count, instance_count, vertex_offset, instance_offset);
273
+ base.create_transition_point (false );
274
+
270
275
get_base ().print_debug ();
276
+
271
277
}
272
278
void GraphicsContext::draw_indexed (UINT index_count, UINT index_offset, UINT vertex_offset, UINT instance_count, UINT instance_offset)
273
279
{
@@ -277,9 +283,12 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
277
283
base.setup_debug (this );
278
284
279
285
commit_tables ();
286
+ get_base ().transition (index.resource , ResourceState::INDEX_BUFFER);
287
+ list->IASetIndexBuffer (&index.view );
280
288
281
289
flush_binds ();
282
290
list->DrawIndexedInstanced (index_count, instance_count, index_offset, vertex_offset, instance_offset);
291
+ base.create_transition_point (false );
283
292
get_base ().print_debug ();
284
293
}
285
294
@@ -340,6 +349,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
340
349
memcpy (info.get_cpu_data (), data, size);
341
350
list->CopyBufferRegion (
342
351
resource->get_native ().Get (), offset, info.resource ->get_native ().Get (), info.offset , size);
352
+ base.create_transition_point (false );
343
353
}
344
354
345
355
D3D12_GPU_VIRTUAL_ADDRESS UploadInfo::get_gpu_address ()
@@ -465,6 +475,8 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
465
475
Src.PlacedFootprint .Footprint .RowPitch = res_stride;
466
476
Src.PlacedFootprint .Footprint .Format = Layouts.Footprint .Format ;
467
477
list->CopyTextureRegion (&Dst, offset.x , offset.y , offset.z , &Src, nullptr );
478
+
479
+ base.create_transition_point (false );
468
480
}
469
481
470
482
void GraphicsContext::set_pipeline (PipelineState::ptr state)
@@ -483,11 +495,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
483
495
}
484
496
std::future<bool > CopyContext::read_texture (const Resource* resource, ivec3 offset, ivec3 box, UINT sub_resource, std::function<void (const char *, UINT64, UINT64, UINT64)> f)
485
497
{
486
- base.create_transition_point ();
487
- // if (base.type != CommandListType::COPY)
488
- base.transition (resource, Render::ResourceState::COPY_SOURCE);
489
- // else
490
- // base.transition(resource, Render::ResourceState::COMMON);
498
+
491
499
492
500
UINT64 RequiredSize = 0 ;
493
501
D3D12_PLACED_SUBRESOURCE_FOOTPRINT Layouts;
@@ -503,6 +511,12 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
503
511
return str.get_future ();
504
512
}
505
513
514
+
515
+ base.create_transition_point ();
516
+ // if (base.type != CommandListType::COPY)
517
+ base.transition (resource, Render::ResourceState::COPY_SOURCE);
518
+ // else
519
+ // base.transition(resource, Render::ResourceState::COMMON);
506
520
int res_stride = Math::AlignUp (RowSizesInBytes, D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
507
521
UINT size = res_stride * box.y * box.z ;
508
522
auto info = base.read_data (size, D3D12_TEXTURE_DATA_PLACEMENT_ALIGNMENT);
@@ -523,12 +537,13 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
523
537
f (reinterpret_cast <char *>(info.get_cpu_data ()), res_stride, res_stride * NumRows, info.resource ->get_size ());
524
538
result->set_value (true );
525
539
});
540
+
541
+ base.create_transition_point (false );
526
542
return result->get_future ();
527
543
}
528
544
529
545
std::future<bool > CopyContext::read_buffer (Resource* resource, unsigned int offset, UINT64 size, std::function<void (const char *, UINT64)> f)
530
546
{
531
- base.create_transition_point ();
532
547
533
548
auto result = std::make_shared<std::promise<bool >>();
534
549
@@ -538,7 +553,9 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
538
553
result->set_value (true );
539
554
return result->get_future ();
540
555
}
541
-
556
+
557
+ base.create_transition_point ();
558
+
542
559
base.transition (resource, Render::ResourceState::COPY_SOURCE);
543
560
544
561
// auto size = resource->get_size();
@@ -550,6 +567,8 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
550
567
f (reinterpret_cast <char *>(info.get_cpu_data ()), size);
551
568
result->set_value (true );
552
569
});
570
+
571
+ base.create_transition_point (false );
553
572
return result->get_future ();
554
573
}
555
574
@@ -604,6 +623,99 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
604
623
Device::get ().context_generator .free (this );
605
624
606
625
}
626
+ void Transitions::create_transition_point (bool end)
627
+ {
628
+ auto prev_point = transition_points.empty ()?nullptr : &transition_points.back ();
629
+ auto point = &transition_points.emplace_back ();
630
+
631
+ if (prev_point) prev_point->next_point = point;
632
+ point->prev_point = prev_point;
633
+
634
+ point->start = !end;
635
+
636
+ if (end)
637
+ {
638
+ assert (point->prev_point ->start );
639
+ }
640
+ compiler.func ([point](ID3D12GraphicsCommandList4* list)
641
+ {
642
+ Barriers transitions;
643
+
644
+ for (auto uav : point->uav_transitions )
645
+ {
646
+ transitions.uav (uav);
647
+ }
648
+
649
+ for (auto & uav : point->aliasing )
650
+ {
651
+ transitions.alias (nullptr , uav);
652
+ }
653
+
654
+ for (auto & transition : point->transitions )
655
+ {
656
+ auto prev_transition = transition.prev_transition ;
657
+
658
+ if (!prev_transition) continue ;
659
+
660
+ if (prev_transition->wanted_state == transition.wanted_state ) continue ;
661
+
662
+ assert (!point->start );
663
+ transitions.transition (transition.resource ,
664
+ prev_transition->wanted_state ,
665
+ transition.wanted_state ,
666
+ transition.subres , transition.flags );
667
+ }
668
+
669
+ auto & native_transitions = transitions.get_native ();
670
+ if (!native_transitions.empty ())
671
+ {
672
+ list->ResourceBarrier ((UINT)native_transitions.size (), native_transitions.data ());
673
+ }
674
+
675
+ {
676
+
677
+ auto & native_transitions = point->compiled_transitions .get_native ();
678
+ if (!native_transitions.empty ())
679
+ {
680
+ list->ResourceBarrier ((UINT)native_transitions.size (), native_transitions.data ());
681
+ }
682
+ }
683
+
684
+ });
685
+ }
686
+
687
+
688
+ void Transitions::make_split_barriers ()
689
+ {
690
+ return ;
691
+ for (auto &point: transition_points)
692
+ {
693
+ for (auto & transition : point.transitions )
694
+ {
695
+ auto prev_transition = transition.prev_transition ;
696
+
697
+ if (!prev_transition) continue ;
698
+
699
+ if (prev_transition->wanted_state == transition.wanted_state ) continue ;
700
+
701
+ auto prev_point = prev_transition->point ->next_point ;
702
+
703
+ assert (prev_point->start );
704
+ prev_point->compiled_transitions .transition (transition.resource ,
705
+ prev_transition->wanted_state ,
706
+ transition.wanted_state ,
707
+ transition.subres , BarrierFlags::BEGIN);
708
+
709
+ transition.flags = BarrierFlags::END;
710
+ /*
711
+ transitions.transition(transition.resource,
712
+ prev_transition->wanted_state,
713
+ transition.wanted_state,
714
+ transition.subres);*/
715
+ }
716
+
717
+ }
718
+ }
607
719
608
720
std::shared_ptr<TransitionCommandList> Transitions::fix_pretransitions ()
609
721
{
@@ -757,6 +869,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
757
869
}
758
870
759
871
list->CopyBufferRegion (dest->get_native ().Get (), s_dest, source->get_native ().Get (), s_source, size);
872
+ base.create_transition_point (false );
760
873
}
761
874
void CopyContext::copy_resource (Resource* dest, Resource* source)
762
875
{
@@ -767,6 +880,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
767
880
base.transition (dest, Render::ResourceState::COPY_DEST);
768
881
}
769
882
list->CopyResource (dest->get_native ().Get (), source->get_native ().Get ());
883
+ base.create_transition_point (false );
770
884
}
771
885
void CopyContext::copy_resource (const Resource::ptr& dest, const Resource::ptr& source)
772
886
{
@@ -780,6 +894,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
780
894
}
781
895
782
896
list->CopyResource (dest->get_native ().Get (), source->get_native ().Get ());
897
+ base.create_transition_point (false );
783
898
}
784
899
void CopyContext::copy_texture (const Resource::ptr& dest, int dest_subres, const Resource::ptr& source, int source_subres)
785
900
{
@@ -793,6 +908,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
793
908
CD3DX12_TEXTURE_COPY_LOCATION Dst (dest->get_native ().Get (), dest_subres);
794
909
CD3DX12_TEXTURE_COPY_LOCATION Src (source->get_native ().Get (), source_subres);
795
910
list->CopyTextureRegion (&Dst, 0 , 0 , 0 , &Src, nullptr );
911
+ base.create_transition_point (false );
796
912
}
797
913
798
914
void CopyContext::copy_texture ( const Resource::ptr& to, ivec3 to_pos, const Resource::ptr& from, ivec3 from_pos, ivec3 size)
@@ -818,6 +934,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
818
934
box.bottom = from_pos.y + size.y ;
819
935
box.back = from_pos.z + size.z ;
820
936
list->CopyTextureRegion (&Dst, to_pos.x , to_pos.y , to_pos.z , &Src, &box);
937
+ base.create_transition_point (false );
821
938
}
822
939
823
940
@@ -856,7 +973,9 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
856
973
flush_binds ();
857
974
858
975
list->Dispatch (x, y, z);
976
+ base.create_transition_point (false );
859
977
get_base ().print_debug ();
978
+
860
979
}
861
980
862
981
@@ -1048,6 +1167,9 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
1048
1167
if (command_buffer) get_base ().transition (command_buffer, ResourceState::INDIRECT_ARGUMENT);
1049
1168
if (counter_buffer) get_base ().transition (counter_buffer, ResourceState::INDIRECT_ARGUMENT);
1050
1169
1170
+ get_base ().transition (index.resource , ResourceState::INDEX_BUFFER);
1171
+ list->IASetIndexBuffer (&index.view );
1172
+
1051
1173
commit_tables ();
1052
1174
1053
1175
list->ExecuteIndirect (
@@ -1057,7 +1179,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
1057
1179
command_offset,
1058
1180
counter_buffer ? counter_buffer->get_native ().Get () : nullptr ,
1059
1181
counter_offset);
1060
-
1182
+ base. create_transition_point ( false );
1061
1183
get_base ().print_debug ();
1062
1184
}
1063
1185
void ComputeContext::execute_indirect (IndirectCommand& command_types, UINT max_commands, Resource* command_buffer, UINT64 command_offset, Resource* counter_buffer, UINT64 counter_offset)
@@ -1078,7 +1200,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
1078
1200
command_offset,
1079
1201
counter_buffer ? counter_buffer->get_native ().Get () : nullptr ,
1080
1202
counter_offset);
1081
-
1203
+ base. create_transition_point ( false );
1082
1204
get_base ().print_debug ();
1083
1205
}
1084
1206
@@ -1107,6 +1229,8 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
1107
1229
base.transition (build_desc.ScratchAccelerationStructureData .resource , ResourceState::UNORDERED_ACCESS);
1108
1230
commit_tables ();
1109
1231
list->BuildRaytracingAccelerationStructure (&desc, 0 , nullptr );
1232
+
1233
+ base.create_transition_point (false );
1110
1234
}
1111
1235
1112
1236
@@ -1131,6 +1255,8 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
1131
1255
1132
1256
commit_tables ();
1133
1257
list->BuildRaytracingAccelerationStructure (&desc, 0 , nullptr );
1258
+
1259
+ base.create_transition_point (false );
1134
1260
}
1135
1261
void ComputeContext::set_const_buffer (UINT i, const D3D12_GPU_VIRTUAL_ADDRESS& table)
1136
1262
{
@@ -1140,7 +1266,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
1140
1266
{
1141
1267
transition_count = 0 ;
1142
1268
// create_zero_transition();
1143
- create_transition_point ();
1269
+ create_transition_point (false );
1144
1270
}
1145
1271
1146
1272
void Transitions::on_execute ()
0 commit comments