remove double-buffered pp/ui command list handles

This commit is contained in:
jacob 2026-02-26 15:33:00 -06:00
parent aaad2cb838
commit 3061bba8e0
5 changed files with 119 additions and 107 deletions

View File

@ -629,21 +629,21 @@ u32 G_PushRef(G_ArenaHandle arena, G_ResourceHandle resource, G_RefDesc desc);
#define G_PushTexture1DRef(arena, resource, ...) (G_Texture1DRef) { \ #define G_PushTexture1DRef(arena, resource, ...) (G_Texture1DRef) { \
.v = G_PushRef( \ .v = G_PushRef( \
(arena), (resource), \ (arena), (resource), \
(G_RefDesc) { .kind = G_RefKind_Texture1D, .mips.max = 64, __VA_ARGS__ } \ (G_RefDesc) { .kind = G_RefKind_Texture1D, .mips.max = G_MaxMips, __VA_ARGS__ } \
) \ ) \
} }
#define G_PushTexture2DRef(arena, resource, ...) (G_Texture2DRef) { \ #define G_PushTexture2DRef(arena, resource, ...) (G_Texture2DRef) { \
.v = G_PushRef( \ .v = G_PushRef( \
(arena), (resource), \ (arena), (resource), \
(G_RefDesc) { .kind = G_RefKind_Texture2D, .mips.max = 64, __VA_ARGS__ } \ (G_RefDesc) { .kind = G_RefKind_Texture2D, .mips.max = G_MaxMips, __VA_ARGS__ } \
) \ ) \
} }
#define G_PushTexture3DRef(arena, resource, ...) (G_Texture3DRef) { \ #define G_PushTexture3DRef(arena, resource, ...) (G_Texture3DRef) { \
.v = G_PushRef( \ .v = G_PushRef( \
(arena), (resource), \ (arena), (resource), \
(G_RefDesc) { .kind = G_RefKind_Texture3D, .mips.max = 64, __VA_ARGS__ } \ (G_RefDesc) { .kind = G_RefKind_Texture3D, .mips.max = G_MaxMips, __VA_ARGS__ } \
) \ ) \
} }
@ -695,7 +695,7 @@ void G_MemorySyncEx(G_CommandListHandle cl, G_MemoryBarrierDesc desc);
.access_prev = _access_prev, \ .access_prev = _access_prev, \
.stage_next = _stage_next, \ .stage_next = _stage_next, \
.access_next = _access_next, \ .access_next = _access_next, \
.mips.max = 64, \ .mips.max = G_MaxMips, \
__VA_ARGS__ \ __VA_ARGS__ \
}) })
@ -707,7 +707,7 @@ void G_MemorySyncEx(G_CommandListHandle cl, G_MemoryBarrierDesc desc);
.stage_next = _stage_next, \ .stage_next = _stage_next, \
.access_next = _access_next, \ .access_next = _access_next, \
.layout = _layout, \ .layout = _layout, \
.mips.max = 64, \ .mips.max = G_MaxMips, \
__VA_ARGS__ \ __VA_ARGS__ \
}) })
@ -718,7 +718,7 @@ void G_MemorySyncEx(G_CommandListHandle cl, G_MemoryBarrierDesc desc);
.access_prev = _access_prev, \ .access_prev = _access_prev, \
.stage_next = _stage_next, \ .stage_next = _stage_next, \
.access_next = _access_next, \ .access_next = _access_next, \
.mips.max = 64, \ .mips.max = G_MaxMips, \
__VA_ARGS__ \ __VA_ARGS__ \
}) })

View File

@ -20,12 +20,12 @@ void V_Shutdown(void)
V_Frame *V_CurrentFrame(void) V_Frame *V_CurrentFrame(void)
{ {
return &V.frames[V.current_frame_tick % countof(V.frames)]; return &V.frames[V.cur_frame_tick % countof(V.frames)];
} }
V_Frame *V_PrevFrame(void) V_Frame *V_PrevFrame(void)
{ {
return &V.frames[(V.current_frame_tick - 1) % countof(V.frames)]; return &V.frames[(V.cur_frame_tick - 1) % countof(V.frames)];
} }
V_Cmd *V_PushVisCmd(String name) V_Cmd *V_PushVisCmd(String name)
@ -362,7 +362,13 @@ void V_TickForever(WaveLaneCtx *lane)
P_SimStatistics sim_stats = Zi; P_SimStatistics sim_stats = Zi;
P_World *sim_world = P_AcquireWorld(); P_World *sim_world = P_AcquireWorld();
P_World *predict_world = P_AcquireWorld();
i64 cur_predict_world_seq = 0;
P_World *predict_worlds[2] = Zi;
for (i64 predict_world_idx = 0; predict_world_idx < countof(predict_worlds); ++predict_world_idx)
{
predict_worlds[predict_world_idx] = P_AcquireWorld();
}
i64 local_controls_cap = NextPow2U64(SIM_MAX_PING * SIM_TICKS_PER_SECOND); i64 local_controls_cap = NextPow2U64(SIM_MAX_PING * SIM_TICKS_PER_SECOND);
P_Control *local_controls = PushStructs(perm, P_Control, local_controls_cap); P_Control *local_controls = PushStructs(perm, P_Control, local_controls_cap);
@ -378,6 +384,7 @@ void V_TickForever(WaveLaneCtx *lane)
i64 ack = 0; i64 ack = 0;
i64 ack_mirror = 0; i64 ack_mirror = 0;
i64 ack_received_at_ns = 0; i64 ack_received_at_ns = 0;
i64 ack_dt_ns = 0;
f64 most_recent_rtt = 0; f64 most_recent_rtt = 0;
// i64 smoothed_rtt_ns = 0; // i64 smoothed_rtt_ns = 0;
@ -569,7 +576,7 @@ void V_TickForever(WaveLaneCtx *lane)
////////////////////////////// //////////////////////////////
//- Begin frame //- Begin frame
V.current_frame_tick += 1; V.cur_frame_tick += 1;
V_Frame *prev_frame = V_PrevFrame(); V_Frame *prev_frame = V_PrevFrame();
V_Frame *frame = V_CurrentFrame(); V_Frame *frame = V_CurrentFrame();
@ -586,12 +593,12 @@ void V_TickForever(WaveLaneCtx *lane)
frame->dvert_idxs_arena = old_dvert_idxs_arena; frame->dvert_idxs_arena = old_dvert_idxs_arena;
frame->local_world = old_local_world; frame->local_world = old_local_world;
} }
frame->cl = G_PrepareCommandList(G_QueueKind_Direct); G_CommandListHandle cl = G_PrepareCommandList(G_QueueKind_Direct);
ResetArena(frame->arena); ResetArena(frame->arena);
ResetArena(frame->quads_arena); ResetArena(frame->quads_arena);
ResetArena(frame->dverts_arena); ResetArena(frame->dverts_arena);
ResetArena(frame->dvert_idxs_arena); ResetArena(frame->dvert_idxs_arena);
G_ResetArena(frame->cl, gpu_frame_arena); G_ResetArena(cl, gpu_frame_arena);
// Persist state // Persist state
CopyBytes(frame->held_buttons, prev_frame->held_buttons, sizeof(frame->held_buttons)); CopyBytes(frame->held_buttons, prev_frame->held_buttons, sizeof(frame->held_buttons));
@ -612,7 +619,7 @@ void V_TickForever(WaveLaneCtx *lane)
frame->predict_tick_accum = prev_frame->predict_tick_accum; frame->predict_tick_accum = prev_frame->predict_tick_accum;
frame->af = prev_frame->af; frame->af = prev_frame->af;
frame->tick = V.current_frame_tick; frame->tick = V.cur_frame_tick;
frame->time_ns = TimeNs(); frame->time_ns = TimeNs();
frame->dt_ns = ClampI64(frame->time_ns - prev_frame->time_ns, 1, NsFromSeconds(1.0 / 50)); frame->dt_ns = ClampI64(frame->time_ns - prev_frame->time_ns, 1, NsFromSeconds(1.0 / 50));
frame->dt = SecondsFromNs(frame->dt_ns); frame->dt = SecondsFromNs(frame->dt_ns);
@ -1293,6 +1300,7 @@ void V_TickForever(WaveLaneCtx *lane)
if (dst_frame->received_fragments_count >= dst_frame->fragments_count) if (dst_frame->received_fragments_count >= dst_frame->fragments_count)
{ {
ack = dst_tick; ack = dst_tick;
ack_dt_ns = ack_received_at_ns - frame->time_ns;
ack_received_at_ns = frame->time_ns; ack_received_at_ns = frame->time_ns;
} }
} }
@ -1626,6 +1634,7 @@ void V_TickForever(WaveLaneCtx *lane)
// Predict // Predict
P_World *predict_world = predict_worlds[cur_predict_world_seq % countof(predict_worlds)];
P_Frame *predict_frame = predict_world->last_frame; P_Frame *predict_frame = predict_world->last_frame;
{ {
if (predict_world->tiles_hash != sim_world->tiles_hash) if (predict_world->tiles_hash != sim_world->tiles_hash)
@ -5002,7 +5011,7 @@ void V_TickForever(WaveLaneCtx *lane)
{ {
// LogDebugF("Uploading tiles to gpu"); // LogDebugF("Uploading tiles to gpu");
G_CopyCpuToTexture( G_CopyCpuToTexture(
frame->cl, cl,
gpu_tiles_res, VEC3I32(0, 0, 0), gpu_tiles_res, VEC3I32(0, 0, 0),
frame->local_world->tiles, VEC3I32(tiles_dims.x, tiles_dims.y, 1), frame->local_world->tiles, VEC3I32(tiles_dims.x, tiles_dims.y, 1),
RNG3I32(VEC3I32(0, 0, 0), VEC3I32(tiles_dims.x, tiles_dims.y, 1)) RNG3I32(VEC3I32(0, 0, 0), VEC3I32(tiles_dims.x, tiles_dims.y, 1))
@ -5011,7 +5020,7 @@ void V_TickForever(WaveLaneCtx *lane)
// Screen texture // Screen texture
G_ResourceHandle screen_target = G_PushTexture2D( G_ResourceHandle screen_target = G_PushTexture2D(
gpu_frame_arena, frame->cl, gpu_frame_arena, cl,
G_Format_R16G16B16A16_Float, G_Format_R16G16B16A16_Float,
frame->screen_dims, frame->screen_dims,
G_Layout_DirectQueue_General, G_Layout_DirectQueue_General,
@ -5022,24 +5031,9 @@ void V_TickForever(WaveLaneCtx *lane)
Rng2 screen_scissor = RNG2(VEC2(screen_viewport.p0.x, screen_viewport.p0.y), VEC2(screen_viewport.p1.x, screen_viewport.p1.y)); Rng2 screen_scissor = RNG2(VEC2(screen_viewport.p0.x, screen_viewport.p0.y), VEC2(screen_viewport.p1.x, screen_viewport.p1.y));
frame->screen = G_PushTexture2DRef(gpu_frame_arena, screen_target); frame->screen = G_PushTexture2DRef(gpu_frame_arena, screen_target);
// Bloom texture
G_ResourceHandle bloom_target = G_PushTexture2D(
gpu_frame_arena, frame->cl,
G_Format_R16G16B16A16_Float,
G_DimsFromMip2D(G_Count2D(screen_target), 1),
G_Layout_DirectQueue_General,
.flags = G_ResourceFlag_AllowShaderReadWrite,
.name = StringF(frame->arena, "Bloom target [%F]", FmtSint(frame->tick)),
.max_mips = 64
);
for (i32 mip_idx = 0; mip_idx < G_CountMips(bloom_target); ++mip_idx)
{
frame->bloom_mips[mip_idx] = G_PushTexture2DRef(gpu_frame_arena, bloom_target, .mips = RNGI32(mip_idx, mip_idx));
}
// Albedo texture // Albedo texture
G_ResourceHandle albedo_target = G_PushTexture2D( G_ResourceHandle albedo_target = G_PushTexture2D(
gpu_frame_arena, frame->cl, gpu_frame_arena, cl,
G_Format_R16G16B16A16_Float, G_Format_R16G16B16A16_Float,
frame->screen_dims, frame->screen_dims,
G_Layout_DirectQueue_RenderTarget, G_Layout_DirectQueue_RenderTarget,
@ -5050,7 +5044,7 @@ void V_TickForever(WaveLaneCtx *lane)
// Backdrop texture // Backdrop texture
G_ResourceHandle backdrop_target = G_PushTexture2D( G_ResourceHandle backdrop_target = G_PushTexture2D(
gpu_frame_arena, frame->cl, gpu_frame_arena, cl,
G_Format_R16G16B16A16_Float, G_Format_R16G16B16A16_Float,
G_DimsFromMip2D(G_Count2D(screen_target), 1), G_DimsFromMip2D(G_Count2D(screen_target), 1),
G_Layout_DirectQueue_General, G_Layout_DirectQueue_General,
@ -5058,14 +5052,30 @@ void V_TickForever(WaveLaneCtx *lane)
.name = StringF(frame->arena, "Backdrop target [%F]", FmtSint(frame->tick)), .name = StringF(frame->arena, "Backdrop target [%F]", FmtSint(frame->tick)),
.max_mips = 4 .max_mips = 4
); );
for (i32 mip_idx = 0; mip_idx < G_CountMips(bloom_target); ++mip_idx) for (i32 mip_idx = 0; mip_idx < G_CountMips(backdrop_target); ++mip_idx)
{ {
frame->backdrop_mips[mip_idx] = G_PushTexture2DRef(gpu_frame_arena, backdrop_target, .mips = RNGI32(mip_idx, mip_idx)); frame->backdrop_mips[mip_idx] = G_PushTexture2DRef(gpu_frame_arena, backdrop_target, .mips = RNGI32(mip_idx, mip_idx));
} }
// Bloom texture
// TODO: We can re-use backdrop mip chain for this
G_ResourceHandle bloom_target = G_PushTexture2D(
gpu_frame_arena, cl,
G_Format_R16G16B16A16_Float,
G_DimsFromMip2D(G_Count2D(screen_target), 1),
G_Layout_DirectQueue_General,
.flags = G_ResourceFlag_AllowShaderReadWrite,
.name = StringF(frame->arena, "Bloom target [%F]", FmtSint(frame->tick)),
.max_mips = G_MaxMips
);
for (i32 mip_idx = 0; mip_idx < G_CountMips(bloom_target); ++mip_idx)
{
frame->bloom_mips[mip_idx] = G_PushTexture2DRef(gpu_frame_arena, bloom_target, .mips = RNGI32(mip_idx, mip_idx));
}
// Shade texture // Shade texture
G_ResourceHandle shade_target = G_PushTexture2D( G_ResourceHandle shade_target = G_PushTexture2D(
gpu_frame_arena, frame->cl, gpu_frame_arena, cl,
G_Format_R16G16B16A16_Float, G_Format_R16G16B16A16_Float,
frame->shade_dims, frame->shade_dims,
G_Layout_DirectQueue_General, G_Layout_DirectQueue_General,
@ -5078,7 +5088,7 @@ void V_TickForever(WaveLaneCtx *lane)
// Quad buffers // Quad buffers
G_ResourceHandle quads_buff = G_PushBufferFromCpuCopy( G_ResourceHandle quads_buff = G_PushBufferFromCpuCopy(
gpu_frame_arena, frame->cl, gpu_frame_arena, cl,
StringFromArena(frame->quads_arena), StringFromArena(frame->quads_arena),
.name = StringF(frame->arena, "quads [%F]", FmtSint(frame->tick)) .name = StringF(frame->arena, "quads [%F]", FmtSint(frame->tick))
); );
@ -5086,12 +5096,12 @@ void V_TickForever(WaveLaneCtx *lane)
// Debug shape buffers // Debug shape buffers
G_ResourceHandle dverts_buff = G_PushBufferFromCpuCopy( G_ResourceHandle dverts_buff = G_PushBufferFromCpuCopy(
gpu_frame_arena, frame->cl, gpu_frame_arena, cl,
StringFromArena(frame->dverts_arena), StringFromArena(frame->dverts_arena),
.name = StringF(frame->arena, "dverts [%F]", FmtSint(frame->tick)) .name = StringF(frame->arena, "dverts [%F]", FmtSint(frame->tick))
); );
G_ResourceHandle dvert_idxs_buff = G_PushBufferFromCpuCopy( G_ResourceHandle dvert_idxs_buff = G_PushBufferFromCpuCopy(
gpu_frame_arena, frame->cl, gpu_frame_arena, cl,
StringFromArena(frame->dvert_idxs_arena), StringFromArena(frame->dvert_idxs_arena),
.name = StringF(frame->arena, "dvert idxs [%F]", FmtSint(frame->tick)) .name = StringF(frame->arena, "dvert idxs [%F]", FmtSint(frame->tick))
); );
@ -5112,7 +5122,7 @@ void V_TickForever(WaveLaneCtx *lane)
} }
} }
gpu_emitters = G_PushBufferFromCpuCopy( gpu_emitters = G_PushBufferFromCpuCopy(
gpu_frame_arena, frame->cl, gpu_frame_arena, cl,
StringFromStructs(flattened_emitters, frame->emitters_count), StringFromStructs(flattened_emitters, frame->emitters_count),
.name = StringF(frame->arena, "emitters [%F]", FmtSint(frame->tick)) .name = StringF(frame->arena, "emitters [%F]", FmtSint(frame->tick))
); );
@ -5121,7 +5131,7 @@ void V_TickForever(WaveLaneCtx *lane)
// Upload gpu frame // Upload gpu frame
G_ResourceHandle gpu_frame_res = G_PushBufferFromCpuCopy( G_ResourceHandle gpu_frame_res = G_PushBufferFromCpuCopy(
gpu_frame_arena, frame->cl, gpu_frame_arena, cl,
StringFromStruct(&frame->shared_frame), StringFromStruct(&frame->shared_frame),
.name = StringF(frame->arena, "Gpu frame [%F]", FmtSint(frame->tick)) .name = StringF(frame->arena, "Gpu frame [%F]", FmtSint(frame->tick))
); );
@ -5129,44 +5139,44 @@ void V_TickForever(WaveLaneCtx *lane)
// Set initial constants // Set initial constants
V_GpuFlag gpu_flags = V_GpuFlag_None; V_GpuFlag gpu_flags = V_GpuFlag_None;
G_SetConstant(frame->cl, V_GpuConst_Flags, gpu_flags); G_SetConstant(cl, V_GpuConst_Flags, gpu_flags);
G_SetConstant(frame->cl, V_GpuConst_Frame, gpu_frame); G_SetConstant(cl, V_GpuConst_Frame, gpu_frame);
G_SetConstant(frame->cl, V_GpuConst_NoiseTex, G_BasicNoiseTexture()); G_SetConstant(cl, V_GpuConst_NoiseTex, G_BasicNoiseTexture());
// Sync // Sync
G_DumbGlobalMemorySync(frame->cl); G_DumbGlobalMemorySync(cl);
////////////////////////////// //////////////////////////////
//- Initialization pass //- Initialization pass
{ {
// Prepare shade // Prepare shade
G_Compute(frame->cl, V_PrepareShadeCS, V_ThreadGroupSizeFromTexSize(frame->shade_dims)); G_Compute(cl, V_PrepareShadeCS, V_ThreadGroupSizeFromTexSize(frame->shade_dims));
// Prepare cells // Prepare cells
G_Compute(frame->cl, V_PrepareCellsCS, V_ThreadGroupSizeFromTexSize(cells_dims)); G_Compute(cl, V_PrepareCellsCS, V_ThreadGroupSizeFromTexSize(cells_dims));
// Clear particles // Clear particles
if (frame->should_clear_particles) if (frame->should_clear_particles)
{ {
G_Compute(frame->cl, V_ClearParticlesCS, V_ThreadGroupSizeFromBufferSize(V_ParticlesCap)); G_Compute(cl, V_ClearParticlesCS, V_ThreadGroupSizeFromBufferSize(V_ParticlesCap));
V.particle_seq = 0; V.particle_seq = 0;
} }
// Backdrop passes // Backdrop passes
{ {
i32 mips_count = G_CountMips(backdrop_target); i32 mips_count = G_CountMips(backdrop_target);
G_SetConstant(frame->cl, V_GpuConst_MipsCount, mips_count); G_SetConstant(cl, V_GpuConst_MipsCount, mips_count);
//- Downsample //- Downsample
for (i32 mip_idx = 0; mip_idx < mips_count; ++mip_idx) for (i32 mip_idx = 0; mip_idx < mips_count; ++mip_idx)
{ {
Vec2I32 down_dims = G_DimsFromMip2D(G_Count2D(backdrop_target), mip_idx); Vec2I32 down_dims = G_DimsFromMip2D(G_Count2D(backdrop_target), mip_idx);
G_SetConstant(frame->cl, V_GpuConst_MipIdx, mip_idx); G_SetConstant(cl, V_GpuConst_MipIdx, mip_idx);
G_Compute(frame->cl, V_BackdropDownCS, V_ThreadGroupSizeFromTexSize(down_dims)); G_Compute(cl, V_BackdropDownCS, V_ThreadGroupSizeFromTexSize(down_dims));
G_DumbGlobalMemorySync(frame->cl); G_DumbGlobalMemorySync(cl);
} }
//- Upsample passes //- Upsample passes
@ -5174,24 +5184,25 @@ void V_TickForever(WaveLaneCtx *lane)
{ {
Vec2I32 up_dims = G_DimsFromMip2D(G_Count2D(backdrop_target), mip_idx); Vec2I32 up_dims = G_DimsFromMip2D(G_Count2D(backdrop_target), mip_idx);
G_SetConstant(frame->cl, V_GpuConst_MipIdx, mip_idx); G_SetConstant(cl, V_GpuConst_MipIdx, mip_idx);
G_Compute(frame->cl, V_BackdropUpCS, V_ThreadGroupSizeFromTexSize(up_dims)); G_Compute(cl, V_BackdropUpCS, V_ThreadGroupSizeFromTexSize(up_dims));
G_DumbGlobalMemorySync(frame->cl); G_DumbGlobalMemorySync(cl);
} }
} }
// Prepare RTs G_DumbGlobalMemorySync(cl);
G_ClearRenderTarget(frame->cl, albedo_target, VEC4(0, 0, 0, 0), 0);
} }
////////////////////////////// //////////////////////////////
//- Quads & emitters pass //- Quads & emitters pass
{ {
G_ClearRenderTarget(cl, albedo_target, VEC4(0, 0, 0, 0), 0);
// Draw quads // Draw quads
G_Rasterize( G_Rasterize(
frame->cl, cl,
V_QuadVS, V_QuadPS, V_QuadVS, V_QuadPS,
G_CountBuffer(quads_buff, V_Quad), G_QuadIndices(), G_CountBuffer(quads_buff, V_Quad), G_QuadIndices(),
1, &G_Rt(albedo_target, G_BlendMode_CompositeStraightAlpha), 1, &G_Rt(albedo_target, G_BlendMode_CompositeStraightAlpha),
@ -5200,13 +5211,11 @@ void V_TickForever(WaveLaneCtx *lane)
); );
// Emit particles // Emit particles
G_Compute(frame->cl, V_EmitParticlesCS, V_ThreadGroupSizeFromBufferSize(frame->emitters_count)); G_Compute(cl, V_EmitParticlesCS, V_ThreadGroupSizeFromBufferSize(frame->emitters_count));
// Sync particles & occluders // Sync particles, occluders, & albedo
G_DumbGlobalMemorySync(frame->cl); G_DumbGlobalMemorySync(cl);
G_DumbMemoryLayoutSync(cl, albedo_target, G_Layout_DirectQueue_General);
// Transition albedo
G_DumbMemoryLayoutSync(frame->cl, albedo_target, G_Layout_DirectQueue_General);
} }
////////////////////////////// //////////////////////////////
@ -5214,10 +5223,10 @@ void V_TickForever(WaveLaneCtx *lane)
{ {
// Simulate particles // Simulate particles
G_Compute(frame->cl, V_SimParticlesCS, V_ThreadGroupSizeFromBufferSize(V_ParticlesCap)); G_Compute(cl, V_SimParticlesCS, V_ThreadGroupSizeFromBufferSize(V_ParticlesCap));
// Sync cells // Sync cells
G_DumbGlobalMemorySync(frame->cl); G_DumbGlobalMemorySync(cl);
} }
////////////////////////////// //////////////////////////////
@ -5225,18 +5234,21 @@ void V_TickForever(WaveLaneCtx *lane)
// TODO: Remove this // TODO: Remove this
if (0)
{ {
G_Compute(frame->cl, V_ShadeCS, V_ThreadGroupSizeFromTexSize(frame->shade_dims)); G_Compute(cl, V_ShadeCS, V_ThreadGroupSizeFromTexSize(frame->shade_dims));
G_DumbGlobalMemorySync(cl);
} }
////////////////////////////// //////////////////////////////
//- Composite pass //- Composite pass
{ {
G_Compute(frame->cl, V_CompositeCS, V_ThreadGroupSizeFromTexSize(frame->screen_dims)); G_Compute(cl, V_CompositeCS, V_ThreadGroupSizeFromTexSize(frame->screen_dims));
// Sync screen tex // Sync screen tex
G_DumbGlobalMemorySync(frame->cl); G_DumbGlobalMemorySync(cl);
} }
////////////////////////////// //////////////////////////////
@ -5244,7 +5256,7 @@ void V_TickForever(WaveLaneCtx *lane)
{ {
i32 mips_count = G_CountMips(bloom_target) + 1; i32 mips_count = G_CountMips(bloom_target) + 1;
G_SetConstant(frame->cl, V_GpuConst_MipsCount, mips_count); G_SetConstant(cl, V_GpuConst_MipsCount, mips_count);
// NOTE: Because bloom mip chain starts at half screen size, mip_idx 0 // NOTE: Because bloom mip chain starts at half screen size, mip_idx 0
// actually represents the screen texture, while mip_idx - 1 represents // actually represents the screen texture, while mip_idx - 1 represents
@ -5255,10 +5267,10 @@ void V_TickForever(WaveLaneCtx *lane)
{ {
Vec2I32 down_dims = G_DimsFromMip2D(G_Count2D(screen_target), mip_idx); Vec2I32 down_dims = G_DimsFromMip2D(G_Count2D(screen_target), mip_idx);
G_SetConstant(frame->cl, V_GpuConst_MipIdx, mip_idx); G_SetConstant(cl, V_GpuConst_MipIdx, mip_idx);
G_Compute(frame->cl, V_BloomDownCS, V_ThreadGroupSizeFromTexSize(down_dims)); G_Compute(cl, V_BloomDownCS, V_ThreadGroupSizeFromTexSize(down_dims));
G_DumbGlobalMemorySync(frame->cl); G_DumbGlobalMemorySync(cl);
} }
//- Upsample passes //- Upsample passes
@ -5266,10 +5278,10 @@ void V_TickForever(WaveLaneCtx *lane)
{ {
Vec2I32 up_dims = G_DimsFromMip2D(G_Count2D(screen_target), mip_idx); Vec2I32 up_dims = G_DimsFromMip2D(G_Count2D(screen_target), mip_idx);
G_SetConstant(frame->cl, V_GpuConst_MipIdx, mip_idx); G_SetConstant(cl, V_GpuConst_MipIdx, mip_idx);
G_Compute(frame->cl, V_BloomUpCS, V_ThreadGroupSizeFromTexSize(up_dims)); G_Compute(cl, V_BloomUpCS, V_ThreadGroupSizeFromTexSize(up_dims));
G_DumbGlobalMemorySync(frame->cl); G_DumbGlobalMemorySync(cl);
} }
} }
@ -5277,9 +5289,9 @@ void V_TickForever(WaveLaneCtx *lane)
//- Finalization pass //- Finalization pass
{ {
G_Compute(frame->cl, V_FinalizeCS, V_ThreadGroupSizeFromTexSize(frame->screen_dims)); G_Compute(cl, V_FinalizeCS, V_ThreadGroupSizeFromTexSize(frame->screen_dims));
G_DumbGlobalMemorySync(frame->cl); G_DumbGlobalMemorySync(cl);
} }
////////////////////////////// //////////////////////////////
@ -5287,10 +5299,10 @@ void V_TickForever(WaveLaneCtx *lane)
if (dvert_idxs_ib.count > 0) if (dvert_idxs_ib.count > 0)
{ {
G_DumbMemoryLayoutSync(frame->cl, screen_target, G_Layout_DirectQueue_RenderTarget); G_DumbMemoryLayoutSync(cl, screen_target, G_Layout_DirectQueue_RenderTarget);
G_Rasterize( G_Rasterize(
frame->cl, cl,
V_DVertVS, V_DVertPS, V_DVertVS, V_DVertPS,
1, dvert_idxs_ib, 1, dvert_idxs_ib,
1, &G_Rt(screen_target, G_BlendMode_CompositeStraightAlpha), 1, &G_Rt(screen_target, G_BlendMode_CompositeStraightAlpha),
@ -5298,11 +5310,12 @@ void V_TickForever(WaveLaneCtx *lane)
G_RasterMode_TriangleList G_RasterMode_TriangleList
); );
G_DumbMemoryLayoutSync(frame->cl, screen_target, G_Layout_DirectQueue_General); G_DumbMemoryLayoutSync(cl, screen_target, G_Layout_DirectQueue_General);
} }
////////////////////////////// //////////////////////////////
//- Finalize screen target //- Set UI box texture
{ {
Rng2 uv = Zi; Rng2 uv = Zi;
@ -5381,7 +5394,7 @@ void V_TickForever(WaveLaneCtx *lane)
////////////////////////////// //////////////////////////////
//- End frame //- End frame
G_CommitCommandList(frame->cl); G_CommitCommandList(cl);
i32 vsync = !!TweakBool("Vsync", 1); i32 vsync = !!TweakBool("Vsync", 1);
vsync = 1; vsync = 1;

View File

@ -224,7 +224,6 @@ Struct(V_Frame)
Arena *quads_arena; Arena *quads_arena;
Arena *dverts_arena; Arena *dverts_arena;
Arena *dvert_idxs_arena; Arena *dvert_idxs_arena;
G_CommandListHandle cl;
Embed(V_SharedFrame, shared_frame); Embed(V_SharedFrame, shared_frame);
@ -277,7 +276,7 @@ Struct(V_Ctx)
Atomic32 shutdown; Atomic32 shutdown;
Fence shutdown_complete; Fence shutdown_complete;
i64 current_frame_tick; i64 cur_frame_tick;
V_Frame frames[2]; V_Frame frames[2];
}; };

View File

@ -577,7 +577,7 @@ UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags)
////////////////////////////// //////////////////////////////
//- Begin frame //- Begin frame
UI.current_frame_tick += 1; UI.cur_frame_tick += 1;
UI_Frame *prev_frame = UI_PrevFrame(); UI_Frame *prev_frame = UI_PrevFrame();
UI_Frame *frame = UI_CurrentFrame(); UI_Frame *frame = UI_CurrentFrame();
@ -589,10 +589,10 @@ UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags)
frame->rects_arena = old_rects_arena; frame->rects_arena = old_rects_arena;
} }
frame->window_frame = WND_BeginFrame(G_Format_R16G16B16A16_Float, WND_BackbufferSizeMode_MatchMonitor); frame->window_frame = WND_BeginFrame(G_Format_R16G16B16A16_Float, WND_BackbufferSizeMode_MatchMonitor);
frame->cl = G_PrepareCommandList(G_QueueKind_Direct); UI.cl = G_PrepareCommandList(G_QueueKind_Direct);
ResetArena(frame->arena); ResetArena(frame->arena);
ResetArena(frame->rects_arena); ResetArena(frame->rects_arena);
G_ResetArena(frame->cl, UI.gpu_frame_arena); G_ResetArena(UI.cl, UI.gpu_frame_arena);
{ {
i64 now_ns = TimeNs(); i64 now_ns = TimeNs();
@ -600,7 +600,7 @@ UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags)
frame->time_ns = now_ns; frame->time_ns = now_ns;
frame->dt_ns = dt_ns; frame->dt_ns = dt_ns;
frame->dt = SecondsFromNs(frame->dt_ns); frame->dt = SecondsFromNs(frame->dt_ns);
frame->tick = UI.current_frame_tick; frame->tick = UI.cur_frame_tick;
} }
// Init style stack // Init style stack
@ -847,12 +847,12 @@ UI_Frame *UI_BeginFrame(UI_FrameFlag frame_flags)
UI_Frame *UI_CurrentFrame(void) UI_Frame *UI_CurrentFrame(void)
{ {
return &UI.frames[UI.current_frame_tick % countof(UI.frames)]; return &UI.frames[UI.cur_frame_tick % countof(UI.frames)];
}; };
UI_Frame *UI_PrevFrame(void) UI_Frame *UI_PrevFrame(void)
{ {
return &UI.frames[(UI.current_frame_tick - 1) % countof(UI.frames)]; return &UI.frames[(UI.cur_frame_tick - 1) % countof(UI.frames)];
}; };
Arena *UI_FrameArena(void) Arena *UI_FrameArena(void)
@ -1698,7 +1698,7 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
// Target // Target
G_ResourceHandle draw_target = G_PushTexture2D( G_ResourceHandle draw_target = G_PushTexture2D(
UI.gpu_frame_arena, frame->cl, UI.gpu_frame_arena, UI.cl,
G_Format_R16G16B16A16_Float, G_Format_R16G16B16A16_Float,
monitor_size, monitor_size,
G_Layout_DirectQueue_RenderTarget, G_Layout_DirectQueue_RenderTarget,
@ -1710,7 +1710,7 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
// Rects // Rects
u64 rects_count = ArenaCount(frame->rects_arena, UI_GpuRect); u64 rects_count = ArenaCount(frame->rects_arena, UI_GpuRect);
G_ResourceHandle rects_buff = G_PushBufferFromCpuCopy( G_ResourceHandle rects_buff = G_PushBufferFromCpuCopy(
UI.gpu_frame_arena, frame->cl, UI.gpu_frame_arena, UI.cl,
StringFromArena(frame->rects_arena), StringFromArena(frame->rects_arena),
.name = Lit("UI rects") .name = Lit("UI rects")
); );
@ -1727,17 +1727,17 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
params.aa = TweakFloat("UI anti-aliasing", 1, 0, 1); params.aa = TweakFloat("UI anti-aliasing", 1, 0, 1);
} }
G_ResourceHandle params_buff = G_PushBufferFromCpuCopy( G_ResourceHandle params_buff = G_PushBufferFromCpuCopy(
UI.gpu_frame_arena, frame->cl, UI.gpu_frame_arena, UI.cl,
StringFromStruct(&params), StringFromStruct(&params),
.name = Lit("UI gpu params") .name = Lit("UI gpu params")
); );
G_StructuredBufferRef params_ro = G_PushStructuredBufferRef(UI.gpu_frame_arena, params_buff, UI_GpuParams); G_StructuredBufferRef params_ro = G_PushStructuredBufferRef(UI.gpu_frame_arena, params_buff, UI_GpuParams);
// Initial constants // Initial constants
G_SetConstant(frame->cl, UI_GpuConst_Params, params_ro); G_SetConstant(UI.cl, UI_GpuConst_Params, params_ro);
// Sync // Sync
G_DumbGlobalMemorySync(frame->cl); G_DumbGlobalMemorySync(UI.cl);
////////////////////////////// //////////////////////////////
//- Dispatch shaders //- Dispatch shaders
@ -1745,7 +1745,7 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
//- Clear pass //- Clear pass
{ {
G_ClearRenderTarget(frame->cl, draw_target, VEC4(0, 0, 0, 0), 0); G_ClearRenderTarget(UI.cl, draw_target, VEC4(0, 0, 0, 0), 0);
} }
//- Rect pass //- Rect pass
@ -1754,7 +1754,7 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
{ {
// Render rects // Render rects
G_Rasterize( G_Rasterize(
frame->cl, UI.cl,
UI_DRectVS, UI_DRectPS, UI_DRectVS, UI_DRectPS,
rects_count, G_QuadIndices(), rects_count, G_QuadIndices(),
1, &G_Rt(draw_target, G_BlendMode_CompositePremultipliedAlpha), 1, &G_Rt(draw_target, G_BlendMode_CompositePremultipliedAlpha),
@ -1765,9 +1765,9 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
// Render rect wireframes // Render rect wireframes
if (AnyBit(frame->frame_flags, UI_FrameFlag_Debug)) if (AnyBit(frame->frame_flags, UI_FrameFlag_Debug))
{ {
G_SetConstant(frame->cl, UI_GpuConst_DebugDraw, 1); G_SetConstant(UI.cl, UI_GpuConst_DebugDraw, 1);
G_Rasterize( G_Rasterize(
frame->cl, UI.cl,
UI_DRectVS, UI_DRectPS, UI_DRectVS, UI_DRectPS,
rects_count, G_QuadIndices(), rects_count, G_QuadIndices(),
1, &G_Rt(draw_target, G_BlendMode_CompositePremultipliedAlpha), 1, &G_Rt(draw_target, G_BlendMode_CompositePremultipliedAlpha),
@ -1779,12 +1779,12 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
//- Backbuffer blit pass //- Backbuffer blit pass
G_DumbMemoryLayoutSync(frame->cl, draw_target, G_Layout_DirectQueue_Read); G_DumbMemoryLayoutSync(UI.cl, draw_target, G_Layout_DirectQueue_Read);
G_DumbMemoryLayoutSync(frame->cl, backbuffer, G_Layout_DirectQueue_RenderTarget); G_DumbMemoryLayoutSync(UI.cl, backbuffer, G_Layout_DirectQueue_RenderTarget);
{ {
G_Rasterize( G_Rasterize(
frame->cl, UI.cl,
UI_BlitVS, UI_BlitPS, UI_BlitVS, UI_BlitPS,
1, G_QuadIndices(), 1, G_QuadIndices(),
1, &G_Rt(backbuffer, G_BlendMode_Opaque), 1, &G_Rt(backbuffer, G_BlendMode_Opaque),
@ -1793,13 +1793,13 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
); );
} }
G_DumbMemoryLayoutSync(frame->cl, backbuffer, G_Layout_Common); G_DumbMemoryLayoutSync(UI.cl, backbuffer, G_Layout_Common);
} }
////////////////////////////// //////////////////////////////
//- End frame //- End frame
G_CommitCommandList(frame->cl); G_CommitCommandList(UI.cl);
WND_EndFrame(frame->window_frame, vsync); WND_EndFrame(frame->window_frame, vsync);
EndScratch(scratch); EndScratch(scratch);

View File

@ -380,7 +380,6 @@ Struct(UI_Frame)
WND_Frame window_frame; WND_Frame window_frame;
G_ResourceHandle backbuffer; G_ResourceHandle backbuffer;
G_CommandListHandle cl;
// Time // Time
i64 tick; i64 tick;
@ -420,10 +419,11 @@ Struct(UI_Ctx)
RandState rand; RandState rand;
i64 current_frame_tick;
UI_Frame frames[2];
G_ArenaHandle gpu_frame_arena; G_ArenaHandle gpu_frame_arena;
G_CommandListHandle cl;
i64 cur_frame_tick;
UI_Frame frames[2];
}; };
extern UI_Ctx UI; extern UI_Ctx UI;