diff --git a/Juliet/src/Graphics/D3D12/D3D12Shader.cpp b/Juliet/src/Graphics/D3D12/D3D12Shader.cpp index eeedb5d..d071e49 100644 --- a/Juliet/src/Graphics/D3D12/D3D12Shader.cpp +++ b/Juliet/src/Graphics/D3D12/D3D12Shader.cpp @@ -5,7 +5,8 @@ namespace Juliet::D3D12 { - Shader* CreateShader(NonNullPtr /*driver*/, ByteBuffer shaderByteCode, ShaderCreateInfo& /*shaderCreateInfo*/) + Shader* CreateShader(NonNullPtr 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(Calloc(1, allocSize)); + auto* shader = static_cast( + 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(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); } - void DestroyShader(NonNullPtr /*driver*/, NonNullPtr shader) + void DestroyShader(NonNullPtr /*driver*/, NonNullPtr /*shader*/) { - auto d3d12shader = reinterpret_cast(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 diff --git a/Juliet/src/Graphics/D3D12/D3D12Shader.h b/Juliet/src/Graphics/D3D12/D3D12Shader.h index 839cf84..63c097f 100644 --- a/Juliet/src/Graphics/D3D12/D3D12Shader.h +++ b/Juliet/src/Graphics/D3D12/D3D12Shader.h @@ -16,6 +16,7 @@ namespace Juliet::D3D12 uint32 NumStorageTextures; }; - extern Shader* CreateShader(NonNullPtr driver, ByteBuffer shaderByteCode, ShaderCreateInfo& shaderCreateInfo); - extern void DestroyShader(NonNullPtr driver, NonNullPtr shader); + extern Shader* CreateShader(NonNullPtr driver, ByteBuffer shaderByteCode, + ShaderCreateInfo& shaderCreateInfo JULIET_DEBUG_PARAM(String filename)); + extern void DestroyShader(NonNullPtr driver, NonNullPtr shader); } // namespace Juliet::D3D12 diff --git a/Juliet/src/Graphics/Graphics.cpp b/Juliet/src/Graphics/Graphics.cpp index 457ab2d..04c7c8b 100644 --- a/Juliet/src/Graphics/Graphics.cpp +++ b/Juliet/src/Graphics/Graphics.cpp @@ -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); diff --git a/Juliet/src/Graphics/GraphicsDevice.h b/Juliet/src/Graphics/GraphicsDevice.h index fce65c2..c031821 100644 --- a/Juliet/src/Graphics/GraphicsDevice.h +++ b/Juliet/src/Graphics/GraphicsDevice.h @@ -86,7 +86,8 @@ namespace Juliet void (*ReleaseFence)(NonNullPtr driver, NonNullPtr fence JULIET_DEBUG_PARAM(String querier)); // Shaders - Shader* (*CreateShader)(NonNullPtr driver, ByteBuffer shaderByteCode, ShaderCreateInfo& shaderCreateInfo); + Shader* (*CreateShader)(NonNullPtr driver, ByteBuffer shaderByteCode, + ShaderCreateInfo& shaderCreateInfo JULIET_DEBUG_PARAM(String filename)); void (*DestroyShader)(NonNullPtr driver, NonNullPtr shader); // Pipeline @@ -100,7 +101,8 @@ namespace Juliet void (*DestroyTexture)(NonNullPtr driver, NonNullPtr texture); // Buffers - GraphicsBuffer* (*CreateGraphicsBuffer)(NonNullPtr driver, size_t size, size_t stride, BufferUsage usage, bool isDynamic); + GraphicsBuffer* (*CreateGraphicsBuffer)(NonNullPtr driver, size_t size, size_t stride, + BufferUsage usage, bool isDynamic); void (*DestroyGraphicsBuffer)(NonNullPtr buffer); void* (*MapGraphicsBuffer)(NonNullPtr driver, NonNullPtr buffer);