fix dx12 global barriers

This commit is contained in:
jacob 2025-12-16 18:43:42 -06:00
parent 2144de02a0
commit 0efcc35696
4 changed files with 23 additions and 11 deletions

View File

@ -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) \ #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, \ .is_global = 1, \
.stage_prev = _stage_prev, \ .stage_prev = _stage_prev, \
.access_prev = _access_prev, \ .access_prev = _access_prev, \

View File

@ -1876,20 +1876,25 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle)
if (barrier_cmd->kind == G_D12_CmdKind_Barrier) if (barrier_cmd->kind == G_D12_CmdKind_Barrier)
{ {
G_MemoryBarrierDesc desc = barrier_cmd->barrier.desc; 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 */ /* Translate gpu barrier kind -> d3d barrier fields */
D3D12_BARRIER_SYNC sync_before = G_D12_BarrierSyncFromStages(desc.stage_prev); D3D12_BARRIER_SYNC sync_before = G_D12_BarrierSyncFromStages(desc.stage_prev);
D3D12_BARRIER_SYNC sync_after = G_D12_BarrierSyncFromStages(desc.stage_next); 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_before = G_D12_BarrierAccessFromAccesses(desc.access_prev);
D3D12_BARRIER_ACCESS access_after = G_D12_BarrierAccessFromAccesses(desc.access_next); D3D12_BARRIER_ACCESS access_after = G_D12_BarrierAccessFromAccesses(desc.access_next);
D3D12_BARRIER_LAYOUT layout_before = resource->texture_layout; D3D12_BARRIER_LAYOUT layout_before = D3D12_BARRIER_LAYOUT_UNDEFINED;
D3D12_BARRIER_LAYOUT layout_after = resource->texture_layout; D3D12_BARRIER_LAYOUT layout_after = D3D12_BARRIER_LAYOUT_UNDEFINED;
if (desc.layout != G_Layout_NoChange) D3D12_BARRIER_TYPE barrier_type = D3D12_BARRIER_TYPE_GLOBAL;
if (!desc.is_global)
{ {
layout_after = G_D12_BarrierLayoutFromLayout(desc.layout); G_D12_Resource *resource = G_D12_ResourceFromHandle(desc.resource);
resource->texture_layout = layout_after; 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 */ /* Build barrier */
@ -1897,6 +1902,7 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle)
{ {
case D3D12_BARRIER_TYPE_BUFFER: case D3D12_BARRIER_TYPE_BUFFER:
{ {
G_D12_Resource *resource = G_D12_ResourceFromHandle(desc.resource);
D3D12_BUFFER_BARRIER *barrier = &buffer_barriers[buffer_barriers_count++]; D3D12_BUFFER_BARRIER *barrier = &buffer_barriers[buffer_barriers_count++];
barrier->SyncBefore = sync_before; barrier->SyncBefore = sync_before;
barrier->SyncAfter = sync_after; barrier->SyncAfter = sync_after;
@ -1909,6 +1915,7 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle)
case D3D12_BARRIER_TYPE_TEXTURE: case D3D12_BARRIER_TYPE_TEXTURE:
{ {
G_D12_Resource *resource = G_D12_ResourceFromHandle(desc.resource);
D3D12_TEXTURE_BARRIER *barrier = &texture_barriers[texture_barriers_count++]; D3D12_TEXTURE_BARRIER *barrier = &texture_barriers[texture_barriers_count++];
barrier->SyncBefore = sync_before; barrier->SyncBefore = sync_before;
barrier->SyncAfter = sync_after; barrier->SyncAfter = sync_after;

View File

@ -602,6 +602,8 @@ void V_TickForever(WaveLaneCtx *lane)
); );
G_Texture2DRef draw_target_ro = G_PushTexture2DRef(frame->gpu_arena, draw_target); G_Texture2DRef draw_target_ro = G_PushTexture2DRef(frame->gpu_arena, draw_target);
G_RWTexture2DRef draw_target_rw = G_PushRWTexture2DRef(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 */ /* Verts */
G_ResourceHandle dverts_buff = G_PushBufferFromString(frame->gpu_arena, frame->cl, StringFromArena(frame->dverts_arena)); 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 */ /* Constants */
G_SetConstant(frame->cl, V_ShaderConst_Params, params_ro); G_SetConstant(frame->cl, V_ShaderConst_Params, params_ro);
Rng3 viewport = RNG3(VEC3(0, 0, 0), VEC3(draw_size.x, draw_size.y, 1)); /* Sync */
Rng2 scissor = RNG2(VEC2(viewport.p0.x, viewport.p0.y), VEC2(viewport.p1.x, viewport.p1.y)); G_DumbGlobalMemorySync(frame->cl);
////////////////////////////// //////////////////////////////
//- Backdrop pass //- Backdrop pass

View File

@ -1395,6 +1395,9 @@ void UI_EndFrame(UI_Frame *frame)
/* Constants */ /* Constants */
G_SetConstant(frame->cl, UI_ShaderConst_Params, params_ro); G_SetConstant(frame->cl, UI_ShaderConst_Params, params_ro);
/* Sync */
G_DumbGlobalMemorySync(frame->cl);
////////////////////////////// //////////////////////////////
//- Dispatch shaders //- Dispatch shaders