ui gpu 'params' -> 'frame'

This commit is contained in:
jacob 2026-03-14 18:45:15 -05:00
parent 06bea119ff
commit 065aedccc3
5 changed files with 90 additions and 93 deletions

View File

@ -427,8 +427,8 @@ void G_Bootstrap(void);
//~ @hookdecl Arena //~ @hookdecl Arena
G_ArenaHandle G_AcquireArena(void); G_ArenaHandle G_AcquireArena(void);
void G_ReleaseArena(G_CommandListHandle cl_handle, G_ArenaHandle arena); void G_ReleaseArena(G_CommandListHandle cl, G_ArenaHandle arena);
void G_ResetArena(G_CommandListHandle cl_handle, G_ArenaHandle arena_handle); void G_ResetArena(G_CommandListHandle cl, G_ArenaHandle arena);
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ @hookdecl Memory //~ @hookdecl Memory
@ -470,14 +470,13 @@ G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl, G_ArenaHandle gpu_are
.kind = G_MemoryKind_Texture1D, \ .kind = G_MemoryKind_Texture1D, \
.texture = { \ .texture = { \
.format = (_format), \ .format = (_format), \
.dims = VEC3I32((_dims).x, 1, 1), \ .dims = VEC3I32((_dims), 1, 1), \
.initial_layout = (_initial_layout), \ .initial_layout = (_initial_layout), \
__VA_ARGS__ \ __VA_ARGS__ \
} \ } \
} \ } \
)}) )})
#define G_PushTexture2D(_cl, _arena, _initial_layout, _format, _dims, ...) ( \ #define G_PushTexture2D(_cl, _arena, _initial_layout, _format, _dims, ...) ( \
(G_TextureRef) { .v = G_PushMemory((_cl), (_arena), (G_MemoryDesc) { \ (G_TextureRef) { .v = G_PushMemory((_cl), (_arena), (G_MemoryDesc) { \
.kind = G_MemoryKind_Texture2D, \ .kind = G_MemoryKind_Texture2D, \

View File

@ -1,12 +1,8 @@
////////////////////////////////////////////////////////////
//~ Helpers
V_ParticleDesc V_DescFromParticleKind(V_ParticleKind kind) V_ParticleDesc V_DescFromParticleKind(V_ParticleKind kind)
{ {
if (kind < 0 || kind >= V_ParticleKind_COUNT)
{
kind = V_ParticleKind_None;
}
V_ParticleDesc result;
{
V_ParticleDesc descs[V_ParticleKind_COUNT] = { V_ParticleDesc descs[V_ParticleKind_COUNT] = {
#define X(name, flags, layer, stain_rate, pen_rate, lifetime, prune_speed_threshold, base_color, dry_factor) \ #define X(name, flags, layer, stain_rate, pen_rate, lifetime, prune_speed_threshold, base_color, dry_factor) \
{ \ { \
@ -23,7 +19,9 @@ V_ParticleDesc V_DescFromParticleKind(V_ParticleKind kind)
V_ParticlesXList(X) V_ParticlesXList(X)
#undef X #undef X
}; };
result = descs[kind]; if (kind < 0 || kind >= V_ParticleKind_COUNT)
{
kind = V_ParticleKind_None;
} }
return result; return descs[kind];
} }

View File

@ -1524,7 +1524,7 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
////////////////////////////// //////////////////////////////
//- Render //- Render
G_TextureRef draw_target = Zi; UI_GpuFrame gpu_frame = Zi;
{ {
////////////////////////////// //////////////////////////////
//- Build render data //- Build render data
@ -1703,41 +1703,40 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
////////////////////////////// //////////////////////////////
//- Upload data to GPU //- Upload data to GPU
UI_GpuParams params = Zi; G_ZoneDF(UI.cl, "UI upload")
{
// Target // Target
draw_target = G_PushTexture2D( gpu_frame.target_size = draw_size;
gpu_frame.target = G_PushTexture2D(
UI.cl, UI.gpu_frame_arena, UI.cl, UI.gpu_frame_arena,
G_TextureLayout_Family, G_TextureLayout_Family,
G_Format_R16G16B16A16_Float, G_Format_R16G16B16A16_Float,
monitor_size, gpu_frame.target_size,
.flags = G_MemoryFlag_AllowTextureDraw, .flags = G_MemoryFlag_AllowTextureDraw,
.name = Lit("UI draw target") .name = Lit("UI draw target")
); );
// Rects // Rects
UI_GpuRect *rects = ArenaFirst(frame->rects_arena, UI_GpuRect); gpu_frame.rects_count = ArenaCount(frame->rects_arena, UI_GpuRect);
u64 rects_count = ArenaCount(frame->rects_arena, UI_GpuRect); gpu_frame.rects = G_PushStructsFromCpu(
params.rects = G_PushStructsFromCpu(
UI.cl, UI.gpu_frame_arena, UI.cl, UI.gpu_frame_arena,
rects, rects_count, ArenaFirst(frame->rects_arena, UI_GpuRect), gpu_frame.rects_count,
.name = Lit("UI rects") .name = Lit("UI rects")
); );
// Params // Frame
params.target = draw_target; gpu_frame.sampler = G_BasicSamplerFromKind(G_BasicSamplerKind_PointClamp);
params.target_size = draw_size; gpu_frame.cursor_pos = frame->cursor_pos;
params.sampler = G_BasicSamplerFromKind(G_BasicSamplerKind_PointClamp); gpu_frame.anti_aliasing = TweakFloat("UI anti-aliasing", 1, 0, 1);
params.cursor_pos = frame->cursor_pos; G_BufferRef gpu_frame_buff = G_PushStructFromCpu(
params.anti_aliasing = TweakFloat("UI anti-aliasing", 1, 0, 1);
G_BufferRef params_buff = G_PushStructFromCpu(
UI.cl, UI.gpu_frame_arena, UI.cl, UI.gpu_frame_arena,
&params, &gpu_frame,
.name = Lit("UI gpu params") .name = Lit("UI gpu frame")
); );
// Init constants // Init constants
G_SetConstant(UI.cl, UI_GpuConst_Params, params_buff); G_SetConstant(UI.cl, UI_GpuConst_Frame, gpu_frame_buff);
}
// Sync // Sync
G_Sync(UI.cl); G_Sync(UI.cl);
@ -1749,25 +1748,25 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
G_ZoneDF(UI.cl, "UI clear") G_ZoneDF(UI.cl, "UI clear")
{ {
G_ClearRenderTarget(UI.cl, draw_target, VEC4(0, 0, 0, 0), 0); G_ClearRenderTarget(UI.cl, gpu_frame.target, VEC4(0, 0, 0, 0), 0);
} }
//- Rect pass //- Rects pass
// Render rects
G_ZoneDF(UI.cl, "UI rects") G_ZoneDF(UI.cl, "UI rects")
{ {
G_Draw( G_Draw(
UI.cl, UI.cl,
UI_DRectVS, UI_DRectPS, UI_DRectVS, UI_DRectPS,
rects_count, G_QuadIndices(), gpu_frame.rects_count, G_QuadIndices(),
1, &G_RT(draw_target, G_BlendMode_CompositePremultipliedAlpha), 1, &G_RT(gpu_frame.target, G_BlendMode_CompositePremultipliedAlpha),
draw_viewport, draw_scissor, draw_viewport, draw_scissor,
G_DrawMode_TriangleList G_DrawMode_TriangleList
); );
} }
// Render rect wireframes //- Wireframe rects pass
if (AnyBit(frame->frame_flags, UI_FrameFlag_Debug)) if (AnyBit(frame->frame_flags, UI_FrameFlag_Debug))
{ {
G_ZoneDF(UI.cl, "UI debug rects") G_ZoneDF(UI.cl, "UI debug rects")
@ -1776,8 +1775,8 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
G_Draw( G_Draw(
UI.cl, UI.cl,
UI_DRectVS, UI_DRectPS, UI_DRectVS, UI_DRectPS,
rects_count, G_QuadIndices(), gpu_frame.rects_count, G_QuadIndices(),
1, &G_RT(draw_target, G_BlendMode_CompositePremultipliedAlpha), 1, &G_RT(gpu_frame.target, G_BlendMode_CompositePremultipliedAlpha),
draw_viewport, draw_scissor, draw_viewport, draw_scissor,
G_DrawMode_WireTriangleList G_DrawMode_WireTriangleList
); );
@ -1790,7 +1789,7 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
//- End frame //- End frame
G_CommitCommandList(UI.cl); G_CommitCommandList(UI.cl);
WND_EndFrame(frame->window_frame, VEC2I32(0, 0), draw_target, RNG2I32(VEC2I32(0, 0), draw_size), vsync); WND_EndFrame(frame->window_frame, VEC2I32(0, 0), gpu_frame.target, RNG2I32(VEC2I32(0, 0), gpu_frame.target_size), vsync);
EndScratch(scratch); EndScratch(scratch);
} }

View File

@ -6,8 +6,8 @@
VertexShader(UI_DRectVS, UI_DRectPSInput) VertexShader(UI_DRectVS, UI_DRectPSInput)
{ {
UI_GpuParams params = G_Deref(UI_GpuConst_Params, StructuredBuffer<UI_GpuParams>)[0]; UI_GpuFrame frame = G_Deref(UI_GpuConst_Frame, StructuredBuffer<UI_GpuFrame>)[0];
StructuredBuffer<UI_GpuRect> rects = G_Deref(params.rects, StructuredBuffer<UI_GpuRect>); StructuredBuffer<UI_GpuRect> rects = G_Deref(frame.rects, StructuredBuffer<UI_GpuRect>);
UI_GpuRect rect = rects[SV_InstanceID]; UI_GpuRect rect = rects[SV_InstanceID];
Vec2 rect_uv = RectUvFromIdx(SV_VertexID); Vec2 rect_uv = RectUvFromIdx(SV_VertexID);
@ -16,7 +16,7 @@ VertexShader(UI_DRectVS, UI_DRectPSInput)
UI_DRectPSInput result; UI_DRectPSInput result;
{ {
result.sv_position = Vec4(NdcFromPos(target_pos, Vec2(params.target_size).xy), 0, 1); result.sv_position = Vec4(NdcFromPos(target_pos, Vec2(frame.target_size).xy), 0, 1);
result.base_background_premul = Premul(rect.background_lin); result.base_background_premul = Premul(rect.background_lin);
result.base_border_premul = Premul(rect.border_lin); result.base_border_premul = Premul(rect.border_lin);
result.tint_premul = Premul(rect.tint_lin); result.tint_premul = Premul(rect.tint_lin);
@ -33,8 +33,8 @@ VertexShader(UI_DRectVS, UI_DRectPSInput)
PixelShader(UI_DRectPS, UI_DRectPSOutput, UI_DRectPSInput input) PixelShader(UI_DRectPS, UI_DRectPSOutput, UI_DRectPSInput input)
{ {
UI_GpuParams params = G_Deref(UI_GpuConst_Params, StructuredBuffer<UI_GpuParams>)[0]; UI_GpuFrame frame = G_Deref(UI_GpuConst_Frame, StructuredBuffer<UI_GpuFrame>)[0];
SamplerState sampler = G_Deref(params.sampler, SamplerState); SamplerState sampler = G_Deref(frame.sampler, SamplerState);
UI_GpuRect rect = input.rect; UI_GpuRect rect = input.rect;
Vec2 rect_uv = input.rect_uv; Vec2 rect_uv = input.rect_uv;
@ -93,7 +93,7 @@ PixelShader(UI_DRectPS, UI_DRectPSOutput, UI_DRectPSInput input)
//- Compute anti-aliased border-over-background color //- Compute anti-aliased border-over-background color
Vec4 composite_premul = 0; Vec4 composite_premul = 0;
{ {
f32 smoothness = rect_dist_fwidth * params.anti_aliasing * 0.5; f32 smoothness = rect_dist_fwidth * frame.anti_aliasing * 0.5;
f32 border_coverage = smoothstep(smoothness, -smoothness, border_dist); f32 border_coverage = smoothstep(smoothness, -smoothness, border_dist);
composite_premul = lerp(background_premul, border_premul, border_coverage); composite_premul = lerp(background_premul, border_premul, border_coverage);
} }

View File

@ -1,22 +1,3 @@
////////////////////////////////////////////////////////////
//~ Constant types
G_DeclConstant(G_BufferRef, UI_GpuConst_Params, 0);
G_DeclConstant(b32, UI_GpuConst_DebugDraw, 1);
Struct(UI_GpuParams)
{
f32 anti_aliasing;
Vec2I32 target_size;
G_TextureRef target;
Vec2 cursor_pos;
G_BufferRef rects;
G_SamplerRef sampler;
};
//////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////
//~ Rect types //~ Rect types
@ -38,3 +19,23 @@ Struct(UI_GpuRect)
f32 br_rounding; f32 br_rounding;
f32 bl_rounding; f32 bl_rounding;
}; };
////////////////////////////////////////////////////////////
//~ State types
G_DeclConstant(G_BufferRef, UI_GpuConst_Frame, 0);
G_DeclConstant(b32, UI_GpuConst_DebugDraw, 1);
Struct(UI_GpuFrame)
{
f32 anti_aliasing;
Vec2I32 target_size;
G_TextureRef target;
Vec2 cursor_pos;
u64 rects_count;
G_BufferRef rects;
G_SamplerRef sampler;
};