Move shaders to arena.

For now it will use the driver Arena.
They should use an "asset" arena eventually
This commit is contained in:
2026-08-03 20:00:36 -04:00
parent e325668650
commit aabe585696
4 changed files with 16 additions and 11 deletions
+8 -6
View File
@@ -5,7 +5,8 @@
namespace Juliet::D3D12 namespace Juliet::D3D12
{ {
Shader* CreateShader(NonNullPtr<GPUDriver> /*driver*/, ByteBuffer shaderByteCode, ShaderCreateInfo& /*shaderCreateInfo*/) Shader* CreateShader(NonNullPtr<GPUDriver> driver, ByteBuffer shaderByteCode,
ShaderCreateInfo& /*shaderCreateInfo*/ JULIET_DEBUG_PARAM(String filename))
{ {
if (!IsValid(shaderByteCode)) if (!IsValid(shaderByteCode))
{ {
@@ -14,7 +15,9 @@ namespace Juliet::D3D12
} }
size_t allocSize = sizeof(D3D12Shader) + shaderByteCode.Size; size_t allocSize = sizeof(D3D12Shader) + shaderByteCode.Size;
auto shader = static_cast<D3D12Shader*>(Calloc(1, allocSize)); auto* shader = static_cast<D3D12Shader*>(
ArenaPushSize(driver->DriverArena, allocSize, AlignOf(D3D12Shader),
true JULIET_DEBUG_PARAM("D3D12Shader [{}] | Size [{}]", CStr(filename), shaderByteCode.Size)));
if (!shader) if (!shader)
{ {
LogError(LogCategory::Graphics, "Cannot allocate a new D3D12Shader: Out of memory"); LogError(LogCategory::Graphics, "Cannot allocate a new D3D12Shader: Out of memory");
@@ -22,7 +25,6 @@ namespace Juliet::D3D12
} }
// Uses the bytes after the struct to store the shader byte code. // Uses the bytes after the struct to store the shader byte code.
// TODO:MemoryArena Will use memory arena later that will do the same thing
shader->ByteCode.Data = reinterpret_cast<Byte*>(shader + 1); shader->ByteCode.Data = reinterpret_cast<Byte*>(shader + 1);
shader->ByteCode.Size = shaderByteCode.Size; shader->ByteCode.Size = shaderByteCode.Size;
MemCopy(shader->ByteCode.Data, shaderByteCode.Data, shaderByteCode.Size); MemCopy(shader->ByteCode.Data, shaderByteCode.Data, shaderByteCode.Size);
@@ -38,9 +40,9 @@ namespace Juliet::D3D12
return reinterpret_cast<Shader*>(shader); return reinterpret_cast<Shader*>(shader);
} }
void DestroyShader(NonNullPtr<GPUDriver> /*driver*/, NonNullPtr<Shader> shader) void DestroyShader(NonNullPtr<GPUDriver> /*driver*/, NonNullPtr<Shader> /*shader*/)
{ {
auto d3d12shader = reinterpret_cast<D3D12Shader*>(shader.Get()); // For now we never destroy the shader, it stays in the arena.
Free(d3d12shader); // If we create too many and need to switch dynamically we will need a way to release the slot for other asset
} }
} // namespace Juliet::D3D12 } // namespace Juliet::D3D12
+3 -2
View File
@@ -16,6 +16,7 @@ namespace Juliet::D3D12
uint32 NumStorageTextures; uint32 NumStorageTextures;
}; };
extern Shader* CreateShader(NonNullPtr<GPUDriver> driver, ByteBuffer shaderByteCode, ShaderCreateInfo& shaderCreateInfo); extern Shader* CreateShader(NonNullPtr<GPUDriver> driver, ByteBuffer shaderByteCode,
extern void DestroyShader(NonNullPtr<GPUDriver> driver, NonNullPtr<Shader> shader); ShaderCreateInfo& shaderCreateInfo JULIET_DEBUG_PARAM(String filename));
extern void DestroyShader(NonNullPtr<GPUDriver> driver, NonNullPtr<Shader> shader);
} // namespace Juliet::D3D12 } // namespace Juliet::D3D12
+1 -1
View File
@@ -338,7 +338,7 @@ namespace Juliet
return nullptr; return nullptr;
} }
Shader* shader = device->CreateShader(device->Driver, shaderByteCode, shaderCreateInfo); Shader* shader = device->CreateShader(device->Driver, shaderByteCode, shaderCreateInfo JULIET_DEBUG_PARAM(filename));
Free(shaderByteCode); Free(shaderByteCode);
+4 -2
View File
@@ -86,7 +86,8 @@ namespace Juliet
void (*ReleaseFence)(NonNullPtr<GPUDriver> driver, NonNullPtr<Fence> fence JULIET_DEBUG_PARAM(String querier)); void (*ReleaseFence)(NonNullPtr<GPUDriver> driver, NonNullPtr<Fence> fence JULIET_DEBUG_PARAM(String querier));
// Shaders // Shaders
Shader* (*CreateShader)(NonNullPtr<GPUDriver> driver, ByteBuffer shaderByteCode, ShaderCreateInfo& shaderCreateInfo); Shader* (*CreateShader)(NonNullPtr<GPUDriver> driver, ByteBuffer shaderByteCode,
ShaderCreateInfo& shaderCreateInfo JULIET_DEBUG_PARAM(String filename));
void (*DestroyShader)(NonNullPtr<GPUDriver> driver, NonNullPtr<Shader> shader); void (*DestroyShader)(NonNullPtr<GPUDriver> driver, NonNullPtr<Shader> shader);
// Pipeline // Pipeline
@@ -100,7 +101,8 @@ namespace Juliet
void (*DestroyTexture)(NonNullPtr<GPUDriver> driver, NonNullPtr<Texture> texture); void (*DestroyTexture)(NonNullPtr<GPUDriver> driver, NonNullPtr<Texture> texture);
// Buffers // Buffers
GraphicsBuffer* (*CreateGraphicsBuffer)(NonNullPtr<GPUDriver> driver, size_t size, size_t stride, BufferUsage usage, bool isDynamic); GraphicsBuffer* (*CreateGraphicsBuffer)(NonNullPtr<GPUDriver> driver, size_t size, size_t stride,
BufferUsage usage, bool isDynamic);
void (*DestroyGraphicsBuffer)(NonNullPtr<GraphicsBuffer> buffer); void (*DestroyGraphicsBuffer)(NonNullPtr<GraphicsBuffer> buffer);
void* (*MapGraphicsBuffer)(NonNullPtr<GPUDriver> driver, NonNullPtr<GraphicsBuffer> buffer); void* (*MapGraphicsBuffer)(NonNullPtr<GPUDriver> driver, NonNullPtr<GraphicsBuffer> buffer);