diff --git a/src/gpu/gpu_common.c b/src/gpu/gpu_common.c index 9c732b11..ab1e51fd 100644 --- a/src/gpu/gpu_common.c +++ b/src/gpu/gpu_common.c @@ -12,40 +12,35 @@ void G_BootstrapCommon(void) { // Init quad index buffer { - G_ResourceHandle quad_indices = Zi; - u16 quad_data[6] = { 0, 1, 2, 0, 2, 3 }; - quad_indices = G_PushBuffer(gpu_perm, cl, u16, countof(quad_data)); - G_CopyCpuToBuffer(cl, quad_indices, 0, quad_data, RNGU64(0, sizeof(quad_data))); - G.quad_indices = G_IdxBuff16(quad_indices); + u16 quad_indices[6] = { 0, 1, 2, 0, 2, 3 }; + G.quad_indices = G_PushBufferFromCpu(cl, gpu_perm, quad_indices, u16, countof(quad_indices)); } // Init blank texture { - G_ResourceHandle blank_tex = G_PushTexture2D( - gpu_perm, cl, + G.blank_tex = G_PushTexture2D( + cl, gpu_perm, + G_TextureLayout_Common, G_Format_R8G8B8A8_Unorm, VEC2I32(8, 8), - G_Layout_Common, - .flags = G_ResourceFlag_ZeroMemory, + .flags = G_MemoryFlag_Zero, .name = Lit("Blank texture") ); - G.blank_tex = G_PushTexture2DRef(gpu_perm, blank_tex); } // Init noise texture { - G_ResourceHandle noise_tex = Zi; String noise_data = DataFromResource(ResourceKeyFromStore(&G_Resources, Lit("noise_128x128x64_16.dat"))); Vec3I32 noise_dims = VEC3I32(128, 128, 64); if (noise_data.len != noise_dims.x * noise_dims.y * noise_dims.z * 2) { Panic(Lit("Unexpected noise texture size")); } - noise_tex = G_PushTexture3D( - gpu_perm, cl, + G_Texture3DRef noise_tex = G_PushTexture3D( + cl, gpu_perm, + G_TextureLayout_Common, G_Format_R16_Uint, noise_dims, - G_Layout_Common, .name = Lit("Noise texture") ); G_CopyCpuToTexture( @@ -72,63 +67,63 @@ void G_BootstrapCommon(void) { G_Filter filter = G_Filter_MinMagMipPoint; G_AddressMode address_mode = G_AddressMode_Clamp; - G_ResourceHandle sampler_res = G_PushSampler(gpu_perm, cl, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); + G_ResourceHandle sampler_res = G_PushSampler(cl, gpu_perm, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); sampler = G_PushSamplerStateRef(gpu_perm, sampler_res); } break; case G_BasicSamplerKind_PointWrap: { G_Filter filter = G_Filter_MinMagMipPoint; G_AddressMode address_mode = G_AddressMode_Wrap; - G_ResourceHandle sampler_res = G_PushSampler(gpu_perm, cl, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); + G_ResourceHandle sampler_res = G_PushSampler(cl, gpu_perm, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); sampler = G_PushSamplerStateRef(gpu_perm, sampler_res); } break; case G_BasicSamplerKind_PointMirror: { G_Filter filter = G_Filter_MinMagMipPoint; G_AddressMode address_mode = G_AddressMode_Mirror; - G_ResourceHandle sampler_res = G_PushSampler(gpu_perm, cl, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); + G_ResourceHandle sampler_res = G_PushSampler(cl, gpu_perm, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); sampler = G_PushSamplerStateRef(gpu_perm, sampler_res); } break; case G_BasicSamplerKind_BilinearClamp: { G_Filter filter = G_Filter_MinMagLinearMipPoint; G_AddressMode address_mode = G_AddressMode_Clamp; - G_ResourceHandle sampler_res = G_PushSampler(gpu_perm, cl, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); + G_ResourceHandle sampler_res = G_PushSampler(cl, gpu_perm, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); sampler = G_PushSamplerStateRef(gpu_perm, sampler_res); } break; case G_BasicSamplerKind_BilinearWrap: { G_Filter filter = G_Filter_MinMagLinearMipPoint; G_AddressMode address_mode = G_AddressMode_Wrap; - G_ResourceHandle sampler_res = G_PushSampler(gpu_perm, cl, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); + G_ResourceHandle sampler_res = G_PushSampler(cl, gpu_perm, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); sampler = G_PushSamplerStateRef(gpu_perm, sampler_res); } break; case G_BasicSamplerKind_BilinearMirror: { G_Filter filter = G_Filter_MinMagLinearMipPoint; G_AddressMode address_mode = G_AddressMode_Mirror; - G_ResourceHandle sampler_res = G_PushSampler(gpu_perm, cl, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); + G_ResourceHandle sampler_res = G_PushSampler(cl, gpu_perm, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); sampler = G_PushSamplerStateRef(gpu_perm, sampler_res); } break; case G_BasicSamplerKind_TrilinearClamp: { G_Filter filter = G_Filter_MinMagMipLinear; G_AddressMode address_mode = G_AddressMode_Clamp; - G_ResourceHandle sampler_res = G_PushSampler(gpu_perm, cl, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); + G_ResourceHandle sampler_res = G_PushSampler(cl, gpu_perm, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); sampler = G_PushSamplerStateRef(gpu_perm, sampler_res); } break; case G_BasicSamplerKind_TrilinearWrap: { G_Filter filter = G_Filter_MinMagMipLinear; G_AddressMode address_mode = G_AddressMode_Wrap; - G_ResourceHandle sampler_res = G_PushSampler(gpu_perm, cl, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); + G_ResourceHandle sampler_res = G_PushSampler(cl, gpu_perm, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); sampler = G_PushSamplerStateRef(gpu_perm, sampler_res); } break; case G_BasicSamplerKind_TrilinearMirror: { G_Filter filter = G_Filter_MinMagMipLinear; G_AddressMode address_mode = G_AddressMode_Mirror; - G_ResourceHandle sampler_res = G_PushSampler(gpu_perm, cl, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); + G_ResourceHandle sampler_res = G_PushSampler(cl, gpu_perm, .filter = filter, .x = address_mode, .y = address_mode, .z = address_mode); sampler = G_PushSamplerStateRef(gpu_perm, sampler_res); } break; } @@ -155,10 +150,10 @@ G_ArenaHandle G_PermArena(void) //- Push resource from cpu -G_ResourceHandle G_PushBufferFromCpuCopy_(G_ArenaHandle gpu_arena, G_CommandListHandle cl, String src, G_BufferDesc desc) +G_BufferRef G_PushBufferFromCpu_(G_CommandListHandle cl, G_ArenaHandle gpu_arena, void *src, G_BufferDesc desc) { - G_ResourceHandle buffer = G_PushResource(gpu_arena, cl, (G_ResourceDesc) { .kind = G_ResourceKind_Buffer, .buffer = desc }); - G_CopyCpuToBuffer(cl, buffer, 0, src.text, RNGU64(0, src.len)); + G_BufferRef buffer = G_PushBuffer(cl, gpu_arena, desc); + G_CopyCpuToBuffer(cl, buffer, 0, src, RNGU64(0, desc.count * desc.stride)); return buffer; } @@ -228,13 +223,13 @@ Vec3I32 G_GroupCountFromThreadCount(ComputeShaderDesc cs, Vec3I32 threads) //- Viewport / scissor -Rng3 G_ViewportFromTexture(G_ResourceHandle texture) +Rng3 G_ViewportFromTexture(G_Texture2DRef texture) { Vec2I32 dims = G_Count2D(texture); return RNG3(VEC3(0, 0, 0), VEC3(dims.x, dims.y, 1)); } -Rng2 G_ScissorFromTexture(G_ResourceHandle texture) +Rng2 G_ScissorFromTexture(G_Texture2DRef texture) { Vec2I32 dims = G_Count2D(texture); return RNG2(VEC2(0, 0), VEC2(dims.x, dims.y)); @@ -258,7 +253,7 @@ G_Texture2DRef G_BlankTexture2D(void) return G.blank_tex; } -G_Texture3DRef G_BasicNoiseTexture(void) +G_Texture3DRef G_BasicNoise3D(void) { - return G.basic_noise; + return G.basic_noise_tex; } diff --git a/src/gpu/gpu_common.h b/src/gpu/gpu_common.h index 7af854b0..38228e48 100644 --- a/src/gpu/gpu_common.h +++ b/src/gpu/gpu_common.h @@ -4,10 +4,10 @@ Struct(G_Ctx) { // Common shared resources - G_IndexBufferDesc quad_indices; + G_BufferRef quad_indices; G_Texture2DRef blank_tex; - G_Texture3DRef basic_noise; - G_SamplerStateRef basic_samplers[G_BasicSamplerKind_COUNT]; + G_Texture2DRef basic_noise_tex; + G_SamplerRef basic_samplers[G_BasicSamplerKind_COUNT]; }; Struct(G_ThreadLocalCtx) @@ -27,27 +27,37 @@ void G_BootstrapCommon(void); //~ Utils //- Arena + G_ArenaHandle G_PermArena(void); //- Push resource from cpu -G_ResourceHandle G_PushBufferFromCpuCopy_(G_ArenaHandle gpu_arena, G_CommandListHandle cl, String src, G_BufferDesc desc); -#define G_PushBufferFromCpuCopy(_arena, _cl, _src, ...) \ - G_PushBufferFromCpuCopy_((_arena), (_cl), (_src), (G_BufferDesc) { .size = (_src).len, __VA_ARGS__ }) + +G_BufferRef G_PushBufferFromCpu_(G_CommandListHandle cl, G_ArenaHandle gpu_arena, void *src, G_BufferDesc desc); + +#define G_PushBufferFromCpu(_cl, _gpu_arena, _src, _type, _count, ...) \ + G_PushBufferFromCpu_((_cl), (_gpu_arena), (_src), (G_BufferDesc) { .count = _count, .stride = sizeof(_type) }) + +#define G_PushBufferFromCpuArena(_cl, _gpu_arena, _cpu_arena, _type, ...) \ + G_PushBufferFromCpu_((_cl), (_gpu_arena), ArenaFirst((_cpu_arena), _type), ArenaCount((_cpu_arena), (_count)), __VA_ARGS__) //- Mip + i32 G_DimsFromMip1D(i32 mip0_dims, i32 mip); Vec2I32 G_DimsFromMip2D(Vec2I32 mip0_dims, i32 mip); Vec3I32 G_DimsFromMip3D(Vec3I32 mip0_dims, i32 mip); //- Thread count + Vec3I32 G_GroupCountFromThreadCount(ComputeShaderDesc cs, Vec3I32 threads); //- Viewport / scissor -Rng3 G_ViewportFromTexture(G_ResourceHandle texture); -Rng2 G_ScissorFromTexture(G_ResourceHandle texture); + +Rng3 G_ViewportFromTexture(G_Texture2DRef texture); +Rng2 G_ScissorFromTexture(G_Texture2DRef texture); //- Shared resources -G_SamplerStateRef G_BasicSamplerFromKind(G_BasicSamplerKind kind); + +G_SamplerRef G_BasicSamplerFromKind(G_BasicSamplerKind kind); G_IndexBufferDesc G_QuadIndices(void); G_Texture2DRef G_BlankTexture2D(void); -G_Texture3DRef G_BasicNoiseTexture(void); +G_Texture2DRef G_BasicNoise3D(void); diff --git a/src/gpu/gpu_core.h b/src/gpu/gpu_core.h index c66fb59f..d92a32cc 100644 --- a/src/gpu/gpu_core.h +++ b/src/gpu/gpu_core.h @@ -191,20 +191,20 @@ Enum(G_Format) //////////////////////////////////////////////////////////// //~ Texture layout types -Enum(G_Layout) +Enum(G_TextureLayout) { + // Supports present, shader-read, and copy-read/write in any queue family. + // Transitionable from G_TextureLayout_Family in non-copy queue. + G_TextureLayout_Common, + + // Supports any access in the current queue family. + // Transitionable from G_TextureLayout_Common in non-copy queue. + G_TextureLayout_Family, + // Supports any read access with up to 1 write access to non overlapping regions from any queue. // Cannot be transitioned to/from. // Depth-stencil textures cannot use this layout. - G_Layout_Simultaneous, - - // Supports present, shader-read, and copy-read/write in any queue kind. - // Transitionable from `G_Layout_Exclusive` in non-copy queue. - G_Layout_Common, - - // Supports any access in the current queue kind. - // Transitionable from `G_Layout_Common` in non-copy queue. - G_Layout_Exclusive, + G_TextureLayout_Simultaneous, }; //////////////////////////////////////////////////////////// @@ -287,42 +287,43 @@ Enum(G_ComparisonFunc) }; //////////////////////////////////////////////////////////// -//~ Resource types +//~ Memory types -Enum(G_ResourceKind) +Enum(G_MemoryKind) { - G_ResourceKind_Buffer, - G_ResourceKind_Texture1D, - G_ResourceKind_Texture2D, - G_ResourceKind_Texture3D, - G_ResourceKind_Sampler, + G_MemoryKind_Buffer, + G_MemoryKind_Texture1D, + G_MemoryKind_Texture2D, + G_MemoryKind_Texture3D, + G_MemoryKind_Sampler, }; -Enum(G_ResourceFlag) +Enum(G_MemoryFlag) { - G_ResourceFlag_None = 0, - G_ResourceFlag_AllowShaderReadWrite = (1 << 1), - G_ResourceFlag_AllowRenderTarget = (1 << 2), - G_ResourceFlag_AllowDepthStencil = (1 << 3), - G_ResourceFlag_ZeroMemory = (1 << 4), - G_ResourceFlag_HostMemory = (1 << 5), // Resource will be mapped into the cpu's address space - G_ResourceFlag_Uncached = (1 << 6), // Cpu writes will be combined & reads will be uncached - G_ResourceFlag_ForceNoReuse = (1 << 7), + G_MemoryFlag_None = 0, + G_MemoryFlag_Zero = (1 << 0), + G_MemoryFlag_AllowTextureRW = (1 << 1), + G_MemoryFlag_AllowTextureDraw = (1 << 2), + G_MemoryFlag_AllowTextureDepthStencil = (1 << 3), + G_MemoryFlag_HostCached = (1 << 4), // Will be mapped to write-back Cpu memory + G_MemoryFlag_HostUncached = (1 << 5), // Will be mapped to write-combined Cpu memory + G_MemoryFlag_ForceNoReuse = (1 << 6), }; Struct(G_BufferDesc) { - G_ResourceFlag flags; - u64 size; + G_MemoryFlag flags; + u64 stride; + u64 count; String name; }; Struct(G_TextureDesc) { - G_ResourceFlag flags; + G_MemoryFlag flags; G_Format format; Vec3I32 dims; - G_Layout initial_layout; + G_TextureLayout initial_layout; Vec4 clear_color; i32 max_mips; // Will be clamped to range [1, max mips] String name; @@ -330,7 +331,7 @@ Struct(G_TextureDesc) Struct(G_SamplerDesc) { - G_ResourceFlag flags; + G_MemoryFlag flags; G_Filter filter; G_AddressMode x; G_AddressMode y; @@ -344,25 +345,14 @@ Struct(G_SamplerDesc) String name; }; -Struct(G_ResourceDesc) +Struct(G_MemoryDesc) { - G_ResourceKind kind; + G_MemoryKind kind; G_BufferDesc buffer; G_TextureDesc texture; G_SamplerDesc sampler; }; -//////////////////////////////////////////////////////////// -//~ Ref types - -Struct(G_RefDesc) -{ - G_RefKind kind; - u64 element_size; - u64 element_offset; - RngI32 mips; // Inclusive range of texture mip indices to reference -}; - //////////////////////////////////////////////////////////// //~ Draw types @@ -428,72 +418,134 @@ void G_ReleaseArena(G_CommandListHandle cl_handle, G_ArenaHandle arena); void G_ResetArena(G_CommandListHandle cl_handle, G_ArenaHandle arena_handle); //////////////////////////////////////////////////////////// -//~ @hookdecl Resource +//~ @hookdecl Memory + +G_BaseDescriptorIndex G_PushMemory(G_CommandListHandle cl, G_ArenaHandle gpu_arena, G_MemoryDesc desc); + +#define G_PushBuffer(_cl, _arena, _count, _type, ...) ((G_BufferRef) { .v = G_PushMemory((cl), (_arena), \ + (G_MemoryDesc) { \ + .kind = G_MemoryKind_Buffer, \ + .buffer = { \ + .count = (_count), \ + .stride = sizeof(_type), \ + __VA_ARGS__ \ + } \ + } \ +)}) + + + + +#define G_PushTexture1D(_cl, _arena, _initial_layout, _format, _dims, ...) ((G_Texture1DRef) { .v = G_PushMemory((cl), (_arena), \ + (G_MemoryDesc) { \ + .kind = G_MemoryKind_Texture1D, \ + .texture = { \ + .format = (_format), \ + .dims = VEC3I32((_dims).x, 1, 1), \ + .initial_layout = (_initial_layout), \ + __VA_ARGS__ \ + } \ + } \ +)}) + + +#define G_PushTexture2D(_cl, _arena, _initial_layout, _format, _dims, ...) ((G_Texture2DRef) { .v = G_PushMemory((cl), (_arena), \ + (G_MemoryDesc) { \ + .kind = G_MemoryKind_Texture2D, \ + .texture = { \ + .format = (_format), \ + .dims = VEC3I32((_dims).x, (_dims).y, 1), \ + .initial_layout = (_initial_layout), \ + __VA_ARGS__ \ + } \ + } \ +)}) + + + + +#define G_PushTexture3D(_cl, _arena, _initial_layout, _format, _dims, ...) ((G_Texture3DRef) { .v = G_PushMemory((cl), (_arena), \ + (G_MemoryDesc) { \ + .kind = G_MemoryKind_Texture3D, \ + .texture = { \ + .format = (_format), \ + .dims = VEC3I32((_dims).x, (_dims).y, (_dims.z)), \ + .initial_layout = (_initial_layout), \ + __VA_ARGS__ \ + } \ + } \ +)}) + + + + + + //- Resource creation -G_ResourceHandle G_PushResource(G_ArenaHandle arena, G_CommandListHandle cl, G_ResourceDesc desc); +// G_ResourceHandle G_PushResource(G_ArenaHandle arena, G_CommandListHandle cl, G_ResourceDesc desc); -#define G_PushBuffer(arena, cl, _type, _count, ...) G_PushResource((arena), (cl), \ - (G_ResourceDesc) { \ - .kind = G_ResourceKind_Buffer, \ - .buffer = { \ - .size = sizeof(_type) * (_count), \ - __VA_ARGS__ \ - } \ - } \ -) +// #define G_PushBuffer(arena, cl, _type, _count, ...) G_PushResource((arena), (cl), \ +// (G_ResourceDesc) { \ +// .kind = G_ResourceKind_Buffer, \ +// .buffer = { \ +// .size = sizeof(_type) * (_count), \ +// __VA_ARGS__ \ +// } \ +// } \ +// ) -#define G_PushTexture1D(arena, cl, _format, _size, _initial_layout, ...) G_PushResource((arena), (cl), \ - (G_ResourceDesc) { \ - .kind = G_ResourceKind_Texture1D, \ - .texture = { \ - .format = (_format), \ - .dims = VEC3I32((_size), 1, 1), \ - .initial_layout = (_initial_layout), \ - __VA_ARGS__ \ - } \ - } \ -) +// #define G_PushTexture1D(arena, cl, _format, _size, _initial_layout, ...) G_PushResource((arena), (cl), \ +// (G_ResourceDesc) { \ +// .kind = G_ResourceKind_Texture1D, \ +// .texture = { \ +// .format = (_format), \ +// .dims = VEC3I32((_size), 1, 1), \ +// .initial_layout = (_initial_layout), \ +// __VA_ARGS__ \ +// } \ +// } \ +// ) -#define G_PushTexture2D(arena, cl, _format, _size, _initial_layout, ...) G_PushResource((arena), (cl), \ - (G_ResourceDesc) { \ - .kind = G_ResourceKind_Texture2D, \ - .texture = { \ - .format = (_format), \ - .dims = VEC3I32((_size).x, (_size).y, 1), \ - .initial_layout = (_initial_layout), \ - __VA_ARGS__ \ - } \ - } \ -) +// #define G_PushTexture2D(arena, cl, _format, _size, _initial_layout, ...) G_PushResource((arena), (cl), \ +// (G_ResourceDesc) { \ +// .kind = G_ResourceKind_Texture2D, \ +// .texture = { \ +// .format = (_format), \ +// .dims = VEC3I32((_size).x, (_size).y, 1), \ +// .initial_layout = (_initial_layout), \ +// __VA_ARGS__ \ +// } \ +// } \ +// ) -#define G_PushTexture3D(arena, cl, _format, _size, _initial_layout, ...) G_PushResource((arena), (cl), \ - (G_ResourceDesc) { \ - .kind = G_ResourceKind_Texture3D, \ - .texture = { \ - .format = (_format), \ - .dims = (_size), \ - .initial_layout = (_initial_layout), \ - __VA_ARGS__ \ - } \ - } \ -) +// #define G_PushTexture3D(arena, cl, _format, _size, _initial_layout, ...) G_PushResource((arena), (cl), \ +// (G_ResourceDesc) { \ +// .kind = G_ResourceKind_Texture3D, \ +// .texture = { \ +// .format = (_format), \ +// .dims = (_size), \ +// .initial_layout = (_initial_layout), \ +// __VA_ARGS__ \ +// } \ +// } \ +// ) -#define G_PushSampler(arena, cl, ...) G_PushResource((arena), (cl), \ - (G_ResourceDesc) { \ - .kind = G_ResourceKind_Sampler, \ - .sampler = { \ - .filter = G_Filter_MinMagMipPoint, \ - __VA_ARGS__ \ - } \ - } \ -) +// #define G_PushSampler(arena, cl, ...) G_PushResource((arena), (cl), \ +// (G_ResourceDesc) { \ +// .kind = G_ResourceKind_Sampler, \ +// .sampler = { \ +// .filter = G_Filter_MinMagMipPoint, \ +// __VA_ARGS__ \ +// } \ +// } \ +// ) //- Index buffer helpers -#define G_IdxBuff16(_res) ((G_IndexBufferDesc) { .resource = (_res), .stride = 2, .count = (G_CountBuffer((_res), i16)) }) -#define G_IdxBuff32(_res) ((G_IndexBufferDesc) { .resource = (_res), .stride = 4, .count = (G_CountBuffer((_res), i32)) }) +// #define G_IdxBuff16(_res) ((G_IndexBufferDesc) { .resource = (_res), .stride = 2, .count = (G_CountBuffer((_res), i16)) }) +// #define G_IdxBuff32(_res) ((G_IndexBufferDesc) { .resource = (_res), .stride = 4, .count = (G_CountBuffer((_res), i32)) }) //- Render target helpers @@ -520,49 +572,49 @@ void *G_HostPointerFromResource(G_ResourceHandle resource); //////////////////////////////////////////////////////////// //~ @hookdecl Shader resource reference -u32 G_PushRef(G_ArenaHandle arena, G_ResourceHandle resource, G_RefDesc desc); +// u32 G_PushRef(G_ArenaHandle arena, G_ResourceHandle resource, G_RefDesc desc); -#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_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_PushByteAddressBufferRef(arena, resource, ...) (G_ByteAddressBufferRef) { \ - .v = G_PushRef( \ - (arena), (resource), \ - (G_RefDesc) { .kind = G_RefKind_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_PushTexture1DRef(arena, resource, ...) (G_Texture1DRef) { \ - .v = G_PushRef( \ - (arena), (resource), \ - (G_RefDesc) { .kind = G_RefKind_Texture1D, .mips.max = G_MaxMips, __VA_ARGS__ } \ - ) \ -} +// #define G_PushTexture1DRef(arena, resource, ...) (G_Texture1DRef) { \ +// .v = G_PushRef( \ +// (arena), (resource), \ +// (G_RefDesc) { .kind = G_RefKind_Texture1D, .mips.max = G_MaxMips, __VA_ARGS__ } \ +// ) \ +// } -#define G_PushTexture2DRef(arena, resource, ...) (G_Texture2DRef) { \ - .v = G_PushRef( \ - (arena), (resource), \ - (G_RefDesc) { .kind = G_RefKind_Texture2D, .mips.max = G_MaxMips, __VA_ARGS__ } \ - ) \ -} +// #define G_PushTexture2DRef(arena, resource, ...) (G_Texture2DRef) { \ +// .v = G_PushRef( \ +// (arena), (resource), \ +// (G_RefDesc) { .kind = G_RefKind_Texture2D, .mips.max = G_MaxMips, __VA_ARGS__ } \ +// ) \ +// } -#define G_PushTexture3DRef(arena, resource, ...) (G_Texture3DRef) { \ - .v = G_PushRef( \ - (arena), (resource), \ - (G_RefDesc) { .kind = G_RefKind_Texture3D, .mips.max = G_MaxMips, __VA_ARGS__ } \ - ) \ -} +// #define G_PushTexture3DRef(arena, resource, ...) (G_Texture3DRef) { \ +// .v = G_PushRef( \ +// (arena), (resource), \ +// (G_RefDesc) { .kind = G_RefKind_Texture3D, .mips.max = G_MaxMips, __VA_ARGS__ } \ +// ) \ +// } -#define G_PushSamplerStateRef(arena, resource, ...) (G_SamplerStateRef) { \ - .v = G_PushRef( \ - (arena), (resource), \ - (G_RefDesc) { .kind = G_RefKind_SamplerState, __VA_ARGS__ } \ - ) \ -} +// #define G_PushSamplerStateRef(arena, resource, ...) (G_SamplerStateRef) { \ +// .v = G_PushRef( \ +// (arena), (resource), \ +// (G_RefDesc) { .kind = G_RefKind_SamplerState, __VA_ARGS__ } \ +// ) \ +// } //////////////////////////////////////////////////////////// //~ @hookdecl Command @@ -585,7 +637,7 @@ void G_SetConstantEx(G_CommandListHandle cl, i32 slot, void *src_32bit, u32 size //- Barrier void G_Sync(G_CommandListHandle cl); -void G_SyncLayout(G_CommandListHandle cl, G_ResourceHandle resource, G_Layout layout); +void G_SyncLayout(G_CommandListHandle cl, G_ResourceHandle resource, G_TextureLayout layout); //- Zone diff --git a/src/gpu/gpu_dx12/gpu_dx12_core.c b/src/gpu/gpu_dx12/gpu_dx12_core.c index 2dec3010..4bbf18af 100644 --- a/src/gpu/gpu_dx12/gpu_dx12_core.c +++ b/src/gpu/gpu_dx12/gpu_dx12_core.c @@ -441,7 +441,7 @@ void G_Bootstrap(void) .type = D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, .flags = D3D12_DESCRIPTOR_HEAP_FLAG_SHADER_VISIBLE, .max = G_D12_MaxCbvSrvUavDescriptors, - .per_batch_count = 2, // 1 read, 1 write per ref + .per_batch_count = 4, // 0: SRV, 1: UAV, 2: Raw-SRV, 3: Raw-UAV .name = Lit("Primary Resource Descriptor Heap"), }, [G_D12_DescriptorHeapKind_Rtv] = { @@ -1205,328 +1205,328 @@ void G_D12_ResetArena(G_D12_CmdList *cl, G_D12_Arena *gpu_arena) } //////////////////////////////////////////////////////////// -//~ @hookimpl Resource +//~ @hookimpl Memory -G_ResourceHandle G_PushResource(G_ArenaHandle arena_handle, G_CommandListHandle cl_handle, G_ResourceDesc desc) -{ - Arena *perm = PermArena(); - G_D12_Arena *gpu_arena = G_D12_ArenaFromHandle(arena_handle); - G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle); - G_QueueKind queue_kind = cl->queue_kind; - G_D12_Resource *resource = 0; +// G_ResourceHandle G_PushResource(G_ArenaHandle arena_handle, G_CommandListHandle cl_handle, G_ResourceDesc desc) +// { +// Arena *perm = PermArena(); +// G_D12_Arena *gpu_arena = G_D12_ArenaFromHandle(arena_handle); +// G_D12_CmdList *cl = G_D12_CmdListFromHandle(cl_handle); +// G_QueueKind queue_kind = cl->queue_kind; +// G_D12_Resource *resource = 0; - b32 is_buffer = desc.kind == G_ResourceKind_Buffer; - b32 is_texture = ( - desc.kind == G_ResourceKind_Texture1D || - desc.kind == G_ResourceKind_Texture2D || - desc.kind == G_ResourceKind_Texture3D - ); - b32 is_sampler = desc.kind == G_ResourceKind_Sampler; - G_ResourceFlag flags = ( - is_buffer ? desc.buffer.flags : - is_texture ? desc.texture.flags : - desc.sampler.flags - ); - String new_name = ( - is_buffer ? desc.buffer.name : - is_texture ? desc.texture.name : - desc.sampler.name - ); - new_name.len = MinU64(new_name.len, G_D12_MaxNameLen); +// b32 is_buffer = desc.kind == G_ResourceKind_Buffer; +// b32 is_texture = ( +// desc.kind == G_ResourceKind_Texture1D || +// desc.kind == G_ResourceKind_Texture2D || +// desc.kind == G_ResourceKind_Texture3D +// ); +// b32 is_sampler = desc.kind == G_ResourceKind_Sampler; +// G_ResourceFlag flags = ( +// is_buffer ? desc.buffer.flags : +// is_texture ? desc.texture.flags : +// desc.sampler.flags +// ); +// String new_name = ( +// is_buffer ? desc.buffer.name : +// is_texture ? desc.texture.name : +// desc.sampler.name +// ); +// new_name.len = MinU64(new_name.len, G_D12_MaxNameLen); - ////////////////////////////// - //- Initialize heap info +// ////////////////////////////// +// //- Initialize heap info - b32 can_reuse = !AnyBit(flags, G_ResourceFlag_ForceNoReuse); +// b32 can_reuse = !AnyBit(flags, G_ResourceFlag_ForceNoReuse); - D3D12_HEAP_FLAGS heap_flags = 0; - D3D12_HEAP_PROPERTIES heap_props = Zi; - b32 should_map = 0; - if (is_buffer || is_texture) - { - G_D12_ResourceHeapKind heap_kind = G_D12_ResourceHeapKind_Gpu; - // Heap flags - if (flags & G_ResourceFlag_HostMemory) - { - heap_kind = G_D12_ResourceHeapKind_Cpu; - if (flags & G_ResourceFlag_Uncached) - { - heap_kind = G_D12_ResourceHeapKind_CpuWriteCombined; - } - } - if (flags & G_ResourceFlag_ZeroMemory) - { - can_reuse = 0; - } - else - { - heap_flags |= D3D12_HEAP_FLAG_CREATE_NOT_ZEROED; - } - // Heap props - if (heap_kind == G_D12_ResourceHeapKind_Cpu) - { - heap_props.Type = D3D12_HEAP_TYPE_CUSTOM; - heap_props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_WRITE_BACK; - heap_props.MemoryPoolPreference = D3D12_MEMORY_POOL_L0; - should_map = 1; - } - else if (heap_kind == G_D12_ResourceHeapKind_CpuWriteCombined) - { - heap_props.Type = D3D12_HEAP_TYPE_CUSTOM; - heap_props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE; - heap_props.MemoryPoolPreference = D3D12_MEMORY_POOL_L0; - should_map = 1; - } - else - { - heap_props.Type = D3D12_HEAP_TYPE_DEFAULT; - } - } +// D3D12_HEAP_FLAGS heap_flags = 0; +// D3D12_HEAP_PROPERTIES heap_props = Zi; +// b32 should_map = 0; +// if (is_buffer || is_texture) +// { +// G_D12_ResourceHeapKind heap_kind = G_D12_ResourceHeapKind_Gpu; +// // Heap flags +// if (flags & G_ResourceFlag_HostMemory) +// { +// heap_kind = G_D12_ResourceHeapKind_Cpu; +// if (flags & G_ResourceFlag_Uncached) +// { +// heap_kind = G_D12_ResourceHeapKind_CpuWriteCombined; +// } +// } +// if (flags & G_ResourceFlag_ZeroMemory) +// { +// can_reuse = 0; +// } +// else +// { +// heap_flags |= D3D12_HEAP_FLAG_CREATE_NOT_ZEROED; +// } +// // Heap props +// if (heap_kind == G_D12_ResourceHeapKind_Cpu) +// { +// heap_props.Type = D3D12_HEAP_TYPE_CUSTOM; +// heap_props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_WRITE_BACK; +// heap_props.MemoryPoolPreference = D3D12_MEMORY_POOL_L0; +// should_map = 1; +// } +// else if (heap_kind == G_D12_ResourceHeapKind_CpuWriteCombined) +// { +// heap_props.Type = D3D12_HEAP_TYPE_CUSTOM; +// heap_props.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_WRITE_COMBINE; +// heap_props.MemoryPoolPreference = D3D12_MEMORY_POOL_L0; +// should_map = 1; +// } +// else +// { +// heap_props.Type = D3D12_HEAP_TYPE_DEFAULT; +// } +// } - ////////////////////////////// - //- Initialize d3d resource desc +// ////////////////////////////// +// //- Initialize d3d resource desc - D3D12_CLEAR_VALUE clear_value = Zi; - D3D12_RESOURCE_DESC1 d3d_desc = Zi; - if (is_buffer) - { - u64 min_buffer_size = 1024; - d3d_desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; - d3d_desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; - d3d_desc.Format = DXGI_FORMAT_UNKNOWN; - d3d_desc.Width = NextPow2U64(MaxU64(desc.buffer.size, min_buffer_size)); - d3d_desc.Height = 1; - d3d_desc.DepthOrArraySize = 1; - d3d_desc.MipLevels = 1; - d3d_desc.SampleDesc.Count = 1; - d3d_desc.SampleDesc.Quality = 0; - d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS * AnyBit(flags, G_ResourceFlag_AllowShaderReadWrite); - } - else if (is_texture) - { - i32 largest_dim = MaxI32(MaxI32(desc.texture.dims.x, desc.texture.dims.y), desc.texture.dims.z); - i32 max_mips = MinI32(FloorF32(Log2F32(largest_dim)) + 1, G_MaxMips); - d3d_desc.Dimension = ( - desc.kind == G_ResourceKind_Texture1D ? D3D12_RESOURCE_DIMENSION_TEXTURE1D : - desc.kind == G_ResourceKind_Texture2D ? D3D12_RESOURCE_DIMENSION_TEXTURE2D : - D3D12_RESOURCE_DIMENSION_TEXTURE3D - ); - d3d_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; - d3d_desc.Format = G_D12_DxgiFormatFromGpuFormat(desc.texture.format); - d3d_desc.Width = MaxI32(desc.texture.dims.x, 1); - d3d_desc.Height = MaxI32(desc.texture.dims.y, 1); - d3d_desc.DepthOrArraySize = MaxI32(desc.texture.dims.z, 1); - d3d_desc.MipLevels = ClampF32(desc.texture.max_mips, 1, max_mips); - d3d_desc.SampleDesc.Count = 1; - d3d_desc.SampleDesc.Quality = 0; - d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS * AnyBit(flags, G_ResourceFlag_AllowShaderReadWrite); - d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET * AnyBit(flags, G_ResourceFlag_AllowRenderTarget); - d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL * AnyBit(flags, G_ResourceFlag_AllowDepthStencil); - d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS * (desc.texture.initial_layout == G_Layout_Simultaneous); - clear_value.Color[0] = desc.texture.clear_color.x, - clear_value.Color[1] = desc.texture.clear_color.y, - clear_value.Color[2] = desc.texture.clear_color.z, - clear_value.Color[3] = desc.texture.clear_color.w, - clear_value.Format = d3d_desc.Format; - } +// D3D12_CLEAR_VALUE clear_value = Zi; +// D3D12_RESOURCE_DESC1 d3d_desc = Zi; +// if (is_buffer) +// { +// u64 min_buffer_size = 1024; +// d3d_desc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; +// d3d_desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; +// d3d_desc.Format = DXGI_FORMAT_UNKNOWN; +// d3d_desc.Width = NextPow2U64(MaxU64(desc.buffer.size, min_buffer_size)); +// d3d_desc.Height = 1; +// d3d_desc.DepthOrArraySize = 1; +// d3d_desc.MipLevels = 1; +// d3d_desc.SampleDesc.Count = 1; +// d3d_desc.SampleDesc.Quality = 0; +// d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS * AnyBit(flags, G_ResourceFlag_AllowShaderReadWrite); +// } +// else if (is_texture) +// { +// i32 largest_dim = MaxI32(MaxI32(desc.texture.dims.x, desc.texture.dims.y), desc.texture.dims.z); +// i32 max_mips = MinI32(FloorF32(Log2F32(largest_dim)) + 1, G_MaxMips); +// d3d_desc.Dimension = ( +// desc.kind == G_ResourceKind_Texture1D ? D3D12_RESOURCE_DIMENSION_TEXTURE1D : +// desc.kind == G_ResourceKind_Texture2D ? D3D12_RESOURCE_DIMENSION_TEXTURE2D : +// D3D12_RESOURCE_DIMENSION_TEXTURE3D +// ); +// d3d_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; +// d3d_desc.Format = G_D12_DxgiFormatFromGpuFormat(desc.texture.format); +// d3d_desc.Width = MaxI32(desc.texture.dims.x, 1); +// d3d_desc.Height = MaxI32(desc.texture.dims.y, 1); +// d3d_desc.DepthOrArraySize = MaxI32(desc.texture.dims.z, 1); +// d3d_desc.MipLevels = ClampF32(desc.texture.max_mips, 1, max_mips); +// d3d_desc.SampleDesc.Count = 1; +// d3d_desc.SampleDesc.Quality = 0; +// d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_UNORDERED_ACCESS * AnyBit(flags, G_ResourceFlag_AllowShaderReadWrite); +// d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET * AnyBit(flags, G_ResourceFlag_AllowRenderTarget); +// d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL * AnyBit(flags, G_ResourceFlag_AllowDepthStencil); +// d3d_desc.Flags |= D3D12_RESOURCE_FLAG_ALLOW_SIMULTANEOUS_ACCESS * (desc.texture.initial_layout == G_Layout_Simultaneous); +// clear_value.Color[0] = desc.texture.clear_color.x, +// clear_value.Color[1] = desc.texture.clear_color.y, +// clear_value.Color[2] = desc.texture.clear_color.z, +// clear_value.Color[3] = desc.texture.clear_color.w, +// clear_value.Format = d3d_desc.Format; +// } - ////////////////////////////// - //- Check for reset-resource reusability +// ////////////////////////////// +// //- Check for reset-resource reusability - // Pop reset resource - resource = gpu_arena->reset_resources.first; - if (resource) - { - DllQueueRemove(gpu_arena->reset_resources.first, gpu_arena->reset_resources.last, resource); - --gpu_arena->reset_resources.count; +// // Pop reset resource +// resource = gpu_arena->reset_resources.first; +// if (resource) +// { +// DllQueueRemove(gpu_arena->reset_resources.first, gpu_arena->reset_resources.last, resource); +// --gpu_arena->reset_resources.count; - D3D12_RESOURCE_DESC1 reset_d3d_desc = Zi; - D3D12_RESOURCE_DESC1 compare_d3d_desc = Zi; - CopyStruct(&reset_d3d_desc, &resource->d3d_desc); - CopyStruct(&compare_d3d_desc, &reset_d3d_desc); +// D3D12_RESOURCE_DESC1 reset_d3d_desc = Zi; +// D3D12_RESOURCE_DESC1 compare_d3d_desc = Zi; +// CopyStruct(&reset_d3d_desc, &resource->d3d_desc); +// CopyStruct(&compare_d3d_desc, &reset_d3d_desc); - // Buffers can be reused if size fits - if (d3d_desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER && reset_d3d_desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) - { - if (reset_d3d_desc.Width >= d3d_desc.Width) - { - compare_d3d_desc.Width = d3d_desc.Width; - } - } +// // Buffers can be reused if size fits +// if (d3d_desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER && reset_d3d_desc.Dimension == D3D12_RESOURCE_DIMENSION_BUFFER) +// { +// if (reset_d3d_desc.Width >= d3d_desc.Width) +// { +// compare_d3d_desc.Width = d3d_desc.Width; +// } +// } - // TODO: Less stringent reuse constraints. We could even create textures as placed resources and reset their underlying heaps. - can_reuse = can_reuse && MatchStruct(&compare_d3d_desc, &d3d_desc); - if (!can_reuse) - { - // Push releasable to command list - { - G_D12_Releasable *release = 0; - { - Lock lock = LockE(&G_D12.free_releases_mutex); - { - release = G_D12.free_releases.first; - if (release) - { - SllQueuePop(G_D12.free_releases.first, G_D12.free_releases.last); - } - else - { - release = PushStructNoZero(perm, G_D12_Releasable); - } - } - Unlock(&lock); - } - ZeroStruct(release); - SllQueuePush(cl->releases.first, cl->releases.last, release); - release->d3d_resource = resource->d3d_resource; - } - ZeroStruct(resource); - } - } - else - { - can_reuse = 0; - resource = PushStruct(gpu_arena->arena, G_D12_Resource); - } +// // TODO: Less stringent reuse constraints. We could even create textures as placed resources and reset their underlying heaps. +// can_reuse = can_reuse && MatchStruct(&compare_d3d_desc, &d3d_desc); +// if (!can_reuse) +// { +// // Push releasable to command list +// { +// G_D12_Releasable *release = 0; +// { +// Lock lock = LockE(&G_D12.free_releases_mutex); +// { +// release = G_D12.free_releases.first; +// if (release) +// { +// SllQueuePop(G_D12.free_releases.first, G_D12.free_releases.last); +// } +// else +// { +// release = PushStructNoZero(perm, G_D12_Releasable); +// } +// } +// Unlock(&lock); +// } +// ZeroStruct(release); +// SllQueuePush(cl->releases.first, cl->releases.last, release); +// release->d3d_resource = resource->d3d_resource; +// } +// ZeroStruct(resource); +// } +// } +// else +// { +// can_reuse = 0; +// resource = PushStruct(gpu_arena->arena, G_D12_Resource); +// } - if (!can_reuse) - { - resource->d3d_desc = d3d_desc; - } +// if (!can_reuse) +// { +// resource->d3d_desc = d3d_desc; +// } - ////////////////////////////// - //- Init resource +// ////////////////////////////// +// //- Init resource - resource->flags = flags; +// resource->flags = flags; - if (is_buffer) - { - resource->buffer_size = desc.buffer.size; - resource->buffer_size_actual = d3d_desc.Width; - } +// if (is_buffer) +// { +// resource->buffer_size = desc.buffer.size; +// resource->buffer_size_actual = d3d_desc.Width; +// } - if (is_texture) - { - resource->is_texture = is_texture; - resource->texture_format = desc.texture.format; - resource->texture_dims = desc.texture.dims; - resource->texture_mips = d3d_desc.MipLevels; - } +// if (is_texture) +// { +// resource->is_texture = is_texture; +// resource->texture_format = desc.texture.format; +// resource->texture_dims = desc.texture.dims; +// resource->texture_mips = d3d_desc.MipLevels; +// } - if (is_sampler) - { - resource->sampler_desc = desc.sampler; - } +// if (is_sampler) +// { +// resource->sampler_desc = desc.sampler; +// } - DllQueuePush(gpu_arena->resources.first, gpu_arena->resources.last, resource); - ++gpu_arena->resources.count; +// DllQueuePush(gpu_arena->resources.first, gpu_arena->resources.last, resource); +// ++gpu_arena->resources.count; - ////////////////////////////// - //- Allocate D3D12 resource +// ////////////////////////////// +// //- Allocate D3D12 resource - if ((is_buffer || is_texture) && !resource->d3d_resource) - { - D3D12_CLEAR_VALUE *clear_value_arg = 0; - if (d3d_desc.Flags & (D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL)) - { - clear_value_arg = &clear_value; - } +// if ((is_buffer || is_texture) && !resource->d3d_resource) +// { +// D3D12_CLEAR_VALUE *clear_value_arg = 0; +// if (d3d_desc.Flags & (D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL)) +// { +// clear_value_arg = &clear_value; +// } - D3D12_BARRIER_LAYOUT d3d_initial_layout = D3D12_BARRIER_LAYOUT_UNDEFINED; - if (is_texture) - { - d3d_initial_layout = D3D12_BARRIER_LAYOUT_COMMON; - if (desc.texture.initial_layout == G_Layout_Exclusive) - { - switch (queue_kind) - { - case G_QueueKind_Direct: d3d_initial_layout = D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_COMMON; break; - case G_QueueKind_AsyncCompute: d3d_initial_layout = D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_COMMON; break; - } - } - } +// D3D12_BARRIER_LAYOUT d3d_initial_layout = D3D12_BARRIER_LAYOUT_UNDEFINED; +// if (is_texture) +// { +// d3d_initial_layout = D3D12_BARRIER_LAYOUT_COMMON; +// if (desc.texture.initial_layout == G_Layout_Exclusive) +// { +// switch (queue_kind) +// { +// case G_QueueKind_Direct: d3d_initial_layout = D3D12_BARRIER_LAYOUT_DIRECT_QUEUE_COMMON; break; +// case G_QueueKind_AsyncCompute: d3d_initial_layout = D3D12_BARRIER_LAYOUT_COMPUTE_QUEUE_COMMON; break; +// } +// } +// } - HRESULT hr = ID3D12Device10_CreateCommittedResource3( - G_D12.device, - &heap_props, - heap_flags, - &resource->d3d_desc, - d3d_initial_layout, - clear_value_arg, - 0, // pProtectedSession - 0, // NumCastableFormats - 0, // pCastableFormats - &IID_ID3D12Resource, - (void **)&resource->d3d_resource - ); - Atomic64FetchAdd(&G_D12.cumulative_nonreuse_count, 1); - resource->uid = Atomic64FetchAdd(&G_D12.resource_creation_gen.v, d3d_desc.MipLevels); +// HRESULT hr = ID3D12Device10_CreateCommittedResource3( +// G_D12.device, +// &heap_props, +// heap_flags, +// &resource->d3d_desc, +// d3d_initial_layout, +// clear_value_arg, +// 0, // pProtectedSession +// 0, // NumCastableFormats +// 0, // pCastableFormats +// &IID_ID3D12Resource, +// (void **)&resource->d3d_resource +// ); +// Atomic64FetchAdd(&G_D12.cumulative_nonreuse_count, 1); +// resource->uid = Atomic64FetchAdd(&G_D12.resource_creation_gen.v, d3d_desc.MipLevels); - // Queue initial Rtv/Dsv discard - if ( - !AnyBit(flags, G_ResourceFlag_ZeroMemory) && - AnyBit(d3d_desc.Flags, D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL) - ) - { - G_D12_Cmd *cmd = G_D12_PushCmd(cl); - cmd->kind = G_D12_CmdKind_Discard; - cmd->discard.resource = resource; - } +// // Queue initial Rtv/Dsv discard +// if ( +// !AnyBit(flags, G_ResourceFlag_ZeroMemory) && +// AnyBit(d3d_desc.Flags, D3D12_RESOURCE_FLAG_ALLOW_RENDER_TARGET | D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL) +// ) +// { +// G_D12_Cmd *cmd = G_D12_PushCmd(cl); +// cmd->kind = G_D12_CmdKind_Discard; +// cmd->discard.resource = resource; +// } - if (!SUCCEEDED(hr)) - { - // TODO: Don't panic - Panic(Lit("Failed to allocate D3D12 resource")); - } +// if (!SUCCEEDED(hr)) +// { +// // TODO: Don't panic +// Panic(Lit("Failed to allocate D3D12 resource")); +// } - if (is_buffer) - { - resource->buffer_gpu_address = ID3D12Resource_GetGPUVirtualAddress(resource->d3d_resource); - } - } +// if (is_buffer) +// { +// resource->buffer_gpu_address = ID3D12Resource_GetGPUVirtualAddress(resource->d3d_resource); +// } +// } - if (should_map && !resource->mapped) - { - D3D12_RANGE read_range = Zi; - HRESULT hr = ID3D12Resource_Map(resource->d3d_resource, 0, &read_range, &resource->mapped); +// if (should_map && !resource->mapped) +// { +// D3D12_RANGE read_range = Zi; +// HRESULT hr = ID3D12Resource_Map(resource->d3d_resource, 0, &read_range, &resource->mapped); - if (!SUCCEEDED(hr)) - { - // TODO: Don't panic - Panic(Lit("Failed to map D3D12 resource")); - } - } +// if (!SUCCEEDED(hr)) +// { +// // TODO: Don't panic +// Panic(Lit("Failed to map D3D12 resource")); +// } +// } - ////////////////////////////// - //- Set debug information +// ////////////////////////////// +// //- Set debug information - String old_name = STRING(resource->name_len, (u8 *)resource->name_cstr); - if (!MatchString(old_name, new_name)) - { - resource->name_len = new_name.len; - CopyBytes(resource->name_cstr, new_name.text, new_name.len); - resource->name_cstr[new_name.len] = 0; - if (resource->d3d_resource) - { - G_D12_SetObjectName((ID3D12Object *)resource->d3d_resource, new_name); - } - } +// String old_name = STRING(resource->name_len, (u8 *)resource->name_cstr); +// if (!MatchString(old_name, new_name)) +// { +// resource->name_len = new_name.len; +// CopyBytes(resource->name_cstr, new_name.text, new_name.len); +// resource->name_cstr[new_name.len] = 0; +// if (resource->d3d_resource) +// { +// G_D12_SetObjectName((ID3D12Object *)resource->d3d_resource, new_name); +// } +// } - ////////////////////////////// - //- Transition reused resources to common +// ////////////////////////////// +// //- Transition reused resources to common - G_ResourceHandle resource_handle = G_D12_MakeHandle(G_ResourceHandle, resource); - if ( - can_reuse && - desc.texture.initial_layout == G_Layout_Common && - queue_kind != G_QueueKind_AsyncCopy - ) - { - G_SyncLayout(cl_handle, resource_handle, G_Layout_Common); - } +// G_ResourceHandle resource_handle = G_D12_MakeHandle(G_ResourceHandle, resource); +// if ( +// can_reuse && +// desc.texture.initial_layout == G_Layout_Common && +// queue_kind != G_QueueKind_AsyncCopy +// ) +// { +// G_SyncLayout(cl_handle, resource_handle, G_Layout_Common); +// } - return resource_handle; -} +// return resource_handle; +// } //////////////////////////////////////////////////////////// //~ Descriptor @@ -1608,208 +1608,208 @@ G_D12_Descriptor *G_D12_PushDescriptor(G_D12_Arena *gpu_arena, G_D12_DescriptorH //////////////////////////////////////////////////////////// //~ @hookimpl Shader resource reference -u32 G_PushRef(G_ArenaHandle arena_handle, G_ResourceHandle resource_handle, G_RefDesc ref_desc) -{ - G_D12_Arena *gpu_arena = G_D12_ArenaFromHandle(arena_handle); - G_D12_Resource *resource = G_D12_ResourceFromHandle(resource_handle); - u32 result = 0; +// u32 G_PushRef(G_ArenaHandle arena_handle, G_ResourceHandle resource_handle, G_RefDesc ref_desc) +// { +// G_D12_Arena *gpu_arena = G_D12_ArenaFromHandle(arena_handle); +// G_D12_Resource *resource = G_D12_ResourceFromHandle(resource_handle); +// u32 result = 0; - G_RefKind kind = ref_desc.kind; - b32 is_buffer = ( - kind == G_RefKind_StructuredBuffer || - kind == G_RefKind_ByteAddressBuffer - ); - b32 is_sampler = kind == G_RefKind_SamplerState; - b32 is_texture = !is_buffer && !is_sampler; - b32 is_raw = kind == G_RefKind_ByteAddressBuffer; - b32 is_writable = resource->flags & G_ResourceFlag_AllowShaderReadWrite; +// G_RefKind kind = ref_desc.kind; +// b32 is_buffer = ( +// kind == G_RefKind_StructuredBuffer || +// kind == G_RefKind_ByteAddressBuffer +// ); +// b32 is_sampler = kind == G_RefKind_SamplerState; +// b32 is_texture = !is_buffer && !is_sampler; +// b32 is_raw = kind == G_RefKind_ByteAddressBuffer; +// b32 is_writable = resource->flags & G_ResourceFlag_AllowShaderReadWrite; - G_D12_Descriptor *descriptor = 0; - if (is_buffer || is_texture) - { - descriptor = G_D12_PushDescriptor(gpu_arena, G_D12_DescriptorHeapKind_CbvSrvUav); +// G_D12_Descriptor *descriptor = 0; +// if (is_buffer || is_texture) +// { +// descriptor = G_D12_PushDescriptor(gpu_arena, G_D12_DescriptorHeapKind_CbvSrvUav); - G_D12_DescriptorHeap *heap = &G_D12.descriptor_heaps[G_D12_DescriptorHeapKind_CbvSrvUav]; - Assert(heap->per_batch_count >= 2); - D3D12_CPU_DESCRIPTOR_HANDLE readonly_handle = descriptor->first_handle; - D3D12_CPU_DESCRIPTOR_HANDLE readwrite_handle = descriptor->first_handle; - readwrite_handle.ptr += heap->descriptor_size; +// G_D12_DescriptorHeap *heap = &G_D12.descriptor_heaps[G_D12_DescriptorHeapKind_CbvSrvUav]; +// Assert(heap->per_batch_count >= 2); +// D3D12_CPU_DESCRIPTOR_HANDLE readonly_handle = descriptor->first_handle; +// D3D12_CPU_DESCRIPTOR_HANDLE readwrite_handle = descriptor->first_handle; +// readwrite_handle.ptr += heap->descriptor_size; - b32 srv_ok = 0; - b32 uav_ok = 0; +// b32 srv_ok = 0; +// b32 uav_ok = 0; - D3D12_SHADER_RESOURCE_VIEW_DESC srv_desc = Zi; - D3D12_UNORDERED_ACCESS_VIEW_DESC uav_desc = Zi; +// D3D12_SHADER_RESOURCE_VIEW_DESC srv_desc = Zi; +// D3D12_UNORDERED_ACCESS_VIEW_DESC uav_desc = Zi; - if (is_buffer) - { - if (is_raw) - { - ref_desc.element_size = 4; - ref_desc.element_offset /= 4; - } +// if (is_buffer) +// { +// if (is_raw) +// { +// ref_desc.element_size = 4; +// ref_desc.element_offset /= 4; +// } - u64 buffer_size_actual = resource->buffer_size_actual; - u64 num_elements_in_buffer = buffer_size_actual / ref_desc.element_size; - u64 num_elements_after_offset = num_elements_in_buffer > ref_desc.element_offset ? num_elements_in_buffer - ref_desc.element_offset : 0; +// u64 buffer_size_actual = resource->buffer_size_actual; +// u64 num_elements_in_buffer = buffer_size_actual / ref_desc.element_size; +// u64 num_elements_after_offset = num_elements_in_buffer > ref_desc.element_offset ? num_elements_in_buffer - ref_desc.element_offset : 0; - //- Create buffer SRV - { - { - srv_desc.Format = DXGI_FORMAT_UNKNOWN; - srv_desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER; - srv_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - srv_desc.Buffer.FirstElement = ref_desc.element_offset; - srv_desc.Buffer.NumElements = num_elements_after_offset; - srv_desc.Buffer.StructureByteStride = ref_desc.element_size; - srv_desc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE; - } - if (is_raw) - { - srv_desc.Format = DXGI_FORMAT_R32_TYPELESS; - srv_desc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_RAW; - srv_desc.Buffer.StructureByteStride = 0; - } - srv_ok = 1; - } - //- Create buffer UAV - { - { - uav_desc.Format = DXGI_FORMAT_UNKNOWN; - uav_desc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER; - uav_desc.Buffer.FirstElement = ref_desc.element_offset; - uav_desc.Buffer.NumElements = num_elements_after_offset; - uav_desc.Buffer.StructureByteStride = ref_desc.element_size; - uav_desc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE; - } - if (is_raw) - { - uav_desc.Format = DXGI_FORMAT_R32_TYPELESS; - uav_desc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_RAW; - uav_desc.Buffer.StructureByteStride = 0; - } - } - if (num_elements_after_offset > 0) - { - srv_ok = 1; - if (is_writable) - { - uav_ok = 1; - } - } - } - else if (is_texture) - { - // DXGI_FORMAT format = G_D12_DxgiFormatFromGpuFormat(resource->texture_format); - RngI32 mips = ref_desc.mips; - mips.min = ClampI32(mips.min, 0, resource->texture_mips - 1); - mips.max = ClampI32(mips.max, mips.min, resource->texture_mips - 1); - //- Create texture SRV - { - srv_desc.Format = DXGI_FORMAT_UNKNOWN; - srv_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; - if (ref_desc.kind == G_RefKind_Texture1D) - { - srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1D; - srv_desc.Texture1D.MostDetailedMip = mips.min; - srv_desc.Texture1D.MipLevels = mips.max - mips.min + 1; - } - else if (ref_desc.kind == G_RefKind_Texture2D) - { - srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; - srv_desc.Texture2D.MostDetailedMip = mips.min; - srv_desc.Texture2D.MipLevels = mips.max - mips.min + 1; - } - else if (ref_desc.kind == G_RefKind_Texture3D) - { - srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D; - srv_desc.Texture3D.MostDetailedMip = mips.min; - srv_desc.Texture3D.MipLevels = mips.max - mips.min + 1; - } - } - //- Create texture UAV - { - uav_desc.Format = DXGI_FORMAT_UNKNOWN; - if (ref_desc.kind == G_RefKind_Texture1D) - { - uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE1D; - uav_desc.Texture1D.MipSlice = mips.min; - } - else if (ref_desc.kind == G_RefKind_Texture2D) - { - uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; - uav_desc.Texture2D.MipSlice = mips.min; - } - else if (ref_desc.kind == G_RefKind_Texture3D) - { - uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE3D; - uav_desc.Texture3D.MipSlice = mips.min; - uav_desc.Texture3D.WSize = U32Max; - } - } +// //- Create buffer SRV +// { +// { +// srv_desc.Format = DXGI_FORMAT_UNKNOWN; +// srv_desc.ViewDimension = D3D12_SRV_DIMENSION_BUFFER; +// srv_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; +// srv_desc.Buffer.FirstElement = ref_desc.element_offset; +// srv_desc.Buffer.NumElements = num_elements_after_offset; +// srv_desc.Buffer.StructureByteStride = ref_desc.element_size; +// srv_desc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_NONE; +// } +// if (is_raw) +// { +// srv_desc.Format = DXGI_FORMAT_R32_TYPELESS; +// srv_desc.Buffer.Flags = D3D12_BUFFER_SRV_FLAG_RAW; +// srv_desc.Buffer.StructureByteStride = 0; +// } +// srv_ok = 1; +// } +// //- Create buffer UAV +// { +// { +// uav_desc.Format = DXGI_FORMAT_UNKNOWN; +// uav_desc.ViewDimension = D3D12_UAV_DIMENSION_BUFFER; +// uav_desc.Buffer.FirstElement = ref_desc.element_offset; +// uav_desc.Buffer.NumElements = num_elements_after_offset; +// uav_desc.Buffer.StructureByteStride = ref_desc.element_size; +// uav_desc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_NONE; +// } +// if (is_raw) +// { +// uav_desc.Format = DXGI_FORMAT_R32_TYPELESS; +// uav_desc.Buffer.Flags = D3D12_BUFFER_UAV_FLAG_RAW; +// uav_desc.Buffer.StructureByteStride = 0; +// } +// } +// if (num_elements_after_offset > 0) +// { +// srv_ok = 1; +// if (is_writable) +// { +// uav_ok = 1; +// } +// } +// } +// else if (is_texture) +// { +// // DXGI_FORMAT format = G_D12_DxgiFormatFromGpuFormat(resource->texture_format); +// RngI32 mips = ref_desc.mips; +// mips.min = ClampI32(mips.min, 0, resource->texture_mips - 1); +// mips.max = ClampI32(mips.max, mips.min, resource->texture_mips - 1); +// //- Create texture SRV +// { +// srv_desc.Format = DXGI_FORMAT_UNKNOWN; +// srv_desc.Shader4ComponentMapping = D3D12_DEFAULT_SHADER_4_COMPONENT_MAPPING; +// if (ref_desc.kind == G_RefKind_Texture1D) +// { +// srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE1D; +// srv_desc.Texture1D.MostDetailedMip = mips.min; +// srv_desc.Texture1D.MipLevels = mips.max - mips.min + 1; +// } +// else if (ref_desc.kind == G_RefKind_Texture2D) +// { +// srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE2D; +// srv_desc.Texture2D.MostDetailedMip = mips.min; +// srv_desc.Texture2D.MipLevels = mips.max - mips.min + 1; +// } +// else if (ref_desc.kind == G_RefKind_Texture3D) +// { +// srv_desc.ViewDimension = D3D12_SRV_DIMENSION_TEXTURE3D; +// srv_desc.Texture3D.MostDetailedMip = mips.min; +// srv_desc.Texture3D.MipLevels = mips.max - mips.min + 1; +// } +// } +// //- Create texture UAV +// { +// uav_desc.Format = DXGI_FORMAT_UNKNOWN; +// if (ref_desc.kind == G_RefKind_Texture1D) +// { +// uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE1D; +// uav_desc.Texture1D.MipSlice = mips.min; +// } +// else if (ref_desc.kind == G_RefKind_Texture2D) +// { +// uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE2D; +// uav_desc.Texture2D.MipSlice = mips.min; +// } +// else if (ref_desc.kind == G_RefKind_Texture3D) +// { +// uav_desc.ViewDimension = D3D12_UAV_DIMENSION_TEXTURE3D; +// uav_desc.Texture3D.MipSlice = mips.min; +// uav_desc.Texture3D.WSize = U32Max; +// } +// } - srv_ok = 1; - if (is_writable) - { - uav_ok = 1; - } +// srv_ok = 1; +// if (is_writable) +// { +// uav_ok = 1; +// } - if (!uav_ok) - { - uav_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - } - } +// if (!uav_ok) +// { +// uav_desc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; +// } +// } - if (srv_ok) - { - ID3D12Device_CreateShaderResourceView(G_D12.device, resource->d3d_resource, &srv_desc, readonly_handle); - } - else - { - ID3D12Device_CreateShaderResourceView(G_D12.device, 0, &srv_desc, readonly_handle); - } +// if (srv_ok) +// { +// ID3D12Device_CreateShaderResourceView(G_D12.device, resource->d3d_resource, &srv_desc, readonly_handle); +// } +// else +// { +// ID3D12Device_CreateShaderResourceView(G_D12.device, 0, &srv_desc, readonly_handle); +// } - if (uav_ok) - { - ID3D12Device_CreateUnorderedAccessView(G_D12.device, resource->d3d_resource, 0, &uav_desc, readwrite_handle); - } - else - { - ID3D12Device_CreateUnorderedAccessView(G_D12.device, 0, 0, &uav_desc, readwrite_handle); - } - } - else if (is_sampler) - { - descriptor = G_D12_PushDescriptor(gpu_arena, G_D12_DescriptorHeapKind_Sampler); - G_SamplerDesc sampler_desc = resource->sampler_desc; - D3D12_SAMPLER_DESC d3d_desc = Zi; - { - d3d_desc.Filter = (D3D12_FILTER)sampler_desc.filter; - d3d_desc.AddressU = (D3D12_TEXTURE_ADDRESS_MODE)sampler_desc.x; - d3d_desc.AddressV = (D3D12_TEXTURE_ADDRESS_MODE)sampler_desc.y; - d3d_desc.AddressW = (D3D12_TEXTURE_ADDRESS_MODE)sampler_desc.z; - d3d_desc.MipLODBias = sampler_desc.mip_lod_bias; - d3d_desc.MaxAnisotropy = MaxU32(sampler_desc.max_anisotropy, 1); - d3d_desc.ComparisonFunc = (D3D12_COMPARISON_FUNC)sampler_desc.comparison; - d3d_desc.BorderColor[0] = sampler_desc.border_color.x; - d3d_desc.BorderColor[1] = sampler_desc.border_color.y; - d3d_desc.BorderColor[2] = sampler_desc.border_color.z; - d3d_desc.BorderColor[3] = sampler_desc.border_color.w; - d3d_desc.MinLOD = sampler_desc.min_lod; - d3d_desc.MaxLOD = sampler_desc.max_lod; - } - if (d3d_desc.AddressU == 0) d3d_desc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; - if (d3d_desc.AddressV == 0) d3d_desc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; - if (d3d_desc.AddressW == 0) d3d_desc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; - if (d3d_desc.MaxLOD >= Inf) - { - d3d_desc.MaxLOD = D3D12_FLOAT32_MAX; - } - ID3D12Device_CreateSampler(G_D12.device, &d3d_desc, descriptor->first_handle); - } +// if (uav_ok) +// { +// ID3D12Device_CreateUnorderedAccessView(G_D12.device, resource->d3d_resource, 0, &uav_desc, readwrite_handle); +// } +// else +// { +// ID3D12Device_CreateUnorderedAccessView(G_D12.device, 0, 0, &uav_desc, readwrite_handle); +// } +// } +// else if (is_sampler) +// { +// descriptor = G_D12_PushDescriptor(gpu_arena, G_D12_DescriptorHeapKind_Sampler); +// G_SamplerDesc sampler_desc = resource->sampler_desc; +// D3D12_SAMPLER_DESC d3d_desc = Zi; +// { +// d3d_desc.Filter = (D3D12_FILTER)sampler_desc.filter; +// d3d_desc.AddressU = (D3D12_TEXTURE_ADDRESS_MODE)sampler_desc.x; +// d3d_desc.AddressV = (D3D12_TEXTURE_ADDRESS_MODE)sampler_desc.y; +// d3d_desc.AddressW = (D3D12_TEXTURE_ADDRESS_MODE)sampler_desc.z; +// d3d_desc.MipLODBias = sampler_desc.mip_lod_bias; +// d3d_desc.MaxAnisotropy = MaxU32(sampler_desc.max_anisotropy, 1); +// d3d_desc.ComparisonFunc = (D3D12_COMPARISON_FUNC)sampler_desc.comparison; +// d3d_desc.BorderColor[0] = sampler_desc.border_color.x; +// d3d_desc.BorderColor[1] = sampler_desc.border_color.y; +// d3d_desc.BorderColor[2] = sampler_desc.border_color.z; +// d3d_desc.BorderColor[3] = sampler_desc.border_color.w; +// d3d_desc.MinLOD = sampler_desc.min_lod; +// d3d_desc.MaxLOD = sampler_desc.max_lod; +// } +// if (d3d_desc.AddressU == 0) d3d_desc.AddressU = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; +// if (d3d_desc.AddressV == 0) d3d_desc.AddressV = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; +// if (d3d_desc.AddressW == 0) d3d_desc.AddressW = D3D12_TEXTURE_ADDRESS_MODE_CLAMP; +// if (d3d_desc.MaxLOD >= Inf) +// { +// d3d_desc.MaxLOD = D3D12_FLOAT32_MAX; +// } +// ID3D12Device_CreateSampler(G_D12.device, &d3d_desc, descriptor->first_handle); +// } - return descriptor->index; -} +// return descriptor->index; +// } //- Count diff --git a/src/gpu/gpu_shared.cgh b/src/gpu/gpu_shared.cgh index c88f6d80..473748d4 100644 --- a/src/gpu/gpu_shared.cgh +++ b/src/gpu/gpu_shared.cgh @@ -1,22 +1,13 @@ //////////////////////////////////////////////////////////// -//~ Ref types +//~ Gpu memory reference types -Enum(G_RefKind) -{ - G_RefKind_StructuredBuffer, - G_RefKind_ByteAddressBuffer, - G_RefKind_Texture1D, - G_RefKind_Texture2D, - G_RefKind_Texture3D, - G_RefKind_SamplerState, -}; +typedef u32 G_BaseDescriptorIndex; -Struct(G_StructuredBufferRef) { u32 v; }; -Struct(G_ByteAddressBufferRef) { u32 v; }; -Struct(G_Texture1DRef) { u32 v; }; -Struct(G_Texture2DRef) { u32 v; }; -Struct(G_Texture3DRef) { u32 v; }; -Struct(G_SamplerStateRef) { u32 v; }; +Struct(G_BufferRef) { G_BaseDescriptorIndex v; }; +Struct(G_Texture1DRef) { G_BaseDescriptorIndex v; }; +Struct(G_Texture2DRef) { G_BaseDescriptorIndex v; }; +Struct(G_Texture3DRef) { G_BaseDescriptorIndex v; }; +Struct(G_SamplerRef) { G_BaseDescriptorIndex v; }; #define G_IsRefNil(r) ((r).v == 0) @@ -52,7 +43,7 @@ Struct(G_SamplerStateRef) { u32 v; }; StaticAssert(G_NumGeneralPurposeConstants == 24); StaticAssert(G_NumReservedConstants >= 3); -G_ForceDeclConstant(G_ByteAddressBufferRef, G_ShaderConst_PrintBufferRef, 24); +G_ForceDeclConstant(G_BufferRef, G_ShaderConst_PrintBuffer, 24); G_ForceDeclConstant(b32, G_ShaderConst_TweakB32, 25); G_ForceDeclConstant(f32, G_ShaderConst_TweakF32, 26); @@ -85,31 +76,70 @@ Enum(G_BasicSamplerKind) #if IsGpu // NOTE: Uniform dereferencing is faster than Non-Uniform on AMD hardware + + + + + + + + + //- Scalar/Uniform dereference - SamplerState G_SDeref(G_SamplerStateRef r) { return SamplerDescriptorHeap[r.v]; } - template StructuredBuffer G_SDeref(G_StructuredBufferRef r) { return ResourceDescriptorHeap[r.v]; } - ByteAddressBuffer G_SDeref(G_ByteAddressBufferRef r) { return ResourceDescriptorHeap[r.v]; } - template Texture1D G_SDeref(G_Texture1DRef r) { return ResourceDescriptorHeap[r.v]; } - template Texture2D G_SDeref(G_Texture2DRef r) { return ResourceDescriptorHeap[r.v]; } - template Texture3D G_SDeref(G_Texture3DRef r) { return ResourceDescriptorHeap[r.v]; } - template RWStructuredBuffer G_SDerefRW(G_StructuredBufferRef r) { return ResourceDescriptorHeap[r.v + 1]; } - RWByteAddressBuffer G_SDerefRW(G_ByteAddressBufferRef r) { return ResourceDescriptorHeap[r.v + 1]; } - template RWTexture1D G_SDerefRW(G_Texture1DRef r) { return ResourceDescriptorHeap[r.v + 1]; } - template RWTexture2D G_SDerefRW(G_Texture2DRef r) { return ResourceDescriptorHeap[r.v + 1]; } - template RWTexture3D G_SDerefRW(G_Texture3DRef r) { return ResourceDescriptorHeap[r.v + 1]; } + template StructuredBuffer G_SDeref(G_BufferRef r) { return ResourceDescriptorHeap[r.v + 0]; } + template RWStructuredBuffer G_SDerefRW(G_BufferRef r) { return ResourceDescriptorHeap[r.v + 1]; } + ByteAddressBuffer G_SDerefRaw(G_BufferRef r) { return ResourceDescriptorHeap[r.v + 2]; } + RWByteAddressBuffer G_SDerefRawRW(G_BufferRef r) { return ResourceDescriptorHeap[r.v + 3]; } + template Texture1D G_SDeref(G_Texture1DRef r, u32 mip=0) { return ResourceDescriptorHeap[r.v + (mip * 2) + 0]; } + template Texture2D G_SDeref(G_Texture2DRef r, u32 mip=0) { return ResourceDescriptorHeap[r.v + (mip * 2) + 0]; } + template Texture3D G_SDeref(G_Texture3DRef r, u32 mip=0) { return ResourceDescriptorHeap[r.v + (mip * 2) + 0]; } + template RWTexture1D G_SDerefRW(G_Texture1DRef r, u32 mip=0) { return ResourceDescriptorHeap[r.v + (mip * 2) + 1]; } + template RWTexture2D G_SDerefRW(G_Texture2DRef r, u32 mip=0) { return ResourceDescriptorHeap[r.v + (mip * 2) + 1]; } + template RWTexture3D G_SDerefRW(G_Texture3DRef r, u32 mip=0) { return ResourceDescriptorHeap[r.v + (mip * 2) + 1]; } + SamplerState G_SDeref(G_SamplerRef r) { return SamplerDescriptorHeap[r.v]; } //- Vector/Non-Uniform dereference - SamplerState G_VDeref(G_SamplerStateRef r) { return SamplerDescriptorHeap[NonUniformResourceIndex(r.v)]; } - template StructuredBuffer G_VDeref(G_StructuredBufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } - ByteAddressBuffer G_VDeref(G_ByteAddressBufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } - template Texture1D G_VDeref(G_Texture1DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } - template Texture2D G_VDeref(G_Texture2DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } - template Texture3D G_VDeref(G_Texture3DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v)]; } - template RWStructuredBuffer G_VDerefRW(G_StructuredBufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 1)]; } - RWByteAddressBuffer G_VDerefRW(G_ByteAddressBufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 1)]; } - template RWTexture1D G_VDerefRW(G_Texture1DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 1)]; } - template RWTexture2D G_VDerefRW(G_Texture2DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 1)]; } - template RWTexture3D G_VDerefRW(G_Texture3DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 1)]; } + template StructuredBuffer G_VDeref(G_BufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 0)]; } + template RWStructuredBuffer G_VDerefRW(G_BufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 1)]; } + ByteAddressBuffer G_VDerefRaw(G_BufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 2)]; } + RWByteAddressBuffer G_VDerefRawRW(G_BufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 3)]; } + template Texture1D G_VDeref(G_Texture1DRef r, u32 mip=0) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + (mip * 2) + 0)]; } + template Texture2D G_VDeref(G_Texture2DRef r, u32 mip=0) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + (mip * 2) + 0)]; } + template Texture3D G_VDeref(G_Texture3DRef r, u32 mip=0) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + (mip * 2) + 0)]; } + template RWTexture1D G_VDerefRW(G_Texture1DRef r, u32 mip=0) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + (mip * 2) + 1)]; } + template RWTexture2D G_VDerefRW(G_Texture2DRef r, u32 mip=0) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + (mip * 2) + 1)]; } + template RWTexture3D G_VDerefRW(G_Texture3DRef r, u32 mip=0) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + (mip * 2) + 1)]; } + SamplerState G_VDeref(G_SamplerRef r) { return SamplerDescriptorHeap[NonUniformResourceIndex(r.v)]; } + + + + + + // //- Scalar/Uniform dereference + // ByteAddressBuffer G_SDerefRaw(G_BufferRef r) { return ResourceDescriptorHeap[r.v + 2]; } + // RWByteAddressBuffer G_SDerefRawRW(G_BufferRef r) { return ResourceDescriptorHeap[r.v + 3]; } + // template StructuredBuffer G_SDeref(G_BufferRef r) { return ResourceDescriptorHeap[r.v + 0]; } + // template RWStructuredBuffer G_SDerefRW(G_BufferRef r) { return ResourceDescriptorHeap[r.v + 1]; } + // template Texture1D G_SDeref(G_Texture1DRef r) { return ResourceDescriptorHeap[r.v + 0]; } + // template Texture2D G_SDeref(G_Texture2DRef r) { return ResourceDescriptorHeap[r.v + 0]; } + // template Texture3D G_SDeref(G_Texture3DRef r) { return ResourceDescriptorHeap[r.v + 0]; } + // template RWTexture1D G_SDerefRW(G_Texture1DRef r) { return ResourceDescriptorHeap[r.v + 1]; } + // template RWTexture2D G_SDerefRW(G_Texture2DRef r) { return ResourceDescriptorHeap[r.v + 1]; } + // template RWTexture3D G_SDerefRW(G_Texture3DRef r) { return ResourceDescriptorHeap[r.v + 1]; } + // SamplerState G_SDeref(G_SamplerStateRef r) { return SamplerDescriptorHeap[r.v]; } + + // //- Vector/Non-Uniform dereference + // ByteAddressBuffer G_VDerefRaw(G_BufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 2)]; } + // RWByteAddressBuffer G_VDerefRawRW(G_BufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 3)]; } + // template StructuredBuffer G_VDeref(G_BufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 0)]; } + // template RWStructuredBuffer G_VDerefRW(G_BufferRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 1)]; } + // template Texture1D G_VDeref(G_Texture1DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 0)]; } + // template Texture2D G_VDeref(G_Texture2DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 0)]; } + // template Texture3D G_VDeref(G_Texture3DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 0)]; } + // template RWTexture1D G_VDerefRW(G_Texture1DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 1)]; } + // template RWTexture2D G_VDerefRW(G_Texture2DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 1)]; } + // template RWTexture3D G_VDerefRW(G_Texture3DRef r) { return ResourceDescriptorHeap[NonUniformResourceIndex(r.v + 1)]; } + // SamplerState G_VDeref(G_SamplerStateRef r) { return SamplerDescriptorHeap[NonUniformResourceIndex(r.v)]; } #endif //////////////////////////////////////////////////////////// @@ -225,7 +255,7 @@ Struct(G_FmtArg) void G_CommitPrint(G_TempPrintBuffer buff) { - RWByteAddressBuffer rw = G_SDerefRW(G_ShaderConst_PrintBufferRef); + RWByteAddressBuffer rw = G_SDerefRawRW(G_ShaderConst_PrintBuffer); if (buff.overflowed) { diff --git a/src/pp/pp_vis/pp_vis_core.c b/src/pp/pp_vis/pp_vis_core.c index b61dbda7..7dd84fa1 100644 --- a/src/pp/pp_vis/pp_vis_core.c +++ b/src/pp/pp_vis/pp_vis_core.c @@ -400,15 +400,6 @@ void V_TickForever(WaveLaneCtx *lane) Vec2I32 cells_dims = VEC2I32(P_CellsPitch, P_CellsPitch); //- Init gpu state - G_ResourceHandle gpu_tiles_res = Zi; - G_ResourceHandle gpu_particles_res = Zi; - G_ResourceHandle gpu_particle_cell_resources[V_ParticleLayer_COUNT]; - G_ResourceHandle gpu_particle_density_resources[V_ParticleLayer_COUNT]; - G_ResourceHandle gpu_stains_res = Zi; - G_ResourceHandle gpu_dry_stains_res = Zi; - G_ResourceHandle gpu_drynesses_res = Zi; - G_ResourceHandle gpu_occluders_res = Zi; - G_Texture2DRef gpu_tiles = Zi; G_StructuredBufferRef gpu_particles = Zi; G_Texture2DRef gpu_particle_cells[V_ParticleLayer_COUNT]; @@ -421,106 +412,85 @@ void V_TickForever(WaveLaneCtx *lane) G_CommandListHandle cl = G_PrepareCommandList(G_QueueKind_Direct); { //- Init tile map texture - { - gpu_tiles_res = G_PushTexture2D( - gpu_perm, cl, - G_Format_R8_Uint, - tiles_dims, - G_Layout_Exclusive, - .flags = G_ResourceFlag_ZeroMemory, - .name = Lit("Tiles") - ); - gpu_tiles = G_PushTexture2DRef(gpu_perm, gpu_tiles_res); - } + gpu_tiles = G_PushTexture2DZero( + cl, + gpu_perm, + G_TextureLayout_Family, + G_Format_R8_Uint, + tiles_dims, + .name = Lit("Tiles") + ); + //- Init particle buffer - { - gpu_particles_res = G_PushBuffer( - gpu_perm, cl, - V_Particle, - V_ParticlesCap, - .flags = G_ResourceFlag_ZeroMemory | G_ResourceFlag_AllowShaderReadWrite, - .name = Lit("Particles") - ); - gpu_particles = G_PushStructuredBufferRef(gpu_perm, gpu_particles_res, V_Particle); - } + gpu_particles = G_PushBufferZero( + cl, + gpu_perm, + V_Particle, + V_ParticlesCap, + .name = Lit("Particles") + ); + //- Init particle textures for (V_ParticleLayer layer = 0; layer < V_ParticleLayer_COUNT; ++layer) { - { - G_ResourceHandle cells_res = G_PushTexture2D( - gpu_perm, cl, - G_Format_R32_Uint, - cells_dims, - G_Layout_Exclusive, - .flags = G_ResourceFlag_ZeroMemory | G_ResourceFlag_AllowShaderReadWrite, - .name = StringF(perm, "Particle cells - layer %F", FmtSint(layer)) - ); - G_Texture2DRef cells = G_PushTexture2DRef(gpu_perm, cells_res); - gpu_particle_cell_resources[layer] = cells_res; - gpu_particle_cells[layer] = cells; - } - { - G_ResourceHandle densities_res = G_PushTexture2D( - gpu_perm, cl, - G_Format_R32_Uint, - cells_dims, - G_Layout_Exclusive, - .flags = G_ResourceFlag_ZeroMemory | G_ResourceFlag_AllowShaderReadWrite, - .name = StringF(perm, "Particle densities - layer %F", FmtSint(layer)) - ); - G_Texture2DRef densities = G_PushTexture2DRef(gpu_perm, densities_res); - gpu_particle_density_resources[layer] = densities_res; - gpu_particle_densities[layer] = densities; - } - } - //- Init stains texture - { - gpu_stains_res = G_PushTexture2D( - gpu_perm, cl, - G_Format_R16G16B16A16_Float, - cells_dims, - G_Layout_Exclusive, - .flags = G_ResourceFlag_ZeroMemory | G_ResourceFlag_AllowShaderReadWrite, - .name = Lit("Stains") - ); - gpu_stains = G_PushTexture2DRef(gpu_perm, gpu_stains_res); - } - //- Init dry stains texture - { - gpu_dry_stains_res = G_PushTexture2D( - gpu_perm, cl, - G_Format_R16G16B16A16_Float, - cells_dims, - G_Layout_Exclusive, - .flags = G_ResourceFlag_ZeroMemory | G_ResourceFlag_AllowShaderReadWrite, - .name = Lit("Dry stains") - ); - gpu_dry_stains = G_PushTexture2DRef(gpu_perm, gpu_dry_stains_res); - } - //- Init dryness texture - { - gpu_drynesses_res = G_PushTexture2D( - gpu_perm, cl, - G_Format_R32_Float, - cells_dims, - G_Layout_Exclusive, - .flags = G_ResourceFlag_ZeroMemory | G_ResourceFlag_AllowShaderReadWrite, - .name = Lit("Drynesses") - ); - gpu_drynesses = G_PushTexture2DRef(gpu_perm, gpu_drynesses_res); - } - //- Init occluders texture - { - gpu_occluders_res = G_PushTexture2D( - gpu_perm, cl, + gpu_particle_cells[layer] = G_PushTexture2DZero( + cl, + gpu_perm, + G_TextureLayout_Family, G_Format_R32_Uint, cells_dims, - G_Layout_Exclusive, - .flags = G_ResourceFlag_ZeroMemory | G_ResourceFlag_AllowShaderReadWrite, - .name = Lit("Occluders cells") + .flags = G_TextureFlag_AllowRW, + .name = StringF(perm, "Particle cells - layer %F", FmtSint(layer)) + ); + gpu_particle_densities[layer] = G_PushTexture2DZero( + cl, + gpu_perm, + G_TextureLayout_Family, + G_Format_R32_Uint, + cells_dims, + .flags = G_TextureFlag_AllowRW, + .name = StringF(perm, "Particle densities - layer %F", FmtSint(layer)) ); - gpu_occluders = G_PushTexture2DRef(gpu_perm, gpu_occluders_res); } + //- Init stains texture + gpu_stains = G_PushTexture2DZero( + cl, + gpu_perm, + G_TextureLayout_Family, + G_Format_R16G16B16A16_Float, + cells_dims, + .flags = G_TextureFlag_AllowRW, + .name = Lit("Stains") + ); + //- Init dry stains texture + gpu_dry_stains = G_PushTexture2DZero( + gpu_perm, cl, + G_TextureLayout_Family, + G_Format_R16G16B16A16_Float, + cells_dims, + .flags = G_TextureFlag_AllowRW, + .name = Lit("Dry stains") + ); + //- Init dryness texture + gpu_drynesses = G_PushTexture2DZero( + cl, + gpu_perm, + G_TextureLayout_Family, + G_Format_R32_Float, + cells_dims, + .flags = G_TextureFlag_AllowRW, + .name = Lit("Drynesses") + ); + //- Init occluders texture + gpu_occluders = G_PushTexture2DZero( + cl, + gpu_perm, + G_TextureLayout_Family, + G_Format_R32_Uint, + cells_dims, + .flags = G_TextureFlag_AllowRW, + .name = Lit("Occluders") + ); } G_CommitCommandList(cl); } @@ -5142,104 +5112,90 @@ void V_TickForever(WaveLaneCtx *lane) // LogDebugF("Uploading tiles to gpu"); G_CopyCpuToTexture( cl, - gpu_tiles_res, VEC3I32(0, 0, 0), + gpu_tiles, VEC3I32(0, 0, 0), frame->local_world->tiles, VEC3I32(tiles_dims.x, tiles_dims.y, 1), RNG3I32(VEC3I32(0, 0, 0), VEC3I32(tiles_dims.x, tiles_dims.y, 1)) ); } // Screen texture - G_ResourceHandle screen_target = G_PushTexture2D( - gpu_frame_arena, cl, + frame->screen = G_PushTexture2D( + cl, gpu_frame_arena, G_Format_R16G16B16A16_Float, frame->screen_dims, - G_Layout_Exclusive, - .flags = G_ResourceFlag_AllowShaderReadWrite | G_ResourceFlag_AllowRenderTarget, + G_TextureLayout_Family, + .flags = G_TextureFlag_AllowRW | G_ResourceFlag_AllowRenderTarget, .name = StringF(frame->arena, "Screen target [%F]", FmtSint(frame->tick)) ); Rng3 screen_viewport = RNG3(VEC3(0, 0, 0), VEC3(frame->screen_dims.x, frame->screen_dims.y, 1)); Rng2 screen_scissor = RNG2(VEC2(screen_viewport.p0.x, screen_viewport.p0.y), VEC2(screen_viewport.p1.x, screen_viewport.p1.y)); - frame->screen = G_PushTexture2DRef(gpu_frame_arena, screen_target); // Albedo texture - G_ResourceHandle albedo_target = G_PushTexture2D( - gpu_frame_arena, cl, + frame->albedo = G_PushTexture2D( + cl, gpu_frame_arena, G_Format_R16G16B16A16_Float, frame->screen_dims, - G_Layout_Exclusive, + G_TextureLayout_Family, .flags = G_ResourceFlag_AllowRenderTarget, .name = StringF(frame->arena, "Albedo target [%F]", FmtSint(frame->tick)) ); - frame->albedo = G_PushTexture2DRef(gpu_frame_arena, albedo_target); // Backdrop texture - G_ResourceHandle backdrop_target = G_PushTexture2D( - gpu_frame_arena, cl, + frame->backdrop_chain = G_PushTexture2D( + cl, gpu_frame_arena, G_Format_R16G16B16A16_Float, G_DimsFromMip2D(G_Count2D(screen_target), 1), - G_Layout_Exclusive, - .flags = G_ResourceFlag_AllowShaderReadWrite, + G_TextureLayout_Family, + .flags = G_TextureFlag_AllowRW, .name = StringF(frame->arena, "Backdrop target [%F]", FmtSint(frame->tick)), .max_mips = 4 ); - for (i32 mip_idx = 0; mip_idx < G_CountMips(backdrop_target); ++mip_idx) - { - frame->backdrop_mips[mip_idx] = G_PushTexture2DRef(gpu_frame_arena, backdrop_target, .mips = RNGI32(mip_idx, mip_idx)); - } // Bloom texture // TODO: We can re-use backdrop mip chain for this - G_ResourceHandle bloom_target = G_PushTexture2D( - gpu_frame_arena, cl, + frame->bloom_chain = G_PushTexture2D( + cl, gpu_frame_arena, G_Format_R16G16B16A16_Float, G_DimsFromMip2D(G_Count2D(screen_target), 1), - G_Layout_Exclusive, - .flags = G_ResourceFlag_AllowShaderReadWrite, + G_TextureLayout_Family, + .flags = G_TextureFlag_AllowRW, .name = StringF(frame->arena, "Bloom target [%F]", FmtSint(frame->tick)), .max_mips = G_MaxMips ); - for (i32 mip_idx = 0; mip_idx < G_CountMips(bloom_target); ++mip_idx) - { - frame->bloom_mips[mip_idx] = G_PushTexture2DRef(gpu_frame_arena, bloom_target, .mips = RNGI32(mip_idx, mip_idx)); - } // Shade texture - G_ResourceHandle shade_target = G_PushTexture2D( - gpu_frame_arena, cl, + frame->shade = G_PushTexture2D( + cl, gpu_frame_arena, + G_TextureLayout_Family, G_Format_R16G16B16A16_Float, frame->shade_dims, - G_Layout_Exclusive, - .flags = G_ResourceFlag_AllowShaderReadWrite, + .flags = G_TextureFlag_AllowRW, .name = StringF(frame->arena, "Shade target [%F]", FmtSint(frame->tick)) ); Rng3 shade_viewport = RNG3(VEC3(0, 0, 0), VEC3(frame->shade_dims.x, frame->shade_dims.y, 1)); Rng2 shade_scissor = RNG2(VEC2(shade_viewport.p0.x, shade_viewport.p0.y), VEC2(shade_viewport.p1.x, shade_viewport.p1.y)); - frame->shade = G_PushTexture2DRef(gpu_frame_arena, shade_target); // Quad buffers - G_ResourceHandle quads_buff = G_PushBufferFromCpuCopy( - gpu_frame_arena, cl, - StringFromArena(frame->quads_arena), + frame->quads = G_PushBufferFromCpuArena( + cl, gpu_frame_arena, + frame->quads_arena, V_GpuQuad, .name = StringF(frame->arena, "quads [%F]", FmtSint(frame->tick)) ); - frame->quads = G_PushStructuredBufferRef(gpu_frame_arena, quads_buff, V_Quad); // Debug shape buffers - G_ResourceHandle dverts_buff = G_PushBufferFromCpuCopy( - gpu_frame_arena, cl, - StringFromArena(frame->dverts_arena), + frame->dverts = G_PushBufferFromCpuArena( + cl, gpu_frame_arena, + frame->dverts_arena, V_DVert, .name = StringF(frame->arena, "dverts [%F]", FmtSint(frame->tick)) ); - G_ResourceHandle dvert_idxs_buff = G_PushBufferFromCpuCopy( - gpu_frame_arena, cl, - StringFromArena(frame->dvert_idxs_arena), + frame->dvert_idxs = G_PushBufferFromCpu( + cl, gpu_frame_arena, + frame->dvert_idxs_arena, u32, .name = StringF(frame->arena, "dvert idxs [%F]", FmtSint(frame->tick)) ); - frame->dverts = G_PushStructuredBufferRef(gpu_frame_arena, dverts_buff, V_DVert); - G_IndexBufferDesc dvert_idxs_ib = G_IdxBuff32(dvert_idxs_buff); // Particles - G_ResourceHandle gpu_emitters = Zi; + G_BufferRef gpu_emitters = Zi; { // Flatten emitters list V_Emitter *flattened_emitters = PushStructsNoZero(frame->arena, V_Emitter, frame->emitters_count); @@ -5251,8 +5207,8 @@ void V_TickForever(WaveLaneCtx *lane) ++emitter_idx; } } - gpu_emitters = G_PushBufferFromCpuCopy( - gpu_frame_arena, cl, + frame->emitters = G_PushBufferFromCpu( + cl, gpu_frame_arena, StringFromStructs(flattened_emitters, frame->emitters_count), .name = StringF(frame->arena, "emitters [%F]", FmtSint(frame->tick)) ); @@ -5260,12 +5216,11 @@ void V_TickForever(WaveLaneCtx *lane) frame->emitters = G_PushStructuredBufferRef(gpu_frame_arena, gpu_emitters, V_Emitter); // Upload gpu frame - G_ResourceHandle gpu_frame_res = G_PushBufferFromCpuCopy( - gpu_frame_arena, cl, + G_BufferRef gpu_frame = G_PushBufferFromCpu( + cl, gpu_frame_arena, StringFromStruct(&frame->shared_frame), .name = StringF(frame->arena, "Gpu frame [%F]", FmtSint(frame->tick)) ); - G_StructuredBufferRef gpu_frame = G_PushStructuredBufferRef(gpu_frame_arena, gpu_frame_res, V_SharedFrame); // Set initial constants V_GpuFlag gpu_flags = V_GpuFlag_None; @@ -5330,14 +5285,14 @@ void V_TickForever(WaveLaneCtx *lane) G_ZoneDF(cl, "Quads & emitters") { - G_ClearRenderTarget(cl, albedo_target, VEC4(0, 0, 0, 0), 0); + G_ClearRenderTarget(cl, frame->albedo, VEC4(0, 0, 0, 0), 0); // Draw quads G_Draw( cl, V_QuadVS, V_QuadPS, G_CountBuffer(quads_buff, V_Quad), G_QuadIndices(), - 1, &G_Rt(albedo_target, G_BlendMode_CompositeStraightAlpha), + 1, &G_Rt(frame->albedo, G_BlendMode_CompositeStraightAlpha), screen_viewport, screen_scissor, G_DrawMode_TriangleList ); @@ -5435,13 +5390,12 @@ void V_TickForever(WaveLaneCtx *lane) //- Debug shapes pass G_ZoneDF(cl, "Debug shapes") - if (dvert_idxs_ib.count > 0) { G_Draw( cl, V_DVertVS, V_DVertPS, - 1, dvert_idxs_ib, - 1, &G_Rt(screen_target, G_BlendMode_CompositeStraightAlpha), + 1, frame->dvert_idxs, + 1, &G_Rt(frame->screen, G_BlendMode_CompositeStraightAlpha), screen_viewport, screen_scissor, G_DrawMode_TriangleList ); diff --git a/src/pp/pp_vis/pp_vis_shared.cgh b/src/pp/pp_vis/pp_vis_shared.cgh index a77260a5..491ac605 100644 --- a/src/pp/pp_vis/pp_vis_shared.cgh +++ b/src/pp/pp_vis/pp_vis_shared.cgh @@ -343,20 +343,20 @@ Struct(V_SharedFrame) //- Gpu data - G_SamplerStateRef basic_samplers[G_BasicSamplerKind_COUNT]; + G_SamplerRef basic_samplers[G_BasicSamplerKind_COUNT]; V_TileDesc tile_descs[P_TileKind_COUNT]; G_Texture2DRef tiles; f32 backdrop_parallax; G_Texture2DRef backdrop_src; - G_Texture2DRef backdrop_mips[G_MaxMips]; + G_Texture2DRef backdrop_chain; G_Texture2DRef screen; G_Texture2DRef shade; G_Texture2DRef albedo; - G_Texture2DRef bloom_mips[G_MaxMips]; + G_Texture2DRef bloom_chain; u32 emitters_count; G_StructuredBufferRef emitters; diff --git a/src/ui/ui_shared.cgh b/src/ui/ui_shared.cgh index 98a7704a..f79f24fd 100644 --- a/src/ui/ui_shared.cgh +++ b/src/ui/ui_shared.cgh @@ -1,7 +1,7 @@ //////////////////////////////////////////////////////////// //~ Constant types -G_DeclConstant(G_StructuredBufferRef, UI_GpuConst_Params, 0); +G_DeclConstant(G_SamplerRef, UI_GpuConst_Params, 0); G_DeclConstant(b32, UI_GpuConst_DebugDraw, 1); Struct(UI_GpuParams) @@ -13,7 +13,7 @@ Struct(UI_GpuParams) Vec2 cursor_pos; - G_StructuredBufferRef rects; + G_SamplerRef rects; G_SamplerStateRef sampler; };