Skip to content

Commit f3cb229

Browse files
committed
prepare for split barriers
forgot to track resource slots
1 parent 40c1c89 commit f3cb229

File tree

8 files changed

+299
-174
lines changed

8 files changed

+299
-174
lines changed

sources/DirectXFramework/DX12/CommandList.cpp

Lines changed: 138 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -100,9 +100,9 @@ namespace DX12
100100

101101
void CommandList::end()
102102
{
103-
create_transition_point();
103+
// create_transition_point(false);
104104
// id = -1;
105-
105+
Transitions::make_split_barriers();
106106
current_pipeline = nullptr;
107107

108108
if (graphics) graphics->end();
@@ -116,6 +116,7 @@ namespace DX12
116116
{
117117
topology = D3D_PRIMITIVE_TOPOLOGY::D3D_PRIMITIVE_TOPOLOGY_UNDEFINED;
118118
reset_tables();
119+
index = IndexBufferView();
119120
}
120121
void GraphicsContext::end()
121122
{
@@ -248,6 +249,8 @@ namespace DX12
248249
get_base().transition_dsv(h.resource_info);
249250

250251
list->OMSetRenderTargets(c, &rt.cpu, true, h.is_valid() ? &h.cpu : nullptr);
252+
253+
base.create_transition_point(false);
251254
}
252255

253256
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)
267270
commit_tables();
268271
flush_binds();
269272
list->DrawInstanced(vertex_count, instance_count, vertex_offset, instance_offset);
273+
base.create_transition_point(false);
274+
270275
get_base().print_debug();
276+
271277
}
272278
void GraphicsContext::draw_indexed(UINT index_count, UINT index_offset, UINT vertex_offset, UINT instance_count, UINT instance_offset)
273279
{
@@ -277,9 +283,12 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
277283
base.setup_debug(this);
278284

279285
commit_tables();
286+
get_base().transition(index.resource, ResourceState::INDEX_BUFFER);
287+
list->IASetIndexBuffer(&index.view);
280288

281289
flush_binds();
282290
list->DrawIndexedInstanced(index_count, instance_count, index_offset, vertex_offset, instance_offset);
291+
base.create_transition_point(false);
283292
get_base().print_debug();
284293
}
285294

@@ -340,6 +349,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
340349
memcpy(info.get_cpu_data(), data, size);
341350
list->CopyBufferRegion(
342351
resource->get_native().Get(), offset, info.resource->get_native().Get(), info.offset, size);
352+
base.create_transition_point(false);
343353
}
344354

345355
D3D12_GPU_VIRTUAL_ADDRESS UploadInfo::get_gpu_address()
@@ -465,6 +475,8 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
465475
Src.PlacedFootprint.Footprint.RowPitch = res_stride;
466476
Src.PlacedFootprint.Footprint.Format = Layouts.Footprint.Format;
467477
list->CopyTextureRegion(&Dst, offset.x, offset.y, offset.z, &Src, nullptr);
478+
479+
base.create_transition_point(false);
468480
}
469481

470482
void GraphicsContext::set_pipeline(PipelineState::ptr state)
@@ -483,11 +495,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
483495
}
484496
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)
485497
{
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+
491499

492500
UINT64 RequiredSize = 0;
493501
D3D12_PLACED_SUBRESOURCE_FOOTPRINT Layouts;
@@ -503,6 +511,12 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
503511
return str.get_future();
504512
}
505513

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);
506520
int res_stride = Math::AlignUp(RowSizesInBytes, D3D12_TEXTURE_DATA_PITCH_ALIGNMENT);
507521
UINT size = res_stride * box.y * box.z;
508522
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)
523537
f(reinterpret_cast<char*>(info.get_cpu_data()), res_stride, res_stride * NumRows, info.resource->get_size());
524538
result->set_value(true);
525539
});
540+
541+
base.create_transition_point(false);
526542
return result->get_future();
527543
}
528544

529545
std::future<bool> CopyContext::read_buffer(Resource* resource, unsigned int offset, UINT64 size, std::function<void(const char*, UINT64)> f)
530546
{
531-
base.create_transition_point();
532547

533548
auto result = std::make_shared<std::promise<bool>>();
534549

@@ -538,7 +553,9 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
538553
result->set_value(true);
539554
return result->get_future();
540555
}
541-
556+
557+
base.create_transition_point();
558+
542559
base.transition(resource, Render::ResourceState::COPY_SOURCE);
543560

544561
// auto size = resource->get_size();
@@ -550,6 +567,8 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
550567
f(reinterpret_cast<char*>(info.get_cpu_data()), size);
551568
result->set_value(true);
552569
});
570+
571+
base.create_transition_point(false);
553572
return result->get_future();
554573
}
555574

@@ -604,6 +623,99 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
604623
Device::get().context_generator.free(this);
605624

606625
}
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+
}
607719

608720
std::shared_ptr<TransitionCommandList> Transitions::fix_pretransitions()
609721
{
@@ -757,6 +869,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
757869
}
758870

759871
list->CopyBufferRegion(dest->get_native().Get(), s_dest, source->get_native().Get(), s_source, size);
872+
base.create_transition_point(false);
760873
}
761874
void CopyContext::copy_resource(Resource* dest, Resource* source)
762875
{
@@ -767,6 +880,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
767880
base.transition(dest, Render::ResourceState::COPY_DEST);
768881
}
769882
list->CopyResource(dest->get_native().Get(), source->get_native().Get());
883+
base.create_transition_point(false);
770884
}
771885
void CopyContext::copy_resource(const Resource::ptr& dest, const Resource::ptr& source)
772886
{
@@ -780,6 +894,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
780894
}
781895

782896
list->CopyResource(dest->get_native().Get(), source->get_native().Get());
897+
base.create_transition_point(false);
783898
}
784899
void CopyContext::copy_texture(const Resource::ptr& dest, int dest_subres, const Resource::ptr& source, int source_subres)
785900
{
@@ -793,6 +908,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
793908
CD3DX12_TEXTURE_COPY_LOCATION Dst(dest->get_native().Get(), dest_subres);
794909
CD3DX12_TEXTURE_COPY_LOCATION Src(source->get_native().Get(), source_subres);
795910
list->CopyTextureRegion(&Dst, 0, 0, 0, &Src, nullptr);
911+
base.create_transition_point(false);
796912
}
797913

798914
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)
818934
box.bottom = from_pos.y + size.y;
819935
box.back = from_pos.z + size.z;
820936
list->CopyTextureRegion(&Dst, to_pos.x, to_pos.y, to_pos.z, &Src, &box);
937+
base.create_transition_point(false);
821938
}
822939

823940

@@ -856,7 +973,9 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
856973
flush_binds();
857974

858975
list->Dispatch(x, y, z);
976+
base.create_transition_point(false);
859977
get_base().print_debug();
978+
860979
}
861980

862981

@@ -1048,6 +1167,9 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
10481167
if (command_buffer) get_base().transition(command_buffer, ResourceState::INDIRECT_ARGUMENT);
10491168
if (counter_buffer) get_base().transition(counter_buffer, ResourceState::INDIRECT_ARGUMENT);
10501169

1170+
get_base().transition(index.resource, ResourceState::INDEX_BUFFER);
1171+
list->IASetIndexBuffer(&index.view);
1172+
10511173
commit_tables();
10521174

10531175
list->ExecuteIndirect(
@@ -1057,7 +1179,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
10571179
command_offset,
10581180
counter_buffer ? counter_buffer->get_native().Get() : nullptr,
10591181
counter_offset);
1060-
1182+
base.create_transition_point(false);
10611183
get_base().print_debug();
10621184
}
10631185
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)
10781200
command_offset,
10791201
counter_buffer ? counter_buffer->get_native().Get() : nullptr,
10801202
counter_offset);
1081-
1203+
base.create_transition_point(false);
10821204
get_base().print_debug();
10831205
}
10841206

@@ -1107,6 +1229,8 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
11071229
base.transition(build_desc.ScratchAccelerationStructureData.resource, ResourceState::UNORDERED_ACCESS);
11081230
commit_tables();
11091231
list->BuildRaytracingAccelerationStructure(&desc, 0, nullptr);
1232+
1233+
base.create_transition_point(false);
11101234
}
11111235

11121236

@@ -1131,6 +1255,8 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
11311255

11321256
commit_tables();
11331257
list->BuildRaytracingAccelerationStructure(&desc, 0, nullptr);
1258+
1259+
base.create_transition_point(false);
11341260
}
11351261
void ComputeContext::set_const_buffer(UINT i, const D3D12_GPU_VIRTUAL_ADDRESS& table)
11361262
{
@@ -1140,7 +1266,7 @@ void GraphicsContext::set_rtv(std::initializer_list<Handle> rt, Handle h)
11401266
{
11411267
transition_count = 0;
11421268
// create_zero_transition();
1143-
create_transition_point();
1269+
create_transition_point(false);
11441270
}
11451271

11461272
void Transitions::on_execute()

0 commit comments

Comments
 (0)