misc change

This commit is contained in:
2026-02-16 10:38:02 -05:00
parent 87831d0fd6
commit b6e9d95552
6 changed files with 82 additions and 84 deletions

View File

@@ -15,7 +15,7 @@ namespace Juliet
class NonNullPtr class NonNullPtr
{ {
public: public:
NonNullPtr(Type* ptr) inline NonNullPtr(Type* ptr)
: InternalPtr(ptr) : InternalPtr(ptr)
{ {
Assert(ptr, "Tried to initialize a NonNullPtr with a null pointer"); Assert(ptr, "Tried to initialize a NonNullPtr with a null pointer");
@@ -64,7 +64,7 @@ namespace Juliet
return *InternalPtr; return *InternalPtr;
} }
Type* operator->() const inline Type* operator->() const
{ {
Assert(InternalPtr, "NonNullPtr: Internal Pointer is Null"); Assert(InternalPtr, "NonNullPtr: Internal Pointer is Null");
return InternalPtr; return InternalPtr;

View File

@@ -108,22 +108,16 @@ namespace Juliet::D3D12
if (d3d12Driver->GPUUploadHeapSupported) if (d3d12Driver->GPUUploadHeapSupported)
{ {
heapProperties.Type = D3D12_HEAP_TYPE_GPU_UPLOAD; heapProperties.Type = D3D12_HEAP_TYPE_GPU_UPLOAD;
heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
} }
else else
{ {
heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD; heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD;
heapFlags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS;
}
heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
initialState = D3D12_RESOURCE_STATE_GENERIC_READ; initialState = D3D12_RESOURCE_STATE_GENERIC_READ;
heapFlags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS;
}
// heapFlags = D3D12_HEAP_FLAG_NONE; // Avoid overwriting if set above
if (heapProperties.Type == D3D12_HEAP_TYPE_GPU_UPLOAD)
{
heapFlags = D3D12_HEAP_FLAG_NONE; // Or appropriate flags
}
break; break;
} }
} }
@@ -139,11 +133,18 @@ namespace Juliet::D3D12
break; break;
} }
case D3D12BufferType::TransferUpload: case D3D12BufferType::TransferUpload:
{
if (d3d12Driver->GPUUploadHeapSupported)
{
heapProperties.Type = D3D12_HEAP_TYPE_GPU_UPLOAD;
}
else
{ {
heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD; heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD;
heapFlags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS;
}
heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN; heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN; heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
heapFlags = D3D12_HEAP_FLAG_NONE;
initialState = D3D12_RESOURCE_STATE_GENERIC_READ; initialState = D3D12_RESOURCE_STATE_GENERIC_READ;
break; break;
} }
@@ -164,15 +165,17 @@ namespace Juliet::D3D12
desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
desc.Flags = D3D12_RESOURCE_FLAG_NONE; desc.Flags = D3D12_RESOURCE_FLAG_NONE;
Log(LogLevel::Message, LogCategory::Graphics, "CreateBuffer: Device=%p, Size=%zu, Type=%s Use=%s", (void*)d3d12Driver->D3D12Device, size, D3D12BufferTypeToString(type), BufferUsageToString(usage)); Log(LogLevel::Message, LogCategory::Graphics, "CreateBuffer: Device=%p, Size=%zu, Type=%s Use=%s",
(void*)d3d12Driver->D3D12Device, size, D3D12BufferTypeToString(type), BufferUsageToString(usage));
ID3D12Resource* handle = nullptr; ID3D12Resource* handle = nullptr;
HRESULT result = d3d12Driver->D3D12Device->CreateCommittedResource(&heapProperties, heapFlags, HRESULT result = d3d12Driver->D3D12Device->CreateCommittedResource(&heapProperties, heapFlags, &desc,
&desc, initialState, nullptr, initialState, nullptr, IID_ID3D12Resource,
IID_ID3D12Resource, reinterpret_cast<void**>(&handle)); reinterpret_cast<void**>(&handle));
if (FAILED(result)) if (FAILED(result))
{ {
Log(LogLevel::Error, LogCategory::Graphics, "Could not create buffer! HRESULT=0x%08X", (uint32)result); Log(LogLevel::Error, LogCategory::Graphics, "Could not create buffer! HRESULT=0x%08X", (uint32)result);
Log(LogLevel::Error, LogCategory::Graphics, "Failed Desc: Width=%llu Layout=%d HeapType=%d", (unsigned long long)desc.Width, (int)desc.Layout, (int)heapProperties.Type); Log(LogLevel::Error, LogCategory::Graphics, "Failed Desc: Width=%llu Layout=%d HeapType=%d",
(unsigned long long)desc.Width, (int)desc.Layout, (int)heapProperties.Type);
HRESULT removeReason = d3d12Driver->D3D12Device->GetDeviceRemovedReason(); HRESULT removeReason = d3d12Driver->D3D12Device->GetDeviceRemovedReason();
if (FAILED(removeReason)) if (FAILED(removeReason))
@@ -305,8 +308,8 @@ namespace Juliet::D3D12
// We assume Upload buffers are always in state GENERIC_READ or similar suitable for CopySrc. // We assume Upload buffers are always in state GENERIC_READ or similar suitable for CopySrc.
// D3D12 Upload heaps start in GENERIC_READ and cannot transition. // D3D12 Upload heaps start in GENERIC_READ and cannot transition.
d3d12CmdList->GraphicsCommandList.CommandList->CopyBufferRegion(d3d12Dst->Handle, d3d12CmdList->GraphicsCommandList.CommandList->CopyBufferRegion(d3d12Dst->Handle, dstOffset, d3d12Src->Handle,
dstOffset, d3d12Src->Handle, srcOffset, size); srcOffset, size);
} }
void TransitionBufferToReadable(NonNullPtr<CommandList> commandList, NonNullPtr<GraphicsBuffer> buffer) void TransitionBufferToReadable(NonNullPtr<CommandList> commandList, NonNullPtr<GraphicsBuffer> buffer)

View File

@@ -98,7 +98,7 @@ namespace Juliet::D3D12
extern void SetBlendConstants(NonNullPtr<CommandList> commandList, FColor blendConstants); extern void SetBlendConstants(NonNullPtr<CommandList> commandList, FColor blendConstants);
extern void SetStencilReference(NonNullPtr<CommandList> commandList, uint8 reference); extern void SetStencilReference(NonNullPtr<CommandList> commandList, uint8 reference);
extern void SetIndexBuffer(NonNullPtr<CommandList> commandList, NonNullPtr<GraphicsBuffer> buffer, extern void SetIndexBuffer(NonNullPtr<CommandList> commandList, NonNullPtr<GraphicsBuffer> buffer,
IndexFormat format, index_t offset); IndexFormat format, size_t indexCount, index_t offset);
extern void SetPushConstants(NonNullPtr<CommandList> commandList, ShaderStage stage, uint32 rootParameterIndex, extern void SetPushConstants(NonNullPtr<CommandList> commandList, ShaderStage stage, uint32 rootParameterIndex,
uint32 numConstants, const void* constants); uint32 numConstants, const void* constants);

View File

@@ -680,14 +680,12 @@ namespace Juliet::D3D12
Internal::TextureTransitionToDefaultUsage(d3d12CommandList, d3d12Texture, D3D12_RESOURCE_STATE_COPY_DEST); Internal::TextureTransitionToDefaultUsage(d3d12CommandList, d3d12Texture, D3D12_RESOURCE_STATE_COPY_DEST);
} }
// GetDescriptorIndex wrapper needed to adapt signature from GPUDriver* to GraphicsDevice*
uint32 GetDescriptorIndex(NonNullPtr<GraphicsDevice> device, NonNullPtr<GraphicsBuffer> buffer) uint32 GetDescriptorIndex(NonNullPtr<GraphicsDevice> device, NonNullPtr<GraphicsBuffer> buffer)
{ {
auto* driver = static_cast<D3D12Driver*>(device->Driver); auto* driver = static_cast<D3D12Driver*>(device->Driver);
return D3D12::GetDescriptorIndex(driver, buffer); return D3D12::GetDescriptorIndex(driver, buffer);
} }
// GetDescriptorIndexTexture provides custom logic to get SRV handle index
uint32 GetDescriptorIndexTexture(NonNullPtr<GraphicsDevice> /*device*/, NonNullPtr<Texture> texture) uint32 GetDescriptorIndexTexture(NonNullPtr<GraphicsDevice> /*device*/, NonNullPtr<Texture> texture)
{ {
auto* textureContainer = reinterpret_cast<D3D12TextureContainer*>(texture.Get()); auto* textureContainer = reinterpret_cast<D3D12TextureContainer*>(texture.Get());
@@ -1019,42 +1017,39 @@ namespace Juliet::D3D12
device->AcquireSwapChainTexture = AcquireSwapChainTexture; device->AcquireSwapChainTexture = AcquireSwapChainTexture;
device->WaitAndAcquireSwapChainTexture = WaitAndAcquireSwapChainTexture; device->WaitAndAcquireSwapChainTexture = WaitAndAcquireSwapChainTexture;
device->GetSwapChainTextureFormat = GetSwapChainTextureFormat; device->GetSwapChainTextureFormat = GetSwapChainTextureFormat;
device->AcquireCommandList = D3D12::AcquireCommandList; device->AcquireCommandList = AcquireCommandList;
device->SubmitCommandLists = D3D12::SubmitCommandLists; device->SubmitCommandLists = SubmitCommandLists;
device->BeginRenderPass = BeginRenderPass;
device->BeginRenderPass = D3D12::BeginRenderPass; device->EndRenderPass = EndRenderPass;
device->EndRenderPass = D3D12::EndRenderPass; device->SetViewPort = SetViewPort;
device->SetViewPort = D3D12::SetViewPort; device->SetScissorRect = SetScissorRect;
device->SetScissorRect = D3D12::SetScissorRect; device->SetBlendConstants = SetBlendConstants;
device->SetBlendConstants = D3D12::SetBlendConstants; device->SetStencilReference = SetStencilReference;
device->SetStencilReference = D3D12::SetStencilReference; device->BindGraphicsPipeline = BindGraphicsPipeline;
device->BindGraphicsPipeline = D3D12::BindGraphicsPipeline; device->DrawPrimitives = DrawPrimitives;
device->DrawPrimitives = D3D12::DrawPrimitives; device->DrawIndexedPrimitives = DrawIndexedPrimitives;
device->DrawIndexedPrimitives = D3D12::DrawIndexedPrimitives; device->SetIndexBuffer = SetIndexBuffer;
device->SetIndexBuffer = D3D12::SetIndexBuffer; device->WaitUntilGPUIsIdle = WaitUntilGPUIsIdle;
device->WaitUntilGPUIsIdle = D3D12::WaitUntilGPUIsIdle; device->SetPushConstants = SetPushConstants;
device->QueryFence = QueryFence;
device->SetPushConstants = D3D12::SetPushConstants; device->ReleaseFence = ReleaseFence;
device->QueryFence = D3D12::QueryFence; device->CreateShader = CreateShader;
device->ReleaseFence = D3D12::ReleaseFence; device->DestroyShader = DestroyShader;
device->CreateShader = D3D12::CreateShader; device->CreateGraphicsPipeline = CreateGraphicsPipeline;
device->DestroyShader = D3D12::DestroyShader;
device->CreateGraphicsPipeline = D3D12::CreateGraphicsPipeline;
device->DestroyGraphicsPipeline = DestroyGraphicsPipeline; device->DestroyGraphicsPipeline = DestroyGraphicsPipeline;
device->CreateGraphicsBuffer = D3D12::CreateGraphicsBuffer; device->CreateGraphicsBuffer = CreateGraphicsBuffer;
device->DestroyGraphicsBuffer = D3D12::DestroyGraphicsBuffer; device->DestroyGraphicsBuffer = DestroyGraphicsBuffer;
device->CreateGraphicsTransferBuffer = D3D12::CreateGraphicsTransferBuffer; device->CreateGraphicsTransferBuffer = CreateGraphicsTransferBuffer;
device->DestroyGraphicsTransferBuffer = D3D12::DestroyGraphicsTransferBuffer; device->DestroyGraphicsTransferBuffer = DestroyGraphicsTransferBuffer;
device->MapGraphicsTransferBuffer = D3D12::MapBuffer; device->MapGraphicsTransferBuffer = MapBuffer;
device->UnmapGraphicsTransferBuffer = D3D12::UnmapBuffer; device->UnmapGraphicsTransferBuffer = UnmapBuffer;
device->CopyBuffer = CopyBuffer; device->CopyBuffer = CopyBuffer;
device->CopyBufferToTexture = CopyBufferToTexture; device->CopyBufferToTexture = CopyBufferToTexture;
device->TransitionBufferToReadable = D3D12::TransitionBufferToReadable; device->TransitionBufferToReadable = TransitionBufferToReadable;
device->GetDescriptorIndex = GetDescriptorIndex; device->GetDescriptorIndex = GetDescriptorIndex;
device->GetDescriptorIndexTexture = GetDescriptorIndexTexture; device->GetDescriptorIndexTexture = GetDescriptorIndexTexture;
device->CreateTexture = D3D12::CreateTexture; device->CreateTexture = CreateTexture;
device->DestroyTexture = D3D12::DestroyTexture; device->DestroyTexture = DestroyTexture;
#if ALLOW_SHADER_HOT_RELOAD #if ALLOW_SHADER_HOT_RELOAD
device->UpdateGraphicsPipelineShaders = UpdateGraphicsPipelineShaders; device->UpdateGraphicsPipelineShaders = UpdateGraphicsPipelineShaders;

View File

@@ -143,7 +143,7 @@ void JulietApplication::Init()
BufferCreateInfo bufferCI = {}; BufferCreateInfo bufferCI = {};
bufferCI.Size = 1024; bufferCI.Size = 1024;
bufferCI.Usage = BufferUsage::StructuredBuffer; // SRV for ResourceDescriptorHeap access bufferCI.Usage = BufferUsage::StructuredBuffer; // SRV for ResourceDescriptorHeap access
ConstantBuffer = CreateGraphicsBuffer(GraphicsDevice, bufferCI); StructuredBuffer = CreateGraphicsBuffer(GraphicsDevice, bufferCI);
TransferBufferCreateInfo transferCI = {}; TransferBufferCreateInfo transferCI = {};
transferCI.Size = 1024; transferCI.Size = 1024;
@@ -151,7 +151,7 @@ void JulietApplication::Init()
TransferBuffer = CreateGraphicsTransferBuffer(GraphicsDevice, transferCI); TransferBuffer = CreateGraphicsTransferBuffer(GraphicsDevice, transferCI);
// Upload Static Data for Test // Upload Static Data for Test
if (TransferBuffer && ConstantBuffer) if (TransferBuffer && StructuredBuffer)
{ {
void* data = MapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer); void* data = MapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer);
if (data) if (data)
@@ -165,8 +165,8 @@ void JulietApplication::Init()
UnmapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer); UnmapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer);
CommandList* initCmd = AcquireCommandList(GraphicsDevice); CommandList* initCmd = AcquireCommandList(GraphicsDevice);
CopyBuffer(initCmd, ConstantBuffer, TransferBuffer, 256); CopyBuffer(initCmd, StructuredBuffer, TransferBuffer, 256);
TransitionBufferToReadable(initCmd, ConstantBuffer); TransitionBufferToReadable(initCmd, StructuredBuffer);
SubmitCommandLists(initCmd); SubmitCommandLists(initCmd);
} }
} }
@@ -220,9 +220,9 @@ void JulietApplication::Shutdown()
{ {
DestroyGraphicsPipeline(GraphicsDevice, GraphicsPipeline); DestroyGraphicsPipeline(GraphicsDevice, GraphicsPipeline);
} }
if (ConstantBuffer) if (StructuredBuffer)
{ {
DestroyGraphicsBuffer(GraphicsDevice, ConstantBuffer); DestroyGraphicsBuffer(GraphicsDevice, StructuredBuffer);
} }
if (TransferBuffer) if (TransferBuffer)
{ {
@@ -366,7 +366,7 @@ void JulietApplication::OnPreRender(CommandList* cmd)
index_t index = 0; index_t index = 0;
// Buffer uploads // Buffer uploads
if (ConstantBuffer && TransferBuffer) if (StructuredBuffer && TransferBuffer)
{ {
void* ptr = MapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer); void* ptr = MapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer);
if (ptr) if (ptr)
@@ -405,8 +405,8 @@ void JulietApplication::OnPreRender(CommandList* cmd)
UnmapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer); UnmapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer);
} }
CopyBuffer(cmd, ConstantBuffer, TransferBuffer, CubeMesh->IndexByteOffset + (CubeMesh->IndexCount * sizeof(uint16))); CopyBuffer(cmd, StructuredBuffer, TransferBuffer, CubeMesh->IndexByteOffset + (CubeMesh->IndexCount * sizeof(uint16)));
TransitionBufferToReadable(cmd, ConstantBuffer); TransitionBufferToReadable(cmd, StructuredBuffer);
} }
} }
@@ -414,7 +414,7 @@ void JulietApplication::OnRender(RenderPass* pass, CommandList* cmd)
{ {
BindGraphicsPipeline(pass, GraphicsPipeline); BindGraphicsPipeline(pass, GraphicsPipeline);
uint32 descriptorIndex = GetDescriptorIndex(GraphicsDevice, ConstantBuffer); uint32 descriptorIndex = GetDescriptorIndex(GraphicsDevice, StructuredBuffer);
struct PushData struct PushData
{ {
@@ -426,7 +426,7 @@ void JulietApplication::OnRender(RenderPass* pass, CommandList* cmd)
SetPushConstants(cmd, ShaderStage::Vertex, 0, sizeof(pushData) / 4, &pushData); SetPushConstants(cmd, ShaderStage::Vertex, 0, sizeof(pushData) / 4, &pushData);
SetIndexBuffer(cmd, ConstantBuffer, IndexFormat::UInt16, CubeMesh->IndexCount, CubeMesh->IndexByteOffset); SetIndexBuffer(cmd, StructuredBuffer, IndexFormat::UInt16, CubeMesh->IndexCount, CubeMesh->IndexByteOffset);
// DrawIndexedPrimitives(pass, static_cast<uint32>(CubeMesh->IndexCount), 1, 0, 0, 0); // DrawIndexedPrimitives(pass, static_cast<uint32>(CubeMesh->IndexCount), 1, 0, 0, 0);
DrawIndexedPrimitives(pass, static_cast<uint32>(CubeMesh->IndexCount), 1, DrawIndexedPrimitives(pass, static_cast<uint32>(CubeMesh->IndexCount), 1,

View File

@@ -42,7 +42,7 @@ class JulietApplication : public Juliet::IApplication
Juliet::GraphicsDevice* GraphicsDevice = {}; Juliet::GraphicsDevice* GraphicsDevice = {};
Juliet::HotReloadCode GameCode = {}; Juliet::HotReloadCode GameCode = {};
Juliet::GraphicsPipeline* GraphicsPipeline = {}; Juliet::GraphicsPipeline* GraphicsPipeline = {};
Juliet::GraphicsBuffer* ConstantBuffer = {}; Juliet::GraphicsBuffer* StructuredBuffer = {};
Juliet::GraphicsTransferBuffer* TransferBuffer = {}; Juliet::GraphicsTransferBuffer* TransferBuffer = {};
Juliet::Texture* DepthBuffer = {}; Juliet::Texture* DepthBuffer = {};