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
{
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))
{
@@ -14,7 +15,9 @@ namespace Juliet::D3D12
}
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)
{
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.
// TODO:MemoryArena Will use memory arena later that will do the same thing
shader->ByteCode.Data = reinterpret_cast<Byte*>(shader + 1);
shader->ByteCode.Size = shaderByteCode.Size;
MemCopy(shader->ByteCode.Data, shaderByteCode.Data, shaderByteCode.Size);
@@ -38,9 +40,9 @@ namespace Juliet::D3D12
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());
Free(d3d12shader);
// For now we never destroy the shader, it stays in the arena.
// 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
+3 -2
View File
@@ -16,6 +16,7 @@ namespace Juliet::D3D12
uint32 NumStorageTextures;
};
extern Shader* CreateShader(NonNullPtr<GPUDriver> driver, ByteBuffer shaderByteCode, ShaderCreateInfo& shaderCreateInfo);
extern void DestroyShader(NonNullPtr<GPUDriver> driver, NonNullPtr<Shader> shader);
extern Shader* CreateShader(NonNullPtr<GPUDriver> driver, ByteBuffer shaderByteCode,
ShaderCreateInfo& shaderCreateInfo JULIET_DEBUG_PARAM(String filename));
extern void DestroyShader(NonNullPtr<GPUDriver> driver, NonNullPtr<Shader> shader);
} // namespace Juliet::D3D12
+1 -1
View File
@@ -338,7 +338,7 @@ namespace Juliet
return nullptr;
}
Shader* shader = device->CreateShader(device->Driver, shaderByteCode, shaderCreateInfo);
Shader* shader = device->CreateShader(device->Driver, shaderByteCode, shaderCreateInfo JULIET_DEBUG_PARAM(filename));
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));
// 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);
// Pipeline
@@ -100,7 +101,8 @@ namespace Juliet
void (*DestroyTexture)(NonNullPtr<GPUDriver> driver, NonNullPtr<Texture> texture);
// 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* (*MapGraphicsBuffer)(NonNullPtr<GPUDriver> driver, NonNullPtr<GraphicsBuffer> buffer);