misc change
This commit is contained in:
@@ -15,7 +15,7 @@ namespace Juliet
|
||||
class NonNullPtr
|
||||
{
|
||||
public:
|
||||
NonNullPtr(Type* ptr)
|
||||
inline NonNullPtr(Type* ptr)
|
||||
: InternalPtr(ptr)
|
||||
{
|
||||
Assert(ptr, "Tried to initialize a NonNullPtr with a null pointer");
|
||||
@@ -64,7 +64,7 @@ namespace Juliet
|
||||
return *InternalPtr;
|
||||
}
|
||||
|
||||
Type* operator->() const
|
||||
inline Type* operator->() const
|
||||
{
|
||||
Assert(InternalPtr, "NonNullPtr: Internal Pointer is Null");
|
||||
return InternalPtr;
|
||||
|
||||
@@ -23,9 +23,9 @@ namespace Juliet::D3D12
|
||||
{
|
||||
switch (type)
|
||||
{
|
||||
case D3D12BufferType::Base: return "Base";
|
||||
case D3D12BufferType::TransferDownload: return "TransferDownload";
|
||||
case D3D12BufferType::TransferUpload: return "TransferUpload";
|
||||
case D3D12BufferType::Base: return "Base";
|
||||
case D3D12BufferType::TransferDownload: return "TransferDownload";
|
||||
case D3D12BufferType::TransferUpload: return "TransferUpload";
|
||||
}
|
||||
return "Unknown";
|
||||
}
|
||||
@@ -34,11 +34,11 @@ namespace Juliet::D3D12
|
||||
{
|
||||
switch (usage)
|
||||
{
|
||||
case BufferUsage::None: return "None";
|
||||
case BufferUsage::ConstantBuffer: return "ConstantBuffer";
|
||||
case BufferUsage::StructuredBuffer: return "StructuredBuffer";
|
||||
case BufferUsage::IndexBuffer: return "IndexBuffer";
|
||||
case BufferUsage::VertexBuffer: return "VertexBuffer";
|
||||
case BufferUsage::None: return "None";
|
||||
case BufferUsage::ConstantBuffer: return "ConstantBuffer";
|
||||
case BufferUsage::StructuredBuffer: return "StructuredBuffer";
|
||||
case BufferUsage::IndexBuffer: return "IndexBuffer";
|
||||
case BufferUsage::VertexBuffer: return "VertexBuffer";
|
||||
}
|
||||
return "Unknown";
|
||||
}
|
||||
@@ -107,23 +107,17 @@ namespace Juliet::D3D12
|
||||
{
|
||||
if (d3d12Driver->GPUUploadHeapSupported)
|
||||
{
|
||||
heapProperties.Type = D3D12_HEAP_TYPE_GPU_UPLOAD;
|
||||
heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
|
||||
heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
|
||||
heapProperties.Type = D3D12_HEAP_TYPE_GPU_UPLOAD;
|
||||
}
|
||||
else
|
||||
{
|
||||
heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD;
|
||||
heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
|
||||
heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
|
||||
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
|
||||
heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD;
|
||||
heapFlags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS;
|
||||
}
|
||||
heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
|
||||
heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
|
||||
initialState = D3D12_RESOURCE_STATE_GENERIC_READ;
|
||||
|
||||
break;
|
||||
}
|
||||
}
|
||||
@@ -140,10 +134,17 @@ namespace Juliet::D3D12
|
||||
}
|
||||
case D3D12BufferType::TransferUpload:
|
||||
{
|
||||
heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD;
|
||||
if (d3d12Driver->GPUUploadHeapSupported)
|
||||
{
|
||||
heapProperties.Type = D3D12_HEAP_TYPE_GPU_UPLOAD;
|
||||
}
|
||||
else
|
||||
{
|
||||
heapProperties.Type = D3D12_HEAP_TYPE_UPLOAD;
|
||||
heapFlags = D3D12_HEAP_FLAG_ALLOW_ONLY_BUFFERS;
|
||||
}
|
||||
heapProperties.CPUPageProperty = D3D12_CPU_PAGE_PROPERTY_UNKNOWN;
|
||||
heapProperties.MemoryPoolPreference = D3D12_MEMORY_POOL_UNKNOWN;
|
||||
heapFlags = D3D12_HEAP_FLAG_NONE;
|
||||
initialState = D3D12_RESOURCE_STATE_GENERIC_READ;
|
||||
break;
|
||||
}
|
||||
@@ -164,15 +165,17 @@ namespace Juliet::D3D12
|
||||
desc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR;
|
||||
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;
|
||||
HRESULT result = d3d12Driver->D3D12Device->CreateCommittedResource(&heapProperties, heapFlags,
|
||||
&desc, initialState, nullptr,
|
||||
IID_ID3D12Resource, reinterpret_cast<void**>(&handle));
|
||||
HRESULT result = d3d12Driver->D3D12Device->CreateCommittedResource(&heapProperties, heapFlags, &desc,
|
||||
initialState, nullptr, IID_ID3D12Resource,
|
||||
reinterpret_cast<void**>(&handle));
|
||||
if (FAILED(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();
|
||||
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.
|
||||
// D3D12 Upload heaps start in GENERIC_READ and cannot transition.
|
||||
|
||||
d3d12CmdList->GraphicsCommandList.CommandList->CopyBufferRegion(d3d12Dst->Handle,
|
||||
dstOffset, d3d12Src->Handle, srcOffset, size);
|
||||
d3d12CmdList->GraphicsCommandList.CommandList->CopyBufferRegion(d3d12Dst->Handle, dstOffset, d3d12Src->Handle,
|
||||
srcOffset, size);
|
||||
}
|
||||
|
||||
void TransitionBufferToReadable(NonNullPtr<CommandList> commandList, NonNullPtr<GraphicsBuffer> buffer)
|
||||
|
||||
@@ -98,7 +98,7 @@ namespace Juliet::D3D12
|
||||
extern void SetBlendConstants(NonNullPtr<CommandList> commandList, FColor blendConstants);
|
||||
extern void SetStencilReference(NonNullPtr<CommandList> commandList, uint8 reference);
|
||||
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,
|
||||
uint32 numConstants, const void* constants);
|
||||
|
||||
|
||||
@@ -680,14 +680,12 @@ namespace Juliet::D3D12
|
||||
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)
|
||||
{
|
||||
auto* driver = static_cast<D3D12Driver*>(device->Driver);
|
||||
return D3D12::GetDescriptorIndex(driver, buffer);
|
||||
}
|
||||
|
||||
// GetDescriptorIndexTexture provides custom logic to get SRV handle index
|
||||
uint32 GetDescriptorIndexTexture(NonNullPtr<GraphicsDevice> /*device*/, NonNullPtr<Texture> texture)
|
||||
{
|
||||
auto* textureContainer = reinterpret_cast<D3D12TextureContainer*>(texture.Get());
|
||||
@@ -1019,42 +1017,39 @@ namespace Juliet::D3D12
|
||||
device->AcquireSwapChainTexture = AcquireSwapChainTexture;
|
||||
device->WaitAndAcquireSwapChainTexture = WaitAndAcquireSwapChainTexture;
|
||||
device->GetSwapChainTextureFormat = GetSwapChainTextureFormat;
|
||||
device->AcquireCommandList = D3D12::AcquireCommandList;
|
||||
device->SubmitCommandLists = D3D12::SubmitCommandLists;
|
||||
|
||||
device->BeginRenderPass = D3D12::BeginRenderPass;
|
||||
device->EndRenderPass = D3D12::EndRenderPass;
|
||||
device->SetViewPort = D3D12::SetViewPort;
|
||||
device->SetScissorRect = D3D12::SetScissorRect;
|
||||
device->SetBlendConstants = D3D12::SetBlendConstants;
|
||||
device->SetStencilReference = D3D12::SetStencilReference;
|
||||
device->BindGraphicsPipeline = D3D12::BindGraphicsPipeline;
|
||||
device->DrawPrimitives = D3D12::DrawPrimitives;
|
||||
device->DrawIndexedPrimitives = D3D12::DrawIndexedPrimitives;
|
||||
device->SetIndexBuffer = D3D12::SetIndexBuffer;
|
||||
device->WaitUntilGPUIsIdle = D3D12::WaitUntilGPUIsIdle;
|
||||
|
||||
device->SetPushConstants = D3D12::SetPushConstants;
|
||||
device->QueryFence = D3D12::QueryFence;
|
||||
device->ReleaseFence = D3D12::ReleaseFence;
|
||||
device->CreateShader = D3D12::CreateShader;
|
||||
device->DestroyShader = D3D12::DestroyShader;
|
||||
device->CreateGraphicsPipeline = D3D12::CreateGraphicsPipeline;
|
||||
device->DestroyGraphicsPipeline = DestroyGraphicsPipeline;
|
||||
device->CreateGraphicsBuffer = D3D12::CreateGraphicsBuffer;
|
||||
device->DestroyGraphicsBuffer = D3D12::DestroyGraphicsBuffer;
|
||||
device->CreateGraphicsTransferBuffer = D3D12::CreateGraphicsTransferBuffer;
|
||||
device->DestroyGraphicsTransferBuffer = D3D12::DestroyGraphicsTransferBuffer;
|
||||
device->MapGraphicsTransferBuffer = D3D12::MapBuffer;
|
||||
device->UnmapGraphicsTransferBuffer = D3D12::UnmapBuffer;
|
||||
device->CopyBuffer = CopyBuffer;
|
||||
device->CopyBufferToTexture = CopyBufferToTexture;
|
||||
device->TransitionBufferToReadable = D3D12::TransitionBufferToReadable;
|
||||
|
||||
device->GetDescriptorIndex = GetDescriptorIndex;
|
||||
device->GetDescriptorIndexTexture = GetDescriptorIndexTexture;
|
||||
device->CreateTexture = D3D12::CreateTexture;
|
||||
device->DestroyTexture = D3D12::DestroyTexture;
|
||||
device->AcquireCommandList = AcquireCommandList;
|
||||
device->SubmitCommandLists = SubmitCommandLists;
|
||||
device->BeginRenderPass = BeginRenderPass;
|
||||
device->EndRenderPass = EndRenderPass;
|
||||
device->SetViewPort = SetViewPort;
|
||||
device->SetScissorRect = SetScissorRect;
|
||||
device->SetBlendConstants = SetBlendConstants;
|
||||
device->SetStencilReference = SetStencilReference;
|
||||
device->BindGraphicsPipeline = BindGraphicsPipeline;
|
||||
device->DrawPrimitives = DrawPrimitives;
|
||||
device->DrawIndexedPrimitives = DrawIndexedPrimitives;
|
||||
device->SetIndexBuffer = SetIndexBuffer;
|
||||
device->WaitUntilGPUIsIdle = WaitUntilGPUIsIdle;
|
||||
device->SetPushConstants = SetPushConstants;
|
||||
device->QueryFence = QueryFence;
|
||||
device->ReleaseFence = ReleaseFence;
|
||||
device->CreateShader = CreateShader;
|
||||
device->DestroyShader = DestroyShader;
|
||||
device->CreateGraphicsPipeline = CreateGraphicsPipeline;
|
||||
device->DestroyGraphicsPipeline = DestroyGraphicsPipeline;
|
||||
device->CreateGraphicsBuffer = CreateGraphicsBuffer;
|
||||
device->DestroyGraphicsBuffer = DestroyGraphicsBuffer;
|
||||
device->CreateGraphicsTransferBuffer = CreateGraphicsTransferBuffer;
|
||||
device->DestroyGraphicsTransferBuffer = DestroyGraphicsTransferBuffer;
|
||||
device->MapGraphicsTransferBuffer = MapBuffer;
|
||||
device->UnmapGraphicsTransferBuffer = UnmapBuffer;
|
||||
device->CopyBuffer = CopyBuffer;
|
||||
device->CopyBufferToTexture = CopyBufferToTexture;
|
||||
device->TransitionBufferToReadable = TransitionBufferToReadable;
|
||||
device->GetDescriptorIndex = GetDescriptorIndex;
|
||||
device->GetDescriptorIndexTexture = GetDescriptorIndexTexture;
|
||||
device->CreateTexture = CreateTexture;
|
||||
device->DestroyTexture = DestroyTexture;
|
||||
|
||||
#if ALLOW_SHADER_HOT_RELOAD
|
||||
device->UpdateGraphicsPipelineShaders = UpdateGraphicsPipelineShaders;
|
||||
|
||||
@@ -143,7 +143,7 @@ void JulietApplication::Init()
|
||||
BufferCreateInfo bufferCI = {};
|
||||
bufferCI.Size = 1024;
|
||||
bufferCI.Usage = BufferUsage::StructuredBuffer; // SRV for ResourceDescriptorHeap access
|
||||
ConstantBuffer = CreateGraphicsBuffer(GraphicsDevice, bufferCI);
|
||||
StructuredBuffer = CreateGraphicsBuffer(GraphicsDevice, bufferCI);
|
||||
|
||||
TransferBufferCreateInfo transferCI = {};
|
||||
transferCI.Size = 1024;
|
||||
@@ -151,7 +151,7 @@ void JulietApplication::Init()
|
||||
TransferBuffer = CreateGraphicsTransferBuffer(GraphicsDevice, transferCI);
|
||||
|
||||
// Upload Static Data for Test
|
||||
if (TransferBuffer && ConstantBuffer)
|
||||
if (TransferBuffer && StructuredBuffer)
|
||||
{
|
||||
void* data = MapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer);
|
||||
if (data)
|
||||
@@ -165,8 +165,8 @@ void JulietApplication::Init()
|
||||
UnmapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer);
|
||||
|
||||
CommandList* initCmd = AcquireCommandList(GraphicsDevice);
|
||||
CopyBuffer(initCmd, ConstantBuffer, TransferBuffer, 256);
|
||||
TransitionBufferToReadable(initCmd, ConstantBuffer);
|
||||
CopyBuffer(initCmd, StructuredBuffer, TransferBuffer, 256);
|
||||
TransitionBufferToReadable(initCmd, StructuredBuffer);
|
||||
SubmitCommandLists(initCmd);
|
||||
}
|
||||
}
|
||||
@@ -220,9 +220,9 @@ void JulietApplication::Shutdown()
|
||||
{
|
||||
DestroyGraphicsPipeline(GraphicsDevice, GraphicsPipeline);
|
||||
}
|
||||
if (ConstantBuffer)
|
||||
if (StructuredBuffer)
|
||||
{
|
||||
DestroyGraphicsBuffer(GraphicsDevice, ConstantBuffer);
|
||||
DestroyGraphicsBuffer(GraphicsDevice, StructuredBuffer);
|
||||
}
|
||||
if (TransferBuffer)
|
||||
{
|
||||
@@ -366,7 +366,7 @@ void JulietApplication::OnPreRender(CommandList* cmd)
|
||||
index_t index = 0;
|
||||
|
||||
// Buffer uploads
|
||||
if (ConstantBuffer && TransferBuffer)
|
||||
if (StructuredBuffer && TransferBuffer)
|
||||
{
|
||||
void* ptr = MapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer);
|
||||
if (ptr)
|
||||
@@ -405,8 +405,8 @@ void JulietApplication::OnPreRender(CommandList* cmd)
|
||||
UnmapGraphicsTransferBuffer(GraphicsDevice, TransferBuffer);
|
||||
}
|
||||
|
||||
CopyBuffer(cmd, ConstantBuffer, TransferBuffer, CubeMesh->IndexByteOffset + (CubeMesh->IndexCount * sizeof(uint16)));
|
||||
TransitionBufferToReadable(cmd, ConstantBuffer);
|
||||
CopyBuffer(cmd, StructuredBuffer, TransferBuffer, CubeMesh->IndexByteOffset + (CubeMesh->IndexCount * sizeof(uint16)));
|
||||
TransitionBufferToReadable(cmd, StructuredBuffer);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -414,7 +414,7 @@ void JulietApplication::OnRender(RenderPass* pass, CommandList* cmd)
|
||||
{
|
||||
BindGraphicsPipeline(pass, GraphicsPipeline);
|
||||
|
||||
uint32 descriptorIndex = GetDescriptorIndex(GraphicsDevice, ConstantBuffer);
|
||||
uint32 descriptorIndex = GetDescriptorIndex(GraphicsDevice, StructuredBuffer);
|
||||
|
||||
struct PushData
|
||||
{
|
||||
@@ -426,7 +426,7 @@ void JulietApplication::OnRender(RenderPass* pass, CommandList* cmd)
|
||||
|
||||
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,
|
||||
|
||||
@@ -42,7 +42,7 @@ class JulietApplication : public Juliet::IApplication
|
||||
Juliet::GraphicsDevice* GraphicsDevice = {};
|
||||
Juliet::HotReloadCode GameCode = {};
|
||||
Juliet::GraphicsPipeline* GraphicsPipeline = {};
|
||||
Juliet::GraphicsBuffer* ConstantBuffer = {};
|
||||
Juliet::GraphicsBuffer* StructuredBuffer = {};
|
||||
Juliet::GraphicsTransferBuffer* TransferBuffer = {};
|
||||
Juliet::Texture* DepthBuffer = {};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user