From 92258b6f3e333ad4e4546c9cd28491d497f43a65 Mon Sep 17 00:00:00 2001 From: jacob Date: Thu, 19 Jun 2025 18:00:56 -0500 Subject: [PATCH] allow unbounded descriptor tables --- res/sh/common.hlsl | 13 +++++++++---- res/sh/material.hlsl | 22 +++++++--------------- res/sh/sh_common.h | 2 ++ src/gp_dx12.c | 2 +- 4 files changed, 19 insertions(+), 20 deletions(-) diff --git a/res/sh/common.hlsl b/res/sh/common.hlsl index a12dec72..3ec27bdd 100644 --- a/res/sh/common.hlsl +++ b/res/sh/common.hlsl @@ -1,18 +1,23 @@ #include "sh/sh_common.h" -#define DECL(t, n) t n : n - #define PI 3.14159265359 #define GOLDEN 1.61803398875 +#define DECL(t, n) t n : n +#define NURI(i) NonUniformResourceIndex(i) + +#if !SH_CPU +# define INLINE +#endif + /* Linear color from normalized sRGB */ -float4 linear_from_srgb(float4 srgb) +INLINE float4 linear_from_srgb(float4 srgb) { return float4(pow(srgb.rgb, 2.2), srgb.a); } /* Linear color from R8G8B8A8 sRGB */ -float4 linear_from_srgb32(uint srgb32) +INLINE float4 linear_from_srgb32(uint srgb32) { float4 res; res.r = ((srgb32 >> 0) & 0xFF) / 255.0; diff --git a/res/sh/material.hlsl b/res/sh/material.hlsl index ffee626f..50a5f165 100644 --- a/res/sh/material.hlsl +++ b/res/sh/material.hlsl @@ -15,19 +15,11 @@ "addressW = TEXTURE_ADDRESS_CLAMP, " \ "maxAnisotropy = 1)" -cbuffer cbuff : register(b0) -{ - struct sh_material_constants g_constants; -}; - +cbuffer cb : register(b0) { struct sh_material_constants g_constants; }; StructuredBuffer g_instances : register(t0); - -Texture2D g_texture : register(t1); - +Texture2D g_textures[] : register(t1); SamplerState g_sampler : register(s0); -/* TODO: Ensure `NonUniformResourceIndex` is used once bindless */ - /* ========================== * * Vertex shader * ========================== */ @@ -48,10 +40,10 @@ struct vs_output { DECL(float4, SV_Position); DECL(float2, uv); DECL(float4, tint_lin); + DECL(uint, texture_nuri); }; -[RootSignature(ROOTSIG)] -struct vs_output vs(struct vs_input input) +SH_ENTRY(ROOTSIG) struct vs_output vs(struct vs_input input) { struct sh_material_instance instance = g_instances[g_constants.instance_offset + input.SV_InstanceID]; float2 vert = g_quad_verts[input.SV_VertexID]; @@ -61,6 +53,7 @@ struct vs_output vs(struct vs_input input) output.SV_Position = mul(g_constants.projection, float4(world_pos, 0, 1)); output.uv = instance.uv0 + ((vert + 0.5) * (instance.uv1 - instance.uv0)); output.tint_lin = linear_from_srgb32(instance.tint_srgb); + output.texture_nuri = instance.texture_nuri; return output; } @@ -76,10 +69,9 @@ struct ps_output { DECL(float4, SV_Target); }; -[RootSignature(ROOTSIG)] -struct ps_output ps(struct ps_input input) +SH_ENTRY(ROOTSIG) struct ps_output ps(struct ps_input input) { struct ps_output output; - output.SV_Target = g_texture.Sample(g_sampler, input.vs.uv) * input.vs.tint_lin; + output.SV_Target = g_textures[NURI(input.vs.texture_nuri)].Sample(g_sampler, input.vs.uv) * input.vs.tint_lin; return output; } diff --git a/res/sh/sh_common.h b/res/sh/sh_common.h index f42ea40b..75a2e3c0 100644 --- a/res/sh/sh_common.h +++ b/res/sh/sh_common.h @@ -7,6 +7,7 @@ #define SH_STRUCT(s) PACK(struct s) #define SH_DECL(t, n) struct CAT(sh_, t) n +#define SH_ENTRY static /* For intellisense */ struct sh_uint { u32 v; }; INLINE struct sh_uint sh_uint_from_u32(u32 v) @@ -52,6 +53,7 @@ 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_ENTRY(rootsig) [RootSignature(rootsig)] #endif diff --git a/src/gp_dx12.c b/src/gp_dx12.c index b9cf7bca..50f4a0a2 100644 --- a/src/gp_dx12.c +++ b/src/gp_dx12.c @@ -839,7 +839,7 @@ INTERNAL WORK_TASK_FUNC_DEF(shader_compile_task, comp_arg_raw) if (resource_exists(shader_res)) { struct dx12_include_handler *include_handler = dx12_include_handler_alloc(scratch.arena, pipeline); - u32 d3d_compile_flags = 0; + u32 d3d_compile_flags = D3DCOMPILE_ENABLE_UNBOUNDED_DESCRIPTOR_TABLES; #if DX12_SHADER_DEBUG d3d_compile_flags |= D3DCOMPILE_DEBUG | D3DCOMPILE_SKIP_OPTIMIZATION | D3DCOMPILE_ENABLE_STRICTNESS; #else