diff --git a/src/gp.h b/src/gp.h index 8a604005..422c9290 100644 --- a/src/gp.h +++ b/src/gp.h @@ -76,7 +76,7 @@ struct gp_render_cmd_desc { u32 tint; b32 is_light; struct v3 light_emittance; - i32 grid_cmd_id; + u32 grid_cmd_id; } material; struct { struct xform xf; @@ -114,7 +114,7 @@ struct gp_render_params { struct gp_render_sig *gp_render_sig_alloc(void); /* Returns a cmd id internal to the sig */ -i32 gp_push_render_cmd(struct gp_render_sig *render_sig, struct gp_render_cmd_desc *desc); +u32 gp_push_render_cmd(struct gp_render_sig *render_sig, struct gp_render_cmd_desc *desc); struct gp_resource *gp_run_render(struct gp_render_sig *gp_render_sig, struct gp_render_params render_params); diff --git a/src/gp_dx12.c b/src/gp_dx12.c index f0b30069..adb5b588 100644 --- a/src/gp_dx12.c +++ b/src/gp_dx12.c @@ -2580,7 +2580,7 @@ struct material_instance_desc { u32 tint; b32 is_light; struct v3 light_emittance; - i32 grid_id; + u32 grid_id; }; struct ui_rect_instance_desc { @@ -2649,9 +2649,9 @@ struct gp_render_sig *gp_render_sig_alloc(void) return (struct gp_render_sig *)sig; } -i32 gp_push_render_cmd(struct gp_render_sig *render_sig, struct gp_render_cmd_desc *cmd_desc) +u32 gp_push_render_cmd(struct gp_render_sig *render_sig, struct gp_render_cmd_desc *cmd_desc) { - i32 ret = 0; + u32 ret = 0; struct render_sig *sig = (struct render_sig *)render_sig; if (sig) { switch (cmd_desc->kind) { @@ -2809,7 +2809,7 @@ struct gp_resource *gp_run_render(struct gp_render_sig *gp_render_sig, struct gp for (u32 i = 0; i < rsig->num_material_instance_descs; ++i) { struct material_instance_desc *desc = &((struct material_instance_desc *)arena_base(rsig->material_instance_descs_arena))[i]; struct sh_material_instance *instance = &material_instances[i]; - i32 texture_id = -1; + u32 texture_id = 0xFFFFFFFF; if (desc->texture != 0) { texture_id = desc->texture->srv_descriptor->index; } else if (desc->sprite.hash != 0) { @@ -2819,8 +2819,8 @@ struct gp_resource *gp_run_render(struct gp_render_sig *gp_render_sig, struct gp texture_id = texture->srv_descriptor->index; } } - instance->tex_nurid = sh_int_from_i32(texture_id); - instance->grid_id = sh_int_from_i32(desc->grid_id); + instance->tex_nurid = sh_uint_from_u32(texture_id); + instance->grid_id = sh_uint_from_u32(desc->grid_id); instance->xf = sh_float2x3_from_xform(desc->xf); instance->uv0 = sh_float2_from_v2(desc->clip.p0); instance->uv1 = sh_float2_from_v2(desc->clip.p1); @@ -2836,7 +2836,7 @@ struct gp_resource *gp_run_render(struct gp_render_sig *gp_render_sig, struct gp for (u32 i = 0; i < rsig->num_ui_rect_instance_descs; ++i) { struct ui_rect_instance_desc *desc = &((struct ui_rect_instance_desc *)arena_base(rsig->ui_rect_instance_descs_arena))[i]; struct sh_ui_instance *instance = &ui_rect_instances[i]; - i32 texture_id = -1; + u32 texture_id = 0xFFFFFFFF; if (desc->texture != 0) { texture_id = desc->texture->srv_descriptor->index; } else if (desc->sprite.hash != 0) { @@ -2846,7 +2846,7 @@ struct gp_resource *gp_run_render(struct gp_render_sig *gp_render_sig, struct gp texture_id = texture->srv_descriptor->index; } } - instance->tex_nurid = sh_int_from_i32(texture_id); + instance->tex_nurid = sh_uint_from_u32(texture_id); instance->xf = sh_float2x3_from_xform(desc->xf); instance->uv0 = sh_float2_from_v2(desc->clip.p0); instance->uv1 = sh_float2_from_v2(desc->clip.p1); diff --git a/src/sh/common.hlsl b/src/sh/common.hlsl index d35c95f5..ce10a916 100644 --- a/src/sh/common.hlsl +++ b/src/sh/common.hlsl @@ -6,7 +6,7 @@ #define DECLS(t, n) t n : n -#define resource_from_urid(urid) ResourceDescriptorHeap[(urid)] +#define resource_from_urid(urid) ResourceDescriptorHeap[urid] #define resource_from_nurid(nurid) ResourceDescriptorHeap[NonUniformResourceIndex(nurid)] #if !SH_CPU diff --git a/src/sh/material.hlsl_rs b/src/sh/material.hlsl_rs index c0effae7..02aeb3c2 100644 --- a/src/sh/material.hlsl_rs +++ b/src/sh/material.hlsl_rs @@ -12,8 +12,8 @@ struct vs_input { }; struct vs_output { - nointerpolation DECLS(int, tex_nurid); - nointerpolation DECLS(int, grid_id); + nointerpolation DECLS(uint, tex_nurid); + nointerpolation DECLS(uint, grid_id); DECLS(float2, uv); DECLS(float4, tint_lin); DECLS(float4, emittance_lin); @@ -61,13 +61,13 @@ SH_ENTRY struct ps_output ps(struct ps_input input) float4 albedo = input.vs.tint_lin; /* Texture */ - if (input.vs.tex_nurid >= 0) { + if (input.vs.tex_nurid < 0xFFFFFFFF) { Texture2D tex = resource_from_nurid(input.vs.tex_nurid); albedo *= tex.Sample(s_point_clamp, input.vs.uv); } /* Grid */ - if (input.vs.grid_id >= 0) { + if (input.vs.grid_id < 0xFFFFFFFF) { StructuredBuffer grids = resource_from_urid(sig.grids_urid); struct sh_material_grid grid = grids[input.vs.grid_id]; float2 grid_pos = input.vs.SV_Position.xy + grid.offset; diff --git a/src/sh/sh_common.h b/src/sh/sh_common.h index 5d3f0542..b8c1f862 100644 --- a/src/sh/sh_common.h +++ b/src/sh/sh_common.h @@ -3,6 +3,7 @@ #define SH_STRUCT(s) PACK(struct s) #define SH_DECL(t, n) struct CAT(sh_, t) n #define SH_DECLS(t, n) SH_DECL(t, n) +#define SH_STATIC_ASSERT(c) STATIC_ASSERT(c) struct sh_uint { u32 v; }; INLINE struct sh_uint sh_uint_from_u32(u32 v) @@ -75,9 +76,14 @@ INLINE struct sh_float2x3 sh_float2x3_from_xform(struct xform v) #define SH_STRUCT(s) struct s #define SH_DECL(t, n) t n #define SH_DECLS(t, n) t n : n +#define SH_STATIC_ASSERT(c) _Static_assert(c, "") #endif +#define SH_ASSERT_ROOT_CONST(s, n) SH_STATIC_ASSERT((sizeof(s) % 16 == 0) && /* Root constant struct should pad to 16 byte alignment */ \ + ((sizeof(s) / 4) == n) && /* Root constant struct size should match the specified 32-bit-constant count */ \ + (sizeof(s) <= 256)) /* Root constant struct can only fit 64 DWORDS */ + /* ========================== * * Global textures * ========================== */ @@ -93,18 +99,19 @@ INLINE struct sh_float2x3 sh_float2x3_from_xform(struct xform v) * ========================== */ SH_STRUCT(sh_material_sig { - /* ---------------------------------------------------- */ - SH_DECL(float4x4, projection); /* 16 consts */ - /* ---------------------------------------------------- */ - SH_DECL(uint, instances_urid); /* 01 consts */ - SH_DECL(uint, grids_urid); /* 01 consts */ - SH_DECL(uint2, _pad0); /* 02 consts (padding) */ - /* ---------------------------------------------------- */ + /* ----------------------------------------------------- */ + SH_DECL(float4x4, projection); /* 16 consts */ + /* ----------------------------------------------------- */ + SH_DECL(uint, instances_urid); /* 01 consts */ + SH_DECL(uint, grids_urid); /* 01 consts */ + SH_DECL(uint2, _pad0); /* 02 consts (padding) */ + /* ----------------------------------------------------- */ }); +SH_ASSERT_ROOT_CONST(struct sh_material_sig, 20); SH_STRUCT(sh_material_instance { - SH_DECL(int, tex_nurid); - SH_DECL(int, grid_id); + SH_DECL(uint, tex_nurid); + SH_DECL(uint, grid_id); SH_DECL(float2x3, xf); SH_DECL(float2, uv0); SH_DECL(float2, uv1); @@ -129,17 +136,18 @@ SH_STRUCT(sh_material_grid { * ========================== */ SH_STRUCT(sh_flood_sig { - /* ---------------------------------------------------- */ - SH_DECL(int, step_len); /* 01 consts */ - SH_DECL(uint, emittance_tex_urid); /* 01 consts */ - SH_DECL(uint, read_flood_tex_urid); /* 01 consts */ - SH_DECL(uint, target_flood_tex_urid); /* 01 consts */ - /* ---------------------------------------------------- */ - SH_DECL(uint, tex_width); /* 01 consts */ - SH_DECL(uint, tex_height); /* 01 consts */ - SH_DECL(uint2, _pad0); /* 02 consts (padding) */ - /* ---------------------------------------------------- */ + /* ----------------------------------------------------- */ + SH_DECL(int, step_len); /* 01 consts */ + SH_DECL(uint, emittance_tex_urid); /* 01 consts */ + SH_DECL(uint, read_flood_tex_urid); /* 01 consts */ + SH_DECL(uint, target_flood_tex_urid); /* 01 consts */ + /* ----------------------------------------------------- */ + SH_DECL(uint, tex_width); /* 01 consts */ + SH_DECL(uint, tex_height); /* 01 consts */ + SH_DECL(uint2, _pad0); /* 02 consts (padding) */ + /* ----------------------------------------------------- */ }); +SH_ASSERT_ROOT_CONST(struct sh_flood_sig, 8); /* ========================== * * Shade shader structs @@ -149,34 +157,36 @@ SH_STRUCT(sh_flood_sig { #define SH_SHADE_FLAG_DISABLE_EFFECTS (1 << 0) SH_STRUCT(sh_shade_sig { - /* ---------------------------------------------------- */ - SH_DECL(uint4, frame_seed); /* 04 consts */ - /* ---------------------------------------------------- */ - SH_DECL(uint, flags); /* 01 consts */ - SH_DECL(uint, _pad0); /* 01 consts (padding) */ - SH_DECL(uint, tex_width); /* 01 consts */ - SH_DECL(uint, tex_height); /* 01 consts */ - /* ---------------------------------------------------- */ - SH_DECL(float2, camera_offset); /* 02 consts */ - SH_DECL(uint, frame_index); /* 01 consts */ - SH_DECL(uint, albedo_tex_urid); /* 01 consts */ - /* ---------------------------------------------------- */ - SH_DECL(uint, emittance_tex_urid); /* 01 consts */ - SH_DECL(uint, emittance_flood_tex_urid); /* 01 consts */ - SH_DECL(uint, read_tex_urid); /* 01 consts */ - SH_DECL(uint, target_tex_urid); /* 01 consts */ - /* ---------------------------------------------------- */ + /* ----------------------------------------------------- */ + SH_DECL(uint4, frame_seed); /* 04 consts */ + /* ----------------------------------------------------- */ + SH_DECL(uint, flags); /* 01 consts */ + SH_DECL(uint, _pad0); /* 01 consts (padding) */ + SH_DECL(uint, tex_width); /* 01 consts */ + SH_DECL(uint, tex_height); /* 01 consts */ + /* ----------------------------------------------------- */ + SH_DECL(float2, camera_offset); /* 02 consts */ + SH_DECL(uint, frame_index); /* 01 consts */ + SH_DECL(uint, albedo_tex_urid); /* 01 consts */ + /* ----------------------------------------------------- */ + SH_DECL(uint, emittance_tex_urid); /* 01 consts */ + SH_DECL(uint, emittance_flood_tex_urid); /* 01 consts */ + SH_DECL(uint, read_tex_urid); /* 01 consts */ + SH_DECL(uint, target_tex_urid); /* 01 consts */ + /* ----------------------------------------------------- */ }); +SH_ASSERT_ROOT_CONST(struct sh_shade_sig, 16); /* ========================== * * Shape shader structs * ========================== */ SH_STRUCT(sh_shape_sig { - /* ---------------------------------------------------- */ - SH_DECL(float4x4, projection); /* 16 consts */ - /* ---------------------------------------------------- */ + /* ----------------------------------------------------- */ + SH_DECL(float4x4, projection); /* 16 consts */ + /* ----------------------------------------------------- */ }); +SH_ASSERT_ROOT_CONST(struct sh_shape_sig, 16); SH_STRUCT(sh_shape_vert { SH_DECLS(float2, pos); @@ -188,17 +198,18 @@ SH_STRUCT(sh_shape_vert { * ========================== */ SH_STRUCT(sh_ui_sig { - /* ---------------------------------------------------- */ - SH_DECL(float4x4, projection); /* 16 consts */ - /* ---------------------------------------------------- */ - SH_DECL(uint, instances_urid); /* 01 consts */ - SH_DECL(uint3, _pad0); /* 03 consts (padding) */ - /* ---------------------------------------------------- */ + /* ----------------------------------------------------- */ + SH_DECL(float4x4, projection); /* 16 consts */ + /* ----------------------------------------------------- */ + SH_DECL(uint, instances_urid); /* 01 consts */ + SH_DECL(uint3, _pad0); /* 03 consts (padding) */ + /* ----------------------------------------------------- */ }); +SH_ASSERT_ROOT_CONST(struct sh_ui_sig, 20); SH_STRUCT(sh_ui_instance { - SH_DECL(int, tex_nurid); - SH_DECL(int, grid_id); + SH_DECL(uint, tex_nurid); + SH_DECL(uint, grid_id); SH_DECL(float2x3, xf); SH_DECL(float2, uv0); SH_DECL(float2, uv1); @@ -214,12 +225,13 @@ SH_STRUCT(sh_ui_instance { #define SH_BLIT_FLAG_GAMMA_CORRECT (1 << 1) SH_STRUCT(sh_blit_sig { - /* ---------------------------------------------------- */ - SH_DECL(float4x4, projection); /* 16 consts */ - /* ---------------------------------------------------- */ - SH_DECL(uint, flags); /* 01 consts */ - SH_DECL(uint, tex_urid); /* 01 consts */ - SH_DECL(float, exposure); /* 01 consts */ - SH_DECL(float, gamma); /* 01 consts */ - /* ---------------------------------------------------- */ + /* ----------------------------------------------------- */ + SH_DECL(float4x4, projection); /* 16 consts */ + /* ----------------------------------------------------- */ + SH_DECL(uint, flags); /* 01 consts */ + SH_DECL(uint, tex_urid); /* 01 consts */ + SH_DECL(float, exposure); /* 01 consts */ + SH_DECL(float, gamma); /* 01 consts */ + /* ----------------------------------------------------- */ }); +SH_ASSERT_ROOT_CONST(struct sh_blit_sig, 20); diff --git a/src/sh/ui.hlsl_rs b/src/sh/ui.hlsl_rs index cacae341..fabd9c00 100644 --- a/src/sh/ui.hlsl_rs +++ b/src/sh/ui.hlsl_rs @@ -12,7 +12,7 @@ struct vs_input { }; struct vs_output { - nointerpolation DECLS(int, tex_nurid); + nointerpolation DECLS(uint, tex_nurid); DECLS(float2, uv); DECLS(float4, tint_srgb); DECLS(float4, SV_Position); @@ -58,7 +58,7 @@ SH_ENTRY struct ps_output ps(struct ps_input input) float4 color = input.vs.tint_srgb; /* Texture */ - if (input.vs.tex_nurid >= 0) { + if (input.vs.tex_nurid < 0xFFFFFFFF) { Texture2D tex = resource_from_nurid(input.vs.tex_nurid); color *= tex.Sample(s_point_clamp, input.vs.uv); }