Move shaders to arena.
For now it will use the driver Arena. They should use an "asset" arena eventually
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
Reference in New Issue
Block a user