diff --git a/src/base/base.cgh b/src/base/base.cgh index 09698c05..a3210695 100644 --- a/src/base/base.cgh +++ b/src/base/base.cgh @@ -465,7 +465,6 @@ #endif #endif - //////////////////////////////////////////////////////////// //~ Scalar types @@ -715,9 +714,7 @@ #endif //////////////////////////////////////////////////////////// -//~ C <-> Shader interop types - -//- Shader linkage +//~ Shader linkage types #if IsLanguageC Struct(VertexShader) { ResourceKey resource; }; @@ -732,59 +729,6 @@ #define PixelShader(name, return_type, ...) return_type name(__VA_ARGS__) #endif -//- Shader resource references - -Enum(ShaderRefKind) -{ - ShaderRefKind_StructuredBuffer, - ShaderRefKind_RWStructuredBuffer, - ShaderRefKind_ByteAddressBuffer, - ShaderRefKind_RWByteAddressBuffer, - ShaderRefKind_Texture1D, - ShaderRefKind_RWTexture1D, - ShaderRefKind_Texture2D, - ShaderRefKind_RWTexture2D, - ShaderRefKind_Texture3D, - ShaderRefKind_RWTexture3D, - ShaderRefKind_SamplerState, -}; - -Struct(StructuredBufferRef) { u32 v; }; -Struct(RWStructuredBufferRef) { u32 v; }; -Struct(ByteAddressBufferRef) { u32 v; }; -Struct(RWByteAddressBufferRef) { u32 v; }; -Struct(Texture1DRef) { u32 v; }; -Struct(RWTexture1DRef) { u32 v; }; -Struct(Texture2DRef) { u32 v; }; -Struct(RWTexture2DRef) { u32 v; }; -Struct(Texture3DRef) { u32 v; }; -Struct(RWTexture3DRef) { u32 v; }; -Struct(SamplerStateRef) { u32 v; }; - -#define IsShaderRefNil(h) ((h).v == 0) - -//- Shader constants - -/* - * NOTE: D3d12 exposes 64 root constants, and vulkan 32 push constants. - * Other constants past the max can be used by the graphics - * implementation backend layer. - */ -#define NumGeneralPurposeShaderConstants (8) - -#if IsLanguageC - #define ForceShaderConstant(type, name, slot) \ - Enum(name##__shaderconstantenum) { name = slot }; \ - Struct(name##__shaderconstanttype) { type v; } - #define ShaderConstant(type, name, slot) \ - StaticAssert(sizeof(type) <= 4); \ - StaticAssert(slot < NumGeneralPurposeShaderConstants); \ - ForceShaderConstant(type, name, slot) -#elif IsLanguageG - #define ForceShaderConstant(type, name, slot) cbuffer name : register(b##slot) { type name; } - #define ShaderConstant(type, name, slot) ForceShaderConstant(type, name, slot) -#endif - //////////////////////////////////////////////////////////// //~ Exit callback types diff --git a/src/base/base_shader.gh b/src/base/base_shader.gh index 5fb1e48e..75ac7674 100644 --- a/src/base/base_shader.gh +++ b/src/base/base_shader.gh @@ -1,5 +1,5 @@ //////////////////////////////////////////////////////////// -//~ Shader math types +//~ Math types #define Pi ((f32)3.14159265358979323846) #define Tau ((f32)6.28318530717958647693) @@ -21,42 +21,10 @@ typedef float4 Aabb; typedef float4 Quad; typedef float4x4 Mat4x4; -//////////////////////////////////////////////////////////// -//~ Dereference - -/* TODO: Non-uniform resource access is assumed as the default behavior. We - * may want to add explicit "uniform" variants for optimization on AMD devices - * in the future. */ - -template StructuredBuffer StructuredBufferFromRef(StructuredBufferRef h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } -template RWStructuredBuffer RWStructuredBufferFromRef(RWStructuredBufferRef h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } - -ByteAddressBuffer ByteAddressBufferFromRef(ByteAddressBufferRef h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } -RWByteAddressBuffer RWByteAddressBufferFromRef(RWByteAddressBufferRef h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } - -template Texture1D Texture1DFromRef(Texture1DRef h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } -template Texture3D Texture3DFromRef(Texture3DRef h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } -template RWTexture1D RWTexture1DFromRef(RWTexture1DRef h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } -template Texture2D Texture2DFromRef(Texture2DRef h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } -template RWTexture2D RWTexture2DFromRef(RWTexture2DRef h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } -template RWTexture3D RWTexture3DFromRef(RWTexture3DRef h) { return ResourceDescriptorHeap[NonUniformResourceIndex(h.v)]; } - -SamplerState SamplerStateFromRef(SamplerStateRef h) { return SamplerDescriptorHeap[NonUniformResourceIndex(h.v)]; } - //////////////////////////////////////////////////////////// //~ Countof template u32 countof(T arr[N]) { return N; } -template u32 countof(StructuredBuffer buff) { u32 result; buff.GetDimensions(result); return result; } -template u32 countof(RWStructuredBuffer buff) { u32 result; buff.GetDimensions(result); return result; } - u32 countof(ByteAddressBuffer buff) { u32 result; buff.GetDimensions(result); return result; } - u32 countof(RWByteAddressBuffer buff) { u32 result; buff.GetDimensions(result); return result; } - u32 countof(Texture1D tex) { u32 result; tex.GetDimensions(result); return result; } -template u32 countof(RWTexture1D tex) { u32 result; tex.GetDimensions(result); return result; } - Vec2U32 countof(Texture2D tex) { Vec2U32 result; tex.GetDimensions(result.x, result.y); return result; } -template Vec2U32 countof(RWTexture2D tex) { Vec2U32 result; tex.GetDimensions(result.x, result.y); return result; } - Vec3U32 countof(Texture3D tex) { Vec3U32 result; tex.GetDimensions(result.x, result.y, result.z); return result; } -template Vec3U32 countof(RWTexture3D tex) { Vec3U32 result; tex.GetDimensions(result.x, result.y, result.z); return result; } //////////////////////////////////////////////////////////// //~ Color helpers diff --git a/src/glyph_cache/glyph_cache.h b/src/glyph_cache/glyph_cache.h index 249ef94b..e723f119 100644 --- a/src/glyph_cache/glyph_cache.h +++ b/src/glyph_cache/glyph_cache.h @@ -16,7 +16,7 @@ Struct(GC_RunRect) f32 advance; Vec2 size; - Texture2DRef tex; + G_Texture2DRef tex; Rng2 uv; }; diff --git a/src/gpu/gpu.lay b/src/gpu/gpu.lay index a2072ffb..e303ea03 100644 --- a/src/gpu/gpu.lay +++ b/src/gpu/gpu.lay @@ -13,8 +13,8 @@ ////////////////////////////// //- Api -@IncludeC gpu_core.h @IncludeC gpu_shader_core.cgh +@IncludeC gpu_core.h @IncludeC gpu_common.h @IncludeG gpu_shader_core.cgh diff --git a/src/gpu/gpu_core.h b/src/gpu/gpu_core.h index deecec6f..986fb9bf 100644 --- a/src/gpu/gpu_core.h +++ b/src/gpu/gpu_core.h @@ -430,7 +430,7 @@ Struct(G_SamplerResourceDesc) Struct(G_RefDesc) { - ShaderRefKind kind; + G_RefKind kind; u64 element_size; u64 element_offset; @@ -580,59 +580,59 @@ i32 G_CountDepth(G_ResourceHandle texture); u32 G_PushRef(G_ArenaHandle arena, G_ResourceHandle resource, G_RefDesc desc); -#define G_PushStructuredBufferRef(arena, resource, type, ...) (StructuredBufferRef) { \ - .v = G_PushRef((arena), (resource), \ - (G_RefDesc) { .kind = ShaderRefKind_StructuredBuffer, .element_size = sizeof(type), __VA_ARGS__ }) \ +#define G_PushStructuredBufferRef(arena, resource, type, ...) (G_StructuredBufferRef) { \ + .v = G_PushRef((arena), (resource), \ + (G_RefDesc) { .kind = G_RefKind_StructuredBuffer, .element_size = sizeof(type), __VA_ARGS__ }) \ } -#define G_PushRWStructuredBufferRef(arena, resource, type, ...) (RWStructuredBufferRef) { \ - .v = G_PushRef((arena), (resource), \ - (G_RefDesc) { .kind = ShaderRefKind_RWStructuredBuffer, .element_size = sizeof(type), __VA_ARGS__ }) \ +#define G_PushRWStructuredBufferRef(arena, resource, type, ...) (G_RWStructuredBufferRef) { \ + .v = G_PushRef((arena), (resource), \ + (G_RefDesc) { .kind = G_RefKind_RWStructuredBuffer, .element_size = sizeof(type), __VA_ARGS__ }) \ } -#define G_PushByteAddressBufferRef(arena, resource, ...) (ByteAddressBufferRef) { \ - .v = G_PushRef((arena), (resource), \ - (G_RefDesc) { .kind = ShaderRefKind_ByteAddressBuffer, __VA_ARGS__ }) \ +#define G_PushByteAddressBufferRef(arena, resource, ...) (G_ByteAddressBufferRef) { \ + .v = G_PushRef((arena), (resource), \ + (G_RefDesc) { .kind = G_RefKind_ByteAddressBuffer, __VA_ARGS__ }) \ } -#define G_PushRWByteAddressBufferRef(arena, resource, ...) (RWByteAddressBufferRef) { \ - .v = G_PushRef((arena), (resource), \ - (G_RefDesc) { .kind = ShaderRefKind_RWByteAddressBuffer, __VA_ARGS__ }) \ +#define G_PushRWByteAddressBufferRef(arena, resource, ...) (G_RWByteAddressBufferRef) { \ + .v = G_PushRef((arena), (resource), \ + (G_RefDesc) { .kind = G_RefKind_RWByteAddressBuffer, __VA_ARGS__ }) \ } -#define G_PushTexture1DRef(arena, resource, ...) (Texture1DRef) { \ - .v = G_PushRef((arena), (resource), \ - (G_RefDesc) { .kind = ShaderRefKind_Texture1D, __VA_ARGS__ }) \ +#define G_PushTexture1DRef(arena, resource, ...) (G_Texture1DRef) { \ + .v = G_PushRef((arena), (resource), \ + (G_RefDesc) { .kind = G_RefKind_Texture1D, __VA_ARGS__ }) \ } -#define G_PushRWTexture1DRef(arena, resource, ...) (RWTexture1DRef) { \ - .v = G_PushRef((arena), (resource), \ - (G_RefDesc) { .kind = ShaderRefKind_RWTexture1D, __VA_ARGS__ }) \ +#define G_PushRWTexture1DRef(arena, resource, ...) (G_RWTexture1DRef) { \ + .v = G_PushRef((arena), (resource), \ + (G_RefDesc) { .kind = G_RefKind_RWTexture1D, __VA_ARGS__ }) \ } -#define G_PushTexture2DRef(arena, resource, ...) (Texture2DRef) { \ - .v = G_PushRef((arena), (resource), \ - (G_RefDesc) { .kind = ShaderRefKind_Texture2D, __VA_ARGS__ }) \ +#define G_PushTexture2DRef(arena, resource, ...) (G_Texture2DRef) { \ + .v = G_PushRef((arena), (resource), \ + (G_RefDesc) { .kind = G_RefKind_Texture2D, __VA_ARGS__ }) \ } -#define G_PushRWTexture2DRef(arena, resource, ...) (RWTexture2DRef) { \ - .v = G_PushRef((arena), (resource), \ - (G_RefDesc) { .kind = ShaderRefKind_RWTexture2D, __VA_ARGS__ }) \ +#define G_PushRWTexture2DRef(arena, resource, ...) (G_RWTexture2DRef) { \ + .v = G_PushRef((arena), (resource), \ + (G_RefDesc) { .kind = G_RefKind_RWTexture2D, __VA_ARGS__ }) \ } -#define G_PushTexture3DRef(arena, resource, ...) (Texture3DRef) { \ - .v = G_PushRef((arena), (resource), \ - (G_RefDesc) { .kind = ShaderRefKind_Texture3D, __VA_ARGS__ }) \ +#define G_PushTexture3DRef(arena, resource, ...) (G_Texture3DRef) { \ + .v = G_PushRef((arena), (resource), \ + (G_RefDesc) { .kind = G_RefKind_Texture3D, __VA_ARGS__ }) \ } -#define G_PushRWTexture3DRef(arena, resource, ...) (RWTexture3DRef) { \ - .v = G_PushRef((arena), (resource), \ - (G_RefDesc) { .kind = ShaderRefKind_RWTexture3D, __VA_ARGS__ }) \ +#define G_PushRWTexture3DRef(arena, resource, ...) (G_RWTexture3DRef) { \ + .v = G_PushRef((arena), (resource), \ + (G_RefDesc) { .kind = G_RefKind_RWTexture3D, __VA_ARGS__ }) \ } -#define G_PushSamplerStateRef(arena, resource, ...) (SamplerStateRef) { \ - .v = G_PushRef((arena), (resource), \ - (G_RefDesc) { .kind = ShaderRefKind_SamplerState, __VA_ARGS__ }) \ +#define G_PushSamplerStateRef(arena, resource, ...) (G_SamplerStateRef) { \ + .v = G_PushRef((arena), (resource), \ + (G_RefDesc) { .kind = G_RefKind_SamplerState, __VA_ARGS__ }) \ } //////////////////////////////////////////////////////////// diff --git a/src/gpu/gpu_dx12/gpu_dx12_core.c b/src/gpu/gpu_dx12/gpu_dx12_core.c index b3100d46..6e3a9f92 100644 --- a/src/gpu/gpu_dx12/gpu_dx12_core.c +++ b/src/gpu/gpu_dx12/gpu_dx12_core.c @@ -247,8 +247,8 @@ void G_Bootstrap(void) ID3D10Blob *blob = 0; if (SUCCEEDED(hr)) { - D3D12_ROOT_PARAMETER params[G_D12_NumShaderConstants] = ZI; - for (i32 slot = 0; slot < G_D12_NumShaderConstants; ++slot) + D3D12_ROOT_PARAMETER params[G_D12_NumConstants] = ZI; + for (i32 slot = 0; slot < G_D12_NumConstants; ++slot) { D3D12_ROOT_PARAMETER *param = ¶ms[slot]; param->ParameterType = D3D12_ROOT_PARAMETER_TYPE_32BIT_CONSTANTS; @@ -1061,25 +1061,25 @@ u32 G_PushRef(G_ArenaHandle arena_handle, G_ResourceHandle resource_handle, G_Re G_D12_Resource *resource = G_D12_ResourceFromHandle(resource_handle); u32 result = 0; - ShaderRefKind kind = ref_desc.kind; + G_RefKind kind = ref_desc.kind; - b32 is_buffer = kind == ShaderRefKind_StructuredBuffer || - kind == ShaderRefKind_RWStructuredBuffer || - kind == ShaderRefKind_ByteAddressBuffer || - kind == ShaderRefKind_RWByteAddressBuffer; + b32 is_buffer = kind == G_RefKind_StructuredBuffer || + kind == G_RefKind_RWStructuredBuffer || + kind == G_RefKind_ByteAddressBuffer || + kind == G_RefKind_RWByteAddressBuffer; - b32 is_sampler = kind == ShaderRefKind_SamplerState; + b32 is_sampler = kind == G_RefKind_SamplerState; b32 is_texture = !is_buffer && !is_sampler; - b32 is_raw = kind == ShaderRefKind_ByteAddressBuffer || - kind == ShaderRefKind_RWByteAddressBuffer; + b32 is_raw = kind == G_RefKind_ByteAddressBuffer || + kind == G_RefKind_RWByteAddressBuffer; - b32 is_uav = kind == ShaderRefKind_RWStructuredBuffer || - kind == ShaderRefKind_RWByteAddressBuffer || - kind == ShaderRefKind_RWTexture1D || - kind == ShaderRefKind_RWTexture2D || - kind == ShaderRefKind_RWTexture3D; + b32 is_uav = kind == G_RefKind_RWStructuredBuffer || + kind == G_RefKind_RWByteAddressBuffer || + kind == G_RefKind_RWTexture1D || + kind == G_RefKind_RWTexture2D || + kind == G_RefKind_RWTexture3D; @@ -1526,9 +1526,9 @@ void G_CommitCommandListEx(G_CommandListHandle cl_handle, u64 fence_ops_count, G G_D12_Pipeline *bound_pipeline = 0; /* Constants state */ - u64 slotted_constants[G_D12_NumShaderConstants]; - u64 bound_compute_constants[G_D12_NumShaderConstants]; - u64 bound_graphics_constants[G_D12_NumShaderConstants]; + u64 slotted_constants[G_D12_NumConstants]; + u64 bound_compute_constants[G_D12_NumConstants]; + u64 bound_graphics_constants[G_D12_NumConstants]; for (i32 i = 0; i < countof(slotted_constants); ++i) { slotted_constants[i] = 0; } /* Zero initialze all constant slots */ for (i32 i = 0; i < countof(bound_compute_constants); ++i) { bound_compute_constants[i] = U64Max; } for (i32 i = 0; i < countof(bound_graphics_constants); ++i) { bound_graphics_constants[i] = U64Max; } diff --git a/src/gpu/gpu_dx12/gpu_dx12_shader_core.cgh b/src/gpu/gpu_dx12/gpu_dx12_shader_core.cgh index 1ccb4c61..c7baad40 100644 --- a/src/gpu/gpu_dx12/gpu_dx12_shader_core.cgh +++ b/src/gpu/gpu_dx12/gpu_dx12_shader_core.cgh @@ -5,10 +5,10 @@ //~ Global constants /* Slots below assume they won't overlap user defined constants */ -StaticAssert(NumGeneralPurposeShaderConstants == 8); +StaticAssert(G_NumGeneralPurposeConstants == 8); -ForceShaderConstant(RWByteAddressBufferRef, G_D12_DebugPrintBuff, 8); -#define G_D12_NumShaderConstants (9) +G_ForceDeclConstant(G_RWByteAddressBufferRef, G_D12_DebugPrintBuff, 8); +#define G_D12_NumConstants (9) //////////////////////////////////////////////////////////// //~ @hookimpl Shader printf diff --git a/src/gpu/gpu_shader_core.cgh b/src/gpu/gpu_shader_core.cgh index 0863d722..bd4a0c0a 100644 --- a/src/gpu/gpu_shader_core.cgh +++ b/src/gpu/gpu_shader_core.cgh @@ -1,17 +1,112 @@ //////////////////////////////////////////////////////////// -//~ Shared static handles (common resources available to all shaders) +//~ Ref types + +Enum(G_RefKind) +{ + G_RefKind_StructuredBuffer, + G_RefKind_RWStructuredBuffer, + G_RefKind_ByteAddressBuffer, + G_RefKind_RWByteAddressBuffer, + G_RefKind_Texture1D, + G_RefKind_RWTexture1D, + G_RefKind_Texture2D, + G_RefKind_RWTexture2D, + G_RefKind_Texture3D, + G_RefKind_RWTexture3D, + G_RefKind_SamplerState, +}; + +Struct(G_StructuredBufferRef) { u32 v; }; +Struct(G_RWStructuredBufferRef) { u32 v; }; +Struct(G_ByteAddressBufferRef) { u32 v; }; +Struct(G_RWByteAddressBufferRef) { u32 v; }; +Struct(G_Texture1DRef) { u32 v; }; +Struct(G_RWTexture1DRef) { u32 v; }; +Struct(G_Texture2DRef) { u32 v; }; +Struct(G_RWTexture2DRef) { u32 v; }; +Struct(G_Texture3DRef) { u32 v; }; +Struct(G_RWTexture3DRef) { u32 v; }; +Struct(G_SamplerStateRef) { u32 v; }; + +#define G_IsRefNil(r) ((r).v == 0) + +//////////////////////////////////////////////////////////// +//~ Constant types + +/* + * NOTE: D3d12 exposes 64 root constants, and vulkan 32 push constants. + * Other constants past the max can be used by the graphics + * implementation backend layer. + */ +#define G_NumGeneralPurposeConstants (8) #if IsLanguageC - #define G_SharedRef(type, v) ((type) { (v) }) + #define G_ForceDeclConstant(type, name, slot) \ + Enum(name##__shaderconstantenum) { name = slot }; \ + Struct(name##__shaderconstanttype) { type v; } + #define G_DeclConstant(type, name, slot) \ + StaticAssert(sizeof(type) <= 4); \ + StaticAssert(slot < G_NumGeneralPurposeConstants); \ + G_ForceDeclConstant(type, name, slot) #elif IsLanguageG - #define G_SharedRef(type, v) (type(v)) + #define G_ForceDeclConstant(type, name, slot) cbuffer name : register(b##slot) { type name; } + #define G_DeclConstant(type, name, slot) G_ForceDeclConstant(type, name, slot) #endif -#define G_BasicPointSampler G_SharedRef(SamplerStateRef, 1) -#define G_BasicNoiseTexture G_SharedRef(Texture3DRef, 2) +//////////////////////////////////////////////////////////// +//~ Resource dereference + +#if IsLanguageG + /* TODO: Non-uniform resource access is assumed as the default behavior. We + * may want to add explicit "uniform" variants for optimization on AMD devices + * in the future. */ + + template StructuredBuffer G_StructuredBufferFromRef(G_StructuredBufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } + template RWStructuredBuffer G_RWStructuredBufferFromRef(G_RWStructuredBufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } + + ByteAddressBuffer G_ByteAddressBufferFromRef(G_ByteAddressBufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } + RWByteAddressBuffer G_RWByteAddressBufferFromRef(G_RWByteAddressBufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } + + template Texture1D G_Texture1DFromRef(G_Texture1DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } + template Texture3D G_Texture3DFromRef(G_Texture3DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } + template RWTexture1D G_RWTexture1DFromRef(G_RWTexture1DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } + template Texture2D G_Texture2DFromRef(G_Texture2DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } + template RWTexture2D G_RWTexture2DFromRef(G_RWTexture2DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } + template RWTexture3D G_RWTexture3DFromRef(G_RWTexture3DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } + + SamplerState G_SamplerStateFromRef(G_SamplerStateRef r) { return SamplerDescriptorHeap[NonUniformResourceIndex(r.v)]; } +#endif //////////////////////////////////////////////////////////// -//~ @hookdecl Shader printf +//~ Size helpers + +#if IsLanguageG + template u32 countof(StructuredBuffer buff) { u32 result; buff.GetDimensions(result); return result; } + template u32 countof(RWStructuredBuffer buff) { u32 result; buff.GetDimensions(result); return result; } + u32 countof(ByteAddressBuffer buff) { u32 result; buff.GetDimensions(result); return result; } + u32 countof(RWByteAddressBuffer buff) { u32 result; buff.GetDimensions(result); return result; } + u32 countof(Texture1D tex) { u32 result; tex.GetDimensions(result); return result; } + template u32 countof(RWTexture1D tex) { u32 result; tex.GetDimensions(result); return result; } + Vec2U32 countof(Texture2D tex) { Vec2U32 result; tex.GetDimensions(result.x, result.y); return result; } + template Vec2U32 countof(RWTexture2D tex) { Vec2U32 result; tex.GetDimensions(result.x, result.y); return result; } + Vec3U32 countof(Texture3D tex) { Vec3U32 result; tex.GetDimensions(result.x, result.y, result.z); return result; } + template Vec3U32 countof(RWTexture3D tex) { Vec3U32 result; tex.GetDimensions(result.x, result.y, result.z); return result; } +#endif + +//////////////////////////////////////////////////////////// +//~ Static refs + +#if IsLanguageC + #define G_StaticRef(type, v) ((type) { (v) }) +#elif IsLanguageG + #define G_StaticRef(type, v) (type(v)) +#endif + +#define G_BasicPointSampler G_StaticRef(G_SamplerStateRef, 1) +#define G_BasicNoiseTexture G_StaticRef(G_Texture3DRef, 2) + +//////////////////////////////////////////////////////////// +//~ @hookdecl Debug printf #if IsLanguageG diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index 67daf108..9d7f9765 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -568,14 +568,14 @@ void V_TickForever(WaveLaneCtx *lane) G_Layout_DirectQueue_ShaderReadWrite, .flags = G_ResourceFlag_AllowShaderReadWrite | G_ResourceFlag_AllowRenderTarget ); - Texture2DRef draw_target_ro = G_PushTexture2DRef(frame->gpu_arena, draw_target); - RWTexture2DRef draw_target_rw = G_PushRWTexture2DRef(frame->gpu_arena, draw_target); + G_Texture2DRef draw_target_ro = G_PushTexture2DRef(frame->gpu_arena, draw_target); + G_RWTexture2DRef draw_target_rw = G_PushRWTexture2DRef(frame->gpu_arena, draw_target); /* Verts */ - G_ResourceHandle dverts_buff = G_PushBufferFromCpu(frame->gpu_arena, frame->cl, StringFromArena(frame->dverts_arena)); + G_ResourceHandle dverts_buff = G_PushBufferFromCpu(frame->gpu_arena, frame->cl, StringFromArena(frame->dverts_arena)); G_ResourceHandle dvert_idxs_buff = G_PushBufferFromCpu(frame->gpu_arena, frame->cl, StringFromArena(frame->dvert_idxs_arena)); - StructuredBufferRef dverts_ro = G_PushStructuredBufferRef(frame->gpu_arena, dverts_buff, V_DVert); - G_IndexBufferDesc dvert_idxs_ib = G_IdxBuff32(dvert_idxs_buff); + G_StructuredBufferRef dverts_ro = G_PushStructuredBufferRef(frame->gpu_arena, dverts_buff, V_DVert); + G_IndexBufferDesc dvert_idxs_ib = G_IdxBuff32(dvert_idxs_buff); /* Params */ V_DParams params = ZI; @@ -587,7 +587,7 @@ void V_TickForever(WaveLaneCtx *lane) params.world_to_draw_xf = world_to_draw_xf; } G_ResourceHandle params_buff = G_PushBufferFromCpu(frame->gpu_arena, frame->cl, StringFromStruct(¶ms)); - StructuredBufferRef params_ro = G_PushStructuredBufferRef(frame->gpu_arena, params_buff, V_DParams); + G_StructuredBufferRef params_ro = G_PushStructuredBufferRef(frame->gpu_arena, params_buff, V_DParams); /* Constants */ G_SetConstant(frame->cl, V_ShaderConst_Params, params_ro); diff --git a/src/pp/pp_vis/pp_vis_shaders.cgh b/src/pp/pp_vis/pp_vis_shaders.cgh index 26ea5191..01f76c4b 100644 --- a/src/pp/pp_vis/pp_vis_shaders.cgh +++ b/src/pp/pp_vis/pp_vis_shaders.cgh @@ -1,15 +1,15 @@ //////////////////////////////////////////////////////////// //~ Constant types -ShaderConstant(StructuredBufferRef, V_ShaderConst_Params, 0); +G_DeclConstant(G_StructuredBufferRef, V_ShaderConst_Params, 0); Struct(V_DParams) { Vec2I32 target_size; - Texture2DRef target_ro; - RWTexture2DRef target_rw; - StructuredBufferRef quads; - StructuredBufferRef shape_verts; + G_Texture2DRef target_ro; + G_RWTexture2DRef target_rw; + G_StructuredBufferRef quads; + G_StructuredBufferRef shape_verts; Xform world_to_draw_xf; }; diff --git a/src/pp/pp_vis/pp_vis_shaders.g b/src/pp/pp_vis/pp_vis_shaders.g index d7edb46d..b324863a 100644 --- a/src/pp/pp_vis/pp_vis_shaders.g +++ b/src/pp/pp_vis/pp_vis_shaders.g @@ -3,8 +3,8 @@ ComputeShader2D(V_BackdropCS, 8, 8) { - V_DParams params = StructuredBufferFromRef(V_ShaderConst_Params)[0]; - RWTexture2D target = RWTexture2DFromRef(params.target_rw); + V_DParams params = G_StructuredBufferFromRef(V_ShaderConst_Params)[0]; + RWTexture2D target = G_RWTexture2DFromRef(params.target_rw); Vec2U32 target_pos = SV_DispatchThreadID; Vec2I32 target_size = params.target_size; @@ -23,9 +23,9 @@ ComputeShader2D(V_BackdropCS, 8, 8) VertexShader(V_DQuadVS, V_DQuadPSInput) { - V_DParams params = StructuredBufferFromRef(V_ShaderConst_Params)[0]; - StructuredBuffer quads = StructuredBufferFromRef(params.quads); - RWTexture2D target = RWTexture2DFromRef(params.target_rw); + V_DParams params = G_StructuredBufferFromRef(V_ShaderConst_Params)[0]; + StructuredBuffer quads = G_StructuredBufferFromRef(params.quads); + RWTexture2D target = G_RWTexture2DFromRef(params.target_rw); V_DQuad quad = quads[SV_InstanceID]; @@ -45,8 +45,8 @@ VertexShader(V_DQuadVS, V_DQuadPSInput) PixelShader(V_DQuadPS, V_DQuadPSOutput, V_DQuadPSInput input) { - V_DParams params = StructuredBufferFromRef(V_ShaderConst_Params)[0]; - StructuredBuffer quads = StructuredBufferFromRef(params.quads); + V_DParams params = G_StructuredBufferFromRef(V_ShaderConst_Params)[0]; + StructuredBuffer quads = G_StructuredBufferFromRef(params.quads); V_DQuad quad = quads[input.quad_idx]; Vec4 final_color = 0; @@ -64,9 +64,9 @@ PixelShader(V_DQuadPS, V_DQuadPSOutput, V_DQuadPSInput input) VertexShader(V_DVertVS, V_DVertPSInput) { - V_DParams params = StructuredBufferFromRef(V_ShaderConst_Params)[0]; - StructuredBuffer verts = StructuredBufferFromRef(params.shape_verts); - RWTexture2D target = RWTexture2DFromRef(params.target_rw); + V_DParams params = G_StructuredBufferFromRef(V_ShaderConst_Params)[0]; + StructuredBuffer verts = G_StructuredBufferFromRef(params.shape_verts); + RWTexture2D target = G_RWTexture2DFromRef(params.target_rw); V_DVert vert = verts[SV_VertexID]; diff --git a/src/proto/proto.c b/src/proto/proto.c index ab88fc1b..84fa845a 100644 --- a/src/proto/proto.c +++ b/src/proto/proto.c @@ -28,13 +28,11 @@ void PT_RunForever(WaveLaneCtx *lane) .flags = G_ResourceFlag_AllowShaderReadWrite); /* Push resource handles */ - Texture2DRef final_target_rhandle = G_PushTexture2DRef(gpu_frame_arena, final_target); - RWTexture2DRef final_target_rwhandle = G_PushRWTexture2DRef(gpu_frame_arena, final_target); + G_Texture2DRef final_target_rhandle = G_PushTexture2DRef(gpu_frame_arena, final_target); + G_RWTexture2DRef final_target_rwhandle = G_PushRWTexture2DRef(gpu_frame_arena, final_target); /* Prep test pass */ { - G_SetConstant(cl, PT_ShaderConst_TestTargetWidth, final_target_size.x); - G_SetConstant(cl, PT_ShaderConst_TestTargetHeight, final_target_size.y); G_SetConstant(cl, PT_ShaderConst_TestTarget, final_target_rwhandle); G_SetConstant(cl, PT_ShaderConst_TestConst, 3.123); G_SetConstant(cl, PT_ShaderConst_BlitSampler, G_BasicPointSampler); diff --git a/src/proto/proto_shaders.cgh b/src/proto/proto_shaders.cgh index 3b864469..d6751298 100644 --- a/src/proto/proto_shaders.cgh +++ b/src/proto/proto_shaders.cgh @@ -1,15 +1,13 @@ //////////////////////////////////////////////////////////// //~ Constants -ShaderConstant(Texture3DRef, PT_ShaderConst_NoiseTex, 0); +G_DeclConstant(G_Texture3DRef, PT_ShaderConst_NoiseTex, 0); /* Test shader */ -ShaderConstant(i32, PT_ShaderConst_TestTargetWidth, 1); -ShaderConstant(i32, PT_ShaderConst_TestTargetHeight, 2); -ShaderConstant(RWTexture2DRef, PT_ShaderConst_TestTarget, 3); -ShaderConstant(StructuredBufferRef, PT_ShaderConst_TestBuff, 4); -ShaderConstant(f32, PT_ShaderConst_TestConst, 5); +G_DeclConstant(G_RWTexture2DRef, PT_ShaderConst_TestTarget, 1); +G_DeclConstant(G_StructuredBufferRef, PT_ShaderConst_TestBuff, 2); +G_DeclConstant(f32, PT_ShaderConst_TestConst, 3); /* Blit shader */ -ShaderConstant(SamplerStateRef, PT_ShaderConst_BlitSampler, 6); -ShaderConstant(Texture2DRef, PT_ShaderConst_BlitSrc, 7); +G_DeclConstant(G_SamplerStateRef, PT_ShaderConst_BlitSampler, 4); +G_DeclConstant(G_Texture2DRef, PT_ShaderConst_BlitSrc, 5); diff --git a/src/proto/proto_shaders.g b/src/proto/proto_shaders.g index c4963411..585efd7f 100644 --- a/src/proto/proto_shaders.g +++ b/src/proto/proto_shaders.g @@ -8,10 +8,10 @@ Struct(TestStruct) ComputeShader2D(PT_TestCS, 8, 8) { - StructuredBuffer sb = StructuredBufferFromRef(PT_ShaderConst_TestBuff); + StructuredBuffer sb = G_StructuredBufferFromRef(PT_ShaderConst_TestBuff); - RWTexture2D target_tex = RWTexture2DFromRef(PT_ShaderConst_TestTarget); - Vec2U32 target_tex_size = Vec2(PT_ShaderConst_TestTargetWidth, PT_ShaderConst_TestTargetHeight ); + RWTexture2D target_tex = G_RWTexture2DFromRef(PT_ShaderConst_TestTarget); + Vec2U32 target_tex_size = countof(target_tex); Vec2I32 id = SV_DispatchThreadID; if (id.x < target_tex_size.x && id.y < target_tex_size.y) @@ -51,9 +51,9 @@ VertexShader(PT_BlitVS, PT_BlitPSInput) PixelShader(PT_BlitPS, PT_BlitPSOutput, PT_BlitPSInput input) { - SamplerState sampler = SamplerStateFromRef(PT_ShaderConst_BlitSampler); - Texture2D tex = Texture2DFromRef(PT_ShaderConst_BlitSrc); - Texture3D noise = Texture3DFromRef(PT_ShaderConst_NoiseTex); + SamplerState sampler = G_SamplerStateFromRef(PT_ShaderConst_BlitSampler); + Texture2D tex = G_Texture2DFromRef(PT_ShaderConst_BlitSrc); + Texture3D noise = G_Texture3DFromRef(PT_ShaderConst_NoiseTex); Vec2 uv = input.src_uv; Vec4 tex_col = tex.Sample(sampler, uv); diff --git a/src/ui/ui_core.c b/src/ui/ui_core.c index bb930170..3a5bc72c 100644 --- a/src/ui/ui_core.c +++ b/src/ui/ui_core.c @@ -406,7 +406,7 @@ UI_Key UI_BuildBoxEx(UI_Key key) } -void UI_SetRawTexture(UI_Key key, Texture2DRef tex, Vec2 uv0, Vec2 uv1) +void UI_SetRawTexture(UI_Key key, G_Texture2DRef tex, Vec2 uv0, Vec2 uv1) { UI_Frame *frame = UI_CurrentFrame(); UI_CmdNode *n = PushStruct(frame->arena, UI_CmdNode); @@ -1378,11 +1378,11 @@ void UI_EndFrame(UI_Frame *frame) G_Layout_DirectQueue_RenderTargetWrite, .flags = G_ResourceFlag_AllowRenderTarget ); - Texture2DRef draw_target_ro = G_PushTexture2DRef(frame->gpu_arena, draw_target); + G_Texture2DRef draw_target_ro = G_PushTexture2DRef(frame->gpu_arena, draw_target); /* Rects */ G_ResourceHandle rects_buff = G_PushBufferFromCpu(frame->gpu_arena, frame->cl, StringFromArena(frame->rects_arena)); - StructuredBufferRef rects_ro = G_PushStructuredBufferRef(frame->gpu_arena, rects_buff, UI_DRect); + G_StructuredBufferRef rects_ro = G_PushStructuredBufferRef(frame->gpu_arena, rects_buff, UI_DRect); /* Params */ UI_DParams params = ZI; @@ -1392,7 +1392,7 @@ void UI_EndFrame(UI_Frame *frame) params.rects = rects_ro; } G_ResourceHandle params_buff = G_PushBufferFromCpu(frame->gpu_arena, frame->cl, StringFromStruct(¶ms)); - StructuredBufferRef params_ro = G_PushStructuredBufferRef(frame->gpu_arena, params_buff, UI_DParams); + G_StructuredBufferRef params_ro = G_PushStructuredBufferRef(frame->gpu_arena, params_buff, UI_DParams); /* Constants */ G_SetConstant(frame->cl, UI_ShaderConst_Params, params_ro); diff --git a/src/ui/ui_core.h b/src/ui/ui_core.h index e8a7b705..09887ece 100644 --- a/src/ui/ui_core.h +++ b/src/ui/ui_core.h @@ -109,7 +109,7 @@ Enum(UI_BoxFlag) X(Font, GC_FontKey) \ X(FontSize, u32) \ X(Text, String) \ - X(BackgroundTexture, Texture2DRef) \ + X(BackgroundTexture, G_Texture2DRef) \ X(BackgroundTextureUv0, Vec2) \ X(BackgroundTextureUv1, Vec2) \ /* --------------------------------------- */ \ @@ -232,7 +232,7 @@ Struct(UI_Cmd) struct { UI_Key key; - Texture2DRef tex; + G_Texture2DRef tex; Vec2 uv0; Vec2 uv1; } set_raw_texture; @@ -268,7 +268,7 @@ Struct(UI_Box) //- Cmd data UI_BoxDesc desc; - Texture2DRef raw_texture; + G_Texture2DRef raw_texture; Vec2 raw_texture_uv0; Vec2 raw_texture_uv1; @@ -443,7 +443,7 @@ UI_Style UI_PopStyle(UI_StyleDesc desc); UI_Key UI_BuildBoxEx(UI_Key key); #define UI_BuildBox() UI_BuildBoxEx(UI_TransKey()) -void UI_SetRawTexture(UI_Key key, Texture2DRef tex, Vec2 uv0, Vec2 uv1); +void UI_SetRawTexture(UI_Key key, G_Texture2DRef tex, Vec2 uv0, Vec2 uv1); //////////////////////////////////////////////////////////// //~ Report diff --git a/src/ui/ui_shaders.cgh b/src/ui/ui_shaders.cgh index 7e689145..5438c51d 100644 --- a/src/ui/ui_shaders.cgh +++ b/src/ui/ui_shaders.cgh @@ -1,14 +1,14 @@ //////////////////////////////////////////////////////////// //~ Constant types -ShaderConstant(StructuredBufferRef, UI_ShaderConst_Params, 0); -ShaderConstant(b32, UI_ShaderConst_DebugDraw, 1); +G_DeclConstant(G_StructuredBufferRef, UI_ShaderConst_Params, 0); +G_DeclConstant(b32, UI_ShaderConst_DebugDraw, 1); Struct(UI_DParams) { - Vec2I32 target_size; - Texture2DRef target_ro; - StructuredBufferRef rects; + Vec2I32 target_size; + G_Texture2DRef target_ro; + G_StructuredBufferRef rects; }; //////////////////////////////////////////////////////////// @@ -25,7 +25,7 @@ Struct(UI_DRect) f32 border; Vec2 tex_uv0; Vec2 tex_uv1; - Texture2DRef tex; + G_Texture2DRef tex; f32 tl_rounding; f32 tr_rounding; diff --git a/src/ui/ui_shaders.g b/src/ui/ui_shaders.g index d1edfca6..d04a4131 100644 --- a/src/ui/ui_shaders.g +++ b/src/ui/ui_shaders.g @@ -6,8 +6,8 @@ VertexShader(UI_DRectVS, UI_DRectPSInput) { - UI_DParams params = StructuredBufferFromRef(UI_ShaderConst_Params)[0]; - StructuredBuffer rects = StructuredBufferFromRef(params.rects); + UI_DParams params = G_StructuredBufferFromRef(UI_ShaderConst_Params)[0]; + StructuredBuffer rects = G_StructuredBufferFromRef(params.rects); UI_DRect rect = rects[SV_InstanceID]; Vec2 rect_uv = RectUvFromVertexId(SV_VertexID); @@ -31,9 +31,9 @@ VertexShader(UI_DRectVS, UI_DRectPSInput) PixelShader(UI_DRectPS, UI_DRectPSOutput, UI_DRectPSInput input) { - UI_DParams params = StructuredBufferFromRef(UI_ShaderConst_Params)[0]; - StructuredBuffer rects = StructuredBufferFromRef(params.rects); - SamplerState sampler = SamplerStateFromRef(G_BasicPointSampler); + UI_DParams params = G_StructuredBufferFromRef(UI_ShaderConst_Params)[0]; + StructuredBuffer rects = G_StructuredBufferFromRef(params.rects); + SamplerState sampler = G_SamplerStateFromRef(G_BasicPointSampler); UI_DRect rect = rects[input.rect_idx]; @@ -91,9 +91,9 @@ PixelShader(UI_DRectPS, UI_DRectPSOutput, UI_DRectPSInput input) { background_color = border_color; } - else if (!IsShaderRefNil(rect.tex)) + else if (!G_IsRefNil(rect.tex)) { - Texture2D tex = Texture2DFromRef(rect.tex); + Texture2D tex = G_Texture2DFromRef(rect.tex); background_color = tex.Sample(sampler, input.tex_uv); } else @@ -138,9 +138,9 @@ VertexShader(UI_BlitVS, UI_BlitPSInput) PixelShader(UI_BlitPS, UI_BlitPSOutput, UI_BlitPSInput input) { - UI_DParams params = StructuredBufferFromRef(UI_ShaderConst_Params)[0]; - Texture2D tex = Texture2DFromRef(params.target_ro); - SamplerState sampler = SamplerStateFromRef(G_BasicPointSampler); + UI_DParams params = G_StructuredBufferFromRef(UI_ShaderConst_Params)[0]; + Texture2D tex = G_Texture2DFromRef(params.target_ro); + SamplerState sampler = G_SamplerStateFromRef(G_BasicPointSampler); Vec2 uv = input.src_uv; Vec4 result = tex.Sample(sampler, uv);