gpu resource logging command

This commit is contained in:
jacob 2026-02-03 01:12:46 -06:00
parent 201d0c2bf0
commit 8745cb4da7
8 changed files with 145 additions and 51 deletions

View File

@ -317,7 +317,7 @@ void GC_TickAsync(WaveLaneCtx *lane, AsyncFrameLaneCtx *base_async_lane_frame)
G_Format_R8G8B8A8_Unorm_Srgb,
atlas->dims,
G_Layout_AnyQueue_ShaderRead_CopyRead_CopyWrite_Present,
.debug = Lit("Glyph atlas")
.name = Lit("Glyph atlas")
);
atlas->tex_ref = G_PushTexture2DRef(gpu_perm, atlas->tex);
}

View File

@ -422,7 +422,7 @@ Struct(G_BufferDesc)
{
G_ResourceFlag flags;
u64 size;
String debug;
String name;
};
Struct(G_TextureDesc)
@ -433,7 +433,7 @@ Struct(G_TextureDesc)
G_Layout initial_layout;
i32 mip_levels; // Will be clamped to range [1, inf)
Vec4 clear_color;
String debug;
String name;
};
Struct(G_SamplerDesc)
@ -449,7 +449,7 @@ Struct(G_SamplerDesc)
Vec4 border_color;
f32 min_lod;
f32 max_lod;
String debug;
String name;
};
Struct(G_ResourceDesc)
@ -800,6 +800,10 @@ void G_ClearRenderTarget(G_CommandListHandle cl, G_ResourceHandle render_target,
void G_DiscardRenderTarget(G_CommandListHandle cl, G_ResourceHandle render_target);
//- Log
void G_LogResource(G_CommandListHandle cl, G_ResourceHandle resource);
////////////////////////////////////////////////////////////
//~ @hookdecl Synchronization

View File

@ -450,6 +450,54 @@ D3D12_BARRIER_LAYOUT G_D12_BarrierLayoutFromLayout(G_Layout layout)
return result;
};
String G_D12_NameFromBarrierLayout(D3D12_BARRIER_LAYOUT layout)
{
PERSIST Readonly String names[] = {
[D3D12_BARRIER_LAYOUT_COMMON] = CompLit("D3D12_BARRIER_LAYOUT_COMMON"),
[D3D12_BARRIER_LAYOUT_PRESENT] = CompLit("D3D12_BARRIER_LAYOUT_PRESENT"),
[D3D12_BARRIER_LAYOUT_GENERIC_READ] = CompLit("D3D12_BARRIER_LAYOUT_GENERIC_READ"),
[D3D12_BARRIER_LAYOUT_RENDER_TARGET] = CompLit("D3D12_BARRIER_LAYOUT_RENDER_TARGET"),
[D3D12_BARRIER_LAYOUT_UNORDERED_ACCESS] = CompLit("D3D12_BARRIER_LAYOUT_UNORDERED_ACCESS"),
[D3D12_BARRIER_LAYOUT_DEPTH_STENCIL_WRITE] = CompLit("D3D12_BARRIER_LAYOUT_DEPTH_STENCIL_WRITE"),
[D3D12_BARRIER_LAYOUT_DEPTH_STENCIL_READ] = CompLit("D3D12_BARRIER_LAYOUT_DEPTH_STENCIL_READ"),
[D3D12_BARRIER_LAYOUT_SHADER_RESOURCE] = CompLit("D3D12_BARRIER_LAYOUT_SHADER_RESOURCE"),
[D3D12_BARRIER_LAYOUT_COPY_SOURCE] = CompLit("D3D12_BARRIER_LAYOUT_COPY_SOURCE"),
[D3D12_BARRIER_LAYOUT_COPY_DEST] = CompLit("D3D12_BARRIER_LAYOUT_COPY_DEST"),
[D3D12_BARRIER_LAYOUT_RESOLVE_SOURCE] = CompLit("D3D12_BARRIER_LAYOUT_RESOLVE_SOURCE"),
[D3D12_BARRIER_LAYOUT_RESOLVE_DEST] = CompLit("D3D12_BARRIER_LAYOUT_RESOLVE_DEST"),
[D3D12_BARRIER_LAYOUT_SHADING_RATE_SOURCE] = CompLit("D3D12_BARRIER_LAYOUT_SHADING_RATE_SOURCE"),
[D3D12_BARRIER_LAYOUT_VIDEO_DECODE_READ] = CompLit("D3D12_BARRIER_LAYOUT_VIDEO_DECODE_READ"),
[D3D12_BARRIER_LAYOUT_VIDEO_DECODE_WRITE] = CompLit("D3D12_BARRIER_LAYOUT_VIDEO_DECODE_WRITE"),
[D3D12_BARRIER_LAYOUT_VIDEO_PROCESS_READ] = CompLit("D3D12_BARRIER_LAYOUT_VIDEO_PROCESS_READ"),
[D3D12_BARRIER_LAYOUT_VIDEO_PROCESS_WRITE] = CompLit("D3D12_BARRIER_LAYOUT_VIDEO_PROCESS_WRITE"),
[D3D12_BARRIER_LAYOUT_VIDEO_ENCODE_READ] = CompLit("D3D12_BARRIER_LAYOUT_VIDEO_ENCODE_READ"),
[D3D12_BARRIER_LAYOUT_VIDEO_ENCODE_WRITE] = CompLit("D3D12_BARRIER_LAYOUT_VIDEO_ENCODE_WRITE"),
[D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_COMMON] = CompLit("D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_COMMON"),
[D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_GENERIC_READ] = CompLit("D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_GENERIC_READ"),
[D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_UNORDERED_ACCESS] = CompLit("D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_UNORDERED_ACCESS"),
[D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_SHADER_RESOURCE] = CompLit("D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_SHADER_RESOURCE"),
[D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_COPY_SOURCE] = CompLit("D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_COPY_SOURCE"),
[D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_COPY_DEST] = CompLit("D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_COPY_DEST"),
[D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_COMMON] = CompLit("D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_COMMON"),
[D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_GENERIC_READ] = CompLit("D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_GENERIC_READ"),
[D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_UNORDERED_ACCESS] = CompLit("D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_UNORDERED_ACCESS"),
[D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_SHADER_RESOURCE] = CompLit("D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_SHADER_RESOURCE"),
[D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_COPY_SOURCE] = CompLit("D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_COPY_SOURCE"),
[D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_COPY_DEST] = CompLit("D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_COPY_DEST"),
[D3D12_BARRIER_LAYOUT_VIDEO_QUEUE_COMMON] = CompLit("D3D12_BARRIER_LAYOUT_VIDEO_QUEUE_COMMON")
};
String result = Zi;
if (layout >= 0 && layout < countof(names))
{
result = names[layout];
}
else if (layout == D3D12_BARRIER_LAYOUT_UNDEFINED)
{
result = Lit("D3D12_BARRIER_LAYOUT_UNDEFINED");
}
return result;
}
void G_D12_SetObjectName(ID3D12Object *object, String name)
{
TempArena scratch = BeginScratchNoConflict();
@ -464,14 +512,14 @@ String G_D12_NameFromObject(Arena *arena, ID3D12Object *object)
{
String result = Zi;
{
wchar_t dbg_text[G_D12_MaxDebugTextLen] = Zi;
u32 dbg_text_sz = sizeof(dbg_text);
ID3D12Object_GetPrivateData(object, &WKPDID_D3DDebugObjectNameW, &dbg_text_sz, dbg_text);
if (dbg_text_sz > 2)
wchar_t name_text[G_D12_MaxNameLen] = Zi;
u32 name_text_sz = sizeof(name_text);
ID3D12Object_GetPrivateData(object, &WKPDID_D3DDebugObjectNameW, &name_text_sz, name_text);
if (name_text_sz > 2)
{
String16 str16 = Zi;
str16.len = (dbg_text_sz / 2) - 1;
str16.text = dbg_text;
str16.len = (name_text_sz / 2) - 1;
str16.text = name_text;
result = StringFromString16(arena, str16);
}
}
@ -969,11 +1017,11 @@ G_ResourceHandle G_PushResource(G_ArenaHandle arena_handle, G_CommandListHandle
is_texture ? desc.texture.flags :
desc.sampler.flags;
String new_debug_text =
is_buffer ? desc.buffer.debug :
is_texture ? desc.texture.debug :
desc.sampler.debug;
new_debug_text.len = MinU64(new_debug_text.len, countof(resource->debug_text));
String new_name =
is_buffer ? desc.buffer.name :
is_texture ? desc.texture.name :
desc.sampler.name;
new_name.len = MinU64(new_name.len, countof(resource->name_text));
//////////////////////////////
//- Initialize heap info
@ -1121,9 +1169,9 @@ G_ResourceHandle G_PushResource(G_ArenaHandle arena_handle, G_CommandListHandle
release->d3d_resource = resource->d3d_resource;
if (GPU_DEBUG)
{
StaticAssert(countof(release->debug_text) == countof(resource->debug_text));
release->debug_text_len = resource->debug_text_len;
CopyBytes(release->debug_text, resource->debug_text, resource->debug_text_len);
StaticAssert(countof(release->name_text) == countof(resource->name_text));
release->name_len = resource->name_len;
CopyBytes(release->name_text, resource->name_text, resource->name_len);
}
}
ZeroStruct(resource);
@ -1225,21 +1273,27 @@ G_ResourceHandle G_PushResource(G_ArenaHandle arena_handle, G_CommandListHandle
//////////////////////////////
//- Set debug information
if (GPU_DEBUG)
String old_name = STRING(resource->name_len, resource->name_text);
if (!MatchString(old_name, new_name))
{
String old_debug_text = STRING(resource->debug_text_len, resource->debug_text);
if (!MatchString(old_debug_text, new_debug_text))
resource->name_len = new_name.len;
CopyBytes(resource->name_text, new_name.text, new_name.len);
if (GPU_DEBUG)
{
resource->debug_text_len = new_debug_text.len;
CopyBytes(resource->debug_text, new_debug_text.text, new_debug_text.len);
G_D12_SetObjectName((ID3D12Object *)resource->d3d_resource, new_debug_text);
G_D12_SetObjectName((ID3D12Object *)resource->d3d_resource, new_name);
}
}
//////////////////////////////
//- Barrier if reusing
//- Barrier reused resource
// TODO: These barriers are overly cautious. It's unlikely that anything
// other than an activation-layout transition is needed for textures, since
// arenas are rarely reset in the middle of a command list. In the case that
// a resource is reused within the same command list, we should insert
// barriers as described in the spec:
// https://microsoft.github.io/DirectX-Specs/d3d/D3D12EnhancedBarriers.html#resource-aliasing
// TODO: These barriers are too cautious; it's rare that an arena would ever be reset mid-command list.
if (can_reuse)
{
if (is_buffer)
@ -1922,7 +1976,7 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle)
}
}
// Process gpu commands into dx12 commands
// Build d3d commands
{
u64 batch_barrier_idx_start = 0;
u64 batch_barrier_idx_opl = 0; // One past last
@ -2431,6 +2485,24 @@ i64 G_CommitCommandList(G_CommandListHandle cl_handle)
ID3D12GraphicsCommandList_DiscardResource(d3d_cl, resource->d3d_resource, 0);
cmd_idx += 1;
} break;
//- Log
case G_D12_CmdKind_Log:
{
G_D12_Resource *resource = cmd->log.resource;
String resource_name = STRING(resource->name_len, resource->name_text);
String layout_name = G_D12_NameFromBarrierLayout(resource->cmdlist_texture_layout);
String msg = StringF(
scratch.arena,
"[Gpu command list resource log] uid: %F, name: \"%F\", layout: %F",
FmtUint(resource->uid),
FmtString(resource_name),
FmtString(layout_name)
);
LogDebug(msg);
cmd_idx += 1;
} break;
}
}
}
@ -2814,6 +2886,16 @@ void G_DiscardRenderTarget(G_CommandListHandle cl_handle, G_ResourceHandle resou
cmd->discard_rtv.render_target = G_D12_ResourceFromHandle(resource_handle);
}
//- Log
void G_LogResource(G_CommandListHandle cl_handle, G_ResourceHandle resource_handle)
{
G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle);
G_D12_Cmd *cmd = G_D12_PushCmd(cl);
cmd->kind = G_D12_CmdKind_Log;
cmd->log.resource = G_D12_ResourceFromHandle(resource_handle);
}
////////////////////////////////////////////////////////////
//~ @hookimpl Synchronization

View File

@ -25,7 +25,7 @@
#define G_D12_MaxSamplerDescriptors (1024 * 1)
#define G_D12_MaxRtvDescriptors (1024 * 64)
#define G_D12_MaxDebugTextLen 64
#define G_D12_MaxNameLen 64
////////////////////////////////////////////////////////////
//~ Pipeline types
@ -93,8 +93,8 @@ Struct(G_D12_Resource)
// Backbuffer info
struct G_D12_Swapchain *swapchain;
u64 debug_text_len;
u8 debug_text[G_D12_MaxDebugTextLen];
u64 name_len;
u8 name_text[G_D12_MaxNameLen];
};
Struct(G_D12_ResourceList)
@ -279,8 +279,8 @@ Struct(G_D12_Releasable)
ID3D12Resource *d3d_resource;
u64 debug_text_len;
u8 debug_text[G_D12_MaxDebugTextLen];
u64 name_len;
u8 name_text[G_D12_MaxNameLen];
};
Struct(G_D12_ReleasableList)
@ -305,6 +305,7 @@ Enum(G_D12_CmdKind)
G_D12_CmdKind_Rasterize,
G_D12_CmdKind_ClearRtv,
G_D12_CmdKind_DiscardRtv,
G_D12_CmdKind_Log,
};
Struct(G_D12_Cmd)
@ -374,6 +375,11 @@ Struct(G_D12_Cmd)
{
G_D12_Resource *render_target;
} discard_rtv;
struct
{
G_D12_Resource *resource;
} log;
};
};
@ -502,6 +508,7 @@ DXGI_FORMAT G_D12_DxgiFormatFromGpuFormat(G_Format format);
D3D12_BARRIER_SYNC G_D12_BarrierSyncFromStages(G_Stage stages);
D3D12_BARRIER_ACCESS G_D12_BarrierAccessFromAccesses(G_Access accesses);
D3D12_BARRIER_LAYOUT G_D12_BarrierLayoutFromLayout(G_Layout layout);
String G_D12_NameFromBarrierLayout(D3D12_BARRIER_LAYOUT layout);
void G_D12_SetObjectName(ID3D12Object *object, String name);
String G_D12_NameFromObject(Arena *arena, ID3D12Object *object);

View File

@ -426,7 +426,6 @@ void BuildEntryPoint(WaveLaneCtx *lane)
//- Dxc
{
PushStringToList(perm, &cp.flags_dxc, Lit("-O3"));
// PushStringToList(perm, &cp.flags_dxc, Lit("-Od"));
PushStringToList(perm, &cp.flags_dxc, Lit("-Zi -Qembed_debug"));
// Enable warnings

View File

@ -412,7 +412,7 @@ void V_TickForever(WaveLaneCtx *lane)
V_GpuState,
1,
.flags = G_ResourceFlag_ZeroMemory | G_ResourceFlag_AllowShaderReadWrite,
.debug = Lit("Gpu state")
.name = Lit("Gpu state")
);
gpu_state_ref = G_PushRWStructuredBufferRef(gpu_perm, gpu_state, V_GpuState);
}
@ -424,7 +424,7 @@ void V_TickForever(WaveLaneCtx *lane)
tiles_dims,
G_Layout_DirectQueue_ShaderRead,
.flags = G_ResourceFlag_ZeroMemory,
.debug = Lit("Tiles")
.name = Lit("Tiles")
);
gpu_tiles_ref = G_PushTexture2DRef(gpu_perm, gpu_tiles);
}
@ -435,7 +435,7 @@ void V_TickForever(WaveLaneCtx *lane)
V_Particle,
V_ParticlesCap,
.flags = G_ResourceFlag_ZeroMemory | G_ResourceFlag_AllowShaderReadWrite,
.debug = Lit("Particles")
.name = Lit("Particles")
);
gpu_particles_ref = G_PushRWStructuredBufferRef(gpu_perm, gpu_particles, V_Particle);
}
@ -450,7 +450,7 @@ void V_TickForever(WaveLaneCtx *lane)
cells_dims,
G_Layout_DirectQueue_ShaderReadWrite,
.flags = G_ResourceFlag_ZeroMemory | G_ResourceFlag_AllowShaderReadWrite,
.debug = Lit("Cells")
.name = Lit("Cells")
);
gpu_cells_ref = G_PushRWTexture2DRef(gpu_perm, gpu_cells);
}
@ -465,7 +465,7 @@ void V_TickForever(WaveLaneCtx *lane)
cells_dims,
G_Layout_DirectQueue_ShaderReadWrite,
.flags = G_ResourceFlag_ZeroMemory | G_ResourceFlag_AllowShaderReadWrite,
.debug = Lit("Stains")
.name = Lit("Stains")
);
gpu_stains_ref = G_PushRWTexture2DRef(gpu_perm, gpu_stains);
}
@ -481,7 +481,7 @@ void V_TickForever(WaveLaneCtx *lane)
cells_dims,
G_Layout_DirectQueue_ShaderReadWrite,
.flags = G_ResourceFlag_ZeroMemory | G_ResourceFlag_AllowShaderReadWrite,
.debug = Lit("Drynesses")
.name = Lit("Drynesses")
);
gpu_drynesses_ref = G_PushRWTexture2DRef(gpu_perm, gpu_drynesses);
}
@ -4453,7 +4453,7 @@ void V_TickForever(WaveLaneCtx *lane)
frame->screen_dims,
G_Layout_DirectQueue_RenderTargetWrite,
.flags = G_ResourceFlag_AllowRenderTarget,
.debug = StringF(frame->arena, "Screen target [%F]", FmtSint(frame->tick))
.name = StringF(frame->arena, "Screen target [%F]", FmtSint(frame->tick))
);
G_Texture2DRef screen_target_ro = G_PushTexture2DRef(frame->gpu_arena, screen_target);
Rng3 screen_viewport = RNG3(VEC3(0, 0, 0), VEC3(frame->screen_dims.x, frame->screen_dims.y, 1));
@ -4466,7 +4466,7 @@ void V_TickForever(WaveLaneCtx *lane)
frame->screen_dims,
G_Layout_DirectQueue_RenderTargetWrite,
.flags = G_ResourceFlag_AllowRenderTarget,
.debug = StringF(frame->arena, "Albedo target [%F]", FmtSint(frame->tick))
.name = StringF(frame->arena, "Albedo target [%F]", FmtSint(frame->tick))
);
G_Texture2DRef albedo_target_ro = G_PushTexture2DRef(frame->gpu_arena, albedo_target);
@ -4477,7 +4477,9 @@ void V_TickForever(WaveLaneCtx *lane)
frame->shade_dims,
G_Layout_DirectQueue_ShaderReadWrite,
.flags = G_ResourceFlag_AllowShaderReadWrite,
.debug = StringF(frame->arena, "Shade target [%F]", FmtSint(frame->tick))
// FIXME: Remove this
// .flags = G_ResourceFlag_AllowShaderReadWrite | G_ResourceFlag_ForceNoReuse,
.name = StringF(frame->arena, "Shade target [%F]", FmtSint(frame->tick))
);
G_Texture2DRef shade_target_ro = G_PushTexture2DRef(frame->gpu_arena, shade_target);
G_RWTexture2DRef shade_target_rw = G_PushRWTexture2DRef(frame->gpu_arena, shade_target);
@ -4488,7 +4490,7 @@ void V_TickForever(WaveLaneCtx *lane)
G_ResourceHandle quads_buff = G_PushBufferFromCpuCopy(
frame->gpu_arena, frame->cl,
StringFromArena(frame->quads_arena),
.debug = StringF(frame->arena, "quads [%F]", FmtSint(frame->tick))
.name = StringF(frame->arena, "quads [%F]", FmtSint(frame->tick))
);
G_StructuredBufferRef quads_ref = G_PushStructuredBufferRef(frame->gpu_arena, quads_buff, V_Quad);
@ -4496,12 +4498,12 @@ void V_TickForever(WaveLaneCtx *lane)
G_ResourceHandle dverts_buff = G_PushBufferFromCpuCopy(
frame->gpu_arena, frame->cl,
StringFromArena(frame->dverts_arena),
.debug = StringF(frame->arena, "dverts [%F]", FmtSint(frame->tick))
.name = StringF(frame->arena, "dverts [%F]", FmtSint(frame->tick))
);
G_ResourceHandle dvert_idxs_buff = G_PushBufferFromCpuCopy(
frame->gpu_arena, frame->cl,
StringFromArena(frame->dvert_idxs_arena),
.debug = StringF(frame->arena, "dvert idxs [%F]", FmtSint(frame->tick))
.name = StringF(frame->arena, "dvert idxs [%F]", FmtSint(frame->tick))
);
G_StructuredBufferRef dverts_ref = G_PushStructuredBufferRef(frame->gpu_arena, dverts_buff, V_DVert);
G_IndexBufferDesc dvert_idxs_ib = G_IdxBuff32(dvert_idxs_buff);
@ -4522,7 +4524,7 @@ void V_TickForever(WaveLaneCtx *lane)
gpu_emitters = G_PushBufferFromCpuCopy(
frame->gpu_arena, frame->cl,
StringFromStructs(flattened_emitters, frame->emitters_count),
.debug = StringF(frame->arena, "emitters [%F]", FmtSint(frame->tick))
.name = StringF(frame->arena, "emitters [%F]", FmtSint(frame->tick))
);
}
G_StructuredBufferRef gpu_emitters_ref = G_PushStructuredBufferRef(frame->gpu_arena, gpu_emitters, V_Emitter);
@ -4602,7 +4604,7 @@ void V_TickForever(WaveLaneCtx *lane)
G_ResourceHandle gpu_params = G_PushBufferFromCpuCopy(
frame->gpu_arena, frame->cl,
StringFromStruct(&params),
.debug = StringF(frame->arena, "Gpu params [%F]", FmtSint(frame->tick))
.name = StringF(frame->arena, "Gpu params [%F]", FmtSint(frame->tick))
);
G_StructuredBufferRef gpu_params_ref = G_PushStructuredBufferRef(frame->gpu_arena, gpu_params, V_GpuParams);

View File

@ -430,7 +430,7 @@ void SPR_TickAsync(WaveLaneCtx *lane, AsyncFrameLaneCtx *base_async_lane_frame)
G_Format_R8G8B8A8_Unorm_Srgb,
atlas->dims,
G_Layout_AnyQueue_ShaderRead_CopyRead_CopyWrite_Present,
.debug = Lit("Sprite atlas")
.name = Lit("Sprite atlas")
);
atlas->tex_ref = G_PushTexture2DRef(gpu_perm, atlas->tex);
}

View File

@ -1671,7 +1671,7 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
monitor_size,
G_Layout_DirectQueue_RenderTargetWrite,
.flags = G_ResourceFlag_AllowRenderTarget,
.debug = Lit("UI draw target")
.name = Lit("UI draw target")
);
G_Texture2DRef draw_target_ro = G_PushTexture2DRef(frame->gpu_arena, draw_target);
@ -1680,7 +1680,7 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
G_ResourceHandle rects_buff = G_PushBufferFromCpuCopy(
frame->gpu_arena, frame->cl,
StringFromArena(frame->rects_arena),
.debug = Lit("UI rects")
.name = Lit("UI rects")
);
G_StructuredBufferRef rects_ro = G_PushStructuredBufferRef(frame->gpu_arena, rects_buff, UI_GpuRect);
@ -1697,7 +1697,7 @@ void UI_EndFrame(UI_Frame *frame, i32 vsync)
G_ResourceHandle params_buff = G_PushBufferFromCpuCopy(
frame->gpu_arena, frame->cl,
StringFromStruct(&params),
.debug = Lit("UI gpu params")
.name = Lit("UI gpu params")
);
G_StructuredBufferRef params_ro = G_PushStructuredBufferRef(frame->gpu_arena, params_buff, UI_GpuParams);