From 0efcc356968d8ae856af6c19e9a5079f357ec7c7 Mon Sep 17 00:00:00 2001 From: jacob Date: Tue, 16 Dec 2025 18:43:42 -0600 Subject: [PATCH] fix dx12 global barriers --- src/gpu/gpu_core.h | 2 +- src/gpu/gpu_dx12/gpu_dx12_core.c | 23 +++++++++++++++-------- src/pp/pp_vis/pp_vis_core.c | 6 ++++-- src/ui/ui_core.c | 3 +++ 4 files changed, 23 insertions(+), 11 deletions(-) diff --git a/src/gpu/gpu_core.h b/src/gpu/gpu_core.h index b3e0e63c..017bce9b 100644 --- a/src/gpu/gpu_core.h +++ b/src/gpu/gpu_core.h @@ -719,7 +719,7 @@ void G_MemorySyncEx(G_CommandListHandle cl, G_MemoryBarrierDesc desc); }) #define G_GlobalMemorySync(_cl, _stage_prev, _access_prev, _stage_next, _access_next) \ - G_MemorySync((_cl), (G_MemoryBarrierDesc) { \ + G_MemorySyncEx((_cl), (G_MemoryBarrierDesc) { \ .is_global = 1, \ .stage_prev = _stage_prev, \ .access_prev = _access_prev, \ diff --git a/src/gpu/gpu_dx12/gpu_dx12_core.c b/src/gpu/gpu_dx12/gpu_dx12_core.c index 8d26ec1a..c485338d 100644 --- a/src/gpu/gpu_dx12/gpu_dx12_core.c +++ b/src/gpu/gpu_dx12/gpu_dx12_core.c @@ -1876,20 +1876,25 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle) if (barrier_cmd->kind == G_D12_CmdKind_Barrier) { G_MemoryBarrierDesc desc = barrier_cmd->barrier.desc; - G_D12_Resource *resource = G_D12_ResourceFromHandle(desc.resource); - D3D12_BARRIER_TYPE barrier_type = resource->is_texture ? D3D12_BARRIER_TYPE_TEXTURE : D3D12_BARRIER_TYPE_BUFFER; - /* Translate gpu barrier kind -> d3d barrier fields */ D3D12_BARRIER_SYNC sync_before = G_D12_BarrierSyncFromStages(desc.stage_prev); D3D12_BARRIER_SYNC sync_after = G_D12_BarrierSyncFromStages(desc.stage_next); D3D12_BARRIER_ACCESS access_before = G_D12_BarrierAccessFromAccesses(desc.access_prev); D3D12_BARRIER_ACCESS access_after = G_D12_BarrierAccessFromAccesses(desc.access_next); - D3D12_BARRIER_LAYOUT layout_before = resource->texture_layout; - D3D12_BARRIER_LAYOUT layout_after = resource->texture_layout; - if (desc.layout != G_Layout_NoChange) + D3D12_BARRIER_LAYOUT layout_before = D3D12_BARRIER_LAYOUT_UNDEFINED; + D3D12_BARRIER_LAYOUT layout_after = D3D12_BARRIER_LAYOUT_UNDEFINED; + D3D12_BARRIER_TYPE barrier_type = D3D12_BARRIER_TYPE_GLOBAL; + if (!desc.is_global) { - layout_after = G_D12_BarrierLayoutFromLayout(desc.layout); - resource->texture_layout = layout_after; + G_D12_Resource *resource = G_D12_ResourceFromHandle(desc.resource); + barrier_type = resource->is_texture ? D3D12_BARRIER_TYPE_TEXTURE : D3D12_BARRIER_TYPE_BUFFER; + layout_before = resource->texture_layout; + layout_after = resource->texture_layout; + if (desc.layout != G_Layout_NoChange) + { + layout_after = G_D12_BarrierLayoutFromLayout(desc.layout); + resource->texture_layout = layout_after; + } } /* Build barrier */ @@ -1897,6 +1902,7 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle) { case D3D12_BARRIER_TYPE_BUFFER: { + G_D12_Resource *resource = G_D12_ResourceFromHandle(desc.resource); D3D12_BUFFER_BARRIER *barrier = &buffer_barriers[buffer_barriers_count++]; barrier->SyncBefore = sync_before; barrier->SyncAfter = sync_after; @@ -1909,6 +1915,7 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle) case D3D12_BARRIER_TYPE_TEXTURE: { + G_D12_Resource *resource = G_D12_ResourceFromHandle(desc.resource); D3D12_TEXTURE_BARRIER *barrier = &texture_barriers[texture_barriers_count++]; barrier->SyncBefore = sync_before; barrier->SyncAfter = sync_after; diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index e5ce0e24..88fd0bac 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -602,6 +602,8 @@ void V_TickForever(WaveLaneCtx *lane) ); G_Texture2DRef draw_target_ro = G_PushTexture2DRef(frame->gpu_arena, draw_target); G_RWTexture2DRef draw_target_rw = G_PushRWTexture2DRef(frame->gpu_arena, draw_target); + Rng3 viewport = RNG3(VEC3(0, 0, 0), VEC3(draw_size.x, draw_size.y, 1)); + Rng2 scissor = RNG2(VEC2(viewport.p0.x, viewport.p0.y), VEC2(viewport.p1.x, viewport.p1.y)); /* Verts */ G_ResourceHandle dverts_buff = G_PushBufferFromString(frame->gpu_arena, frame->cl, StringFromArena(frame->dverts_arena)); @@ -630,8 +632,8 @@ void V_TickForever(WaveLaneCtx *lane) /* Constants */ G_SetConstant(frame->cl, V_ShaderConst_Params, params_ro); - Rng3 viewport = RNG3(VEC3(0, 0, 0), VEC3(draw_size.x, draw_size.y, 1)); - Rng2 scissor = RNG2(VEC2(viewport.p0.x, viewport.p0.y), VEC2(viewport.p1.x, viewport.p1.y)); + /* Sync */ + G_DumbGlobalMemorySync(frame->cl); ////////////////////////////// //- Backdrop pass diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index 3b225fc3..3d4cfbee 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -1395,6 +1395,9 @@ void UI_EndFrame(UI_Frame *frame) /* Constants */ G_SetConstant(frame->cl, UI_ShaderConst_Params, params_ro); + /* Sync */ + G_DumbGlobalMemorySync(frame->cl); + ////////////////////////////// //- Dispatch shaders