Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions .github/copilot-instructions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
- Do not add explanatory comments to generated code unless prompted to do so.
- When asked to generate code in a `.cpp` file, make sure to make necessary changes to the corresponding `.h` file as applicable.
6 changes: 6 additions & 0 deletions Core/GraphicsMemoryManager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -286,4 +286,10 @@ namespace Gradient

return gmm->GetSRVOrUAVGpuHandle(m_index);
}

uint32_t GraphicsMemoryManager::DescriptorIndexContainer::GetIndex()
{
assert(m_index <= UINT32_MAX);
return static_cast<uint32_t>(m_index);
}
}
7 changes: 2 additions & 5 deletions Core/GraphicsMemoryManager.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,10 +13,6 @@ namespace Gradient
class GraphicsMemoryManager
{
public:
// TODO: Make these things free themselves.
// The descriptor heap runs out of space whenever the
// window is resized because the old descriptors are
// never reclaimed.
using DescriptorIndex = DirectX::DescriptorPile::IndexType;

enum class DescriptorIndexType
Expand All @@ -32,7 +28,8 @@ namespace Gradient
DescriptorIndexContainer(const DescriptorIndexContainer&&) = delete;

D3D12_CPU_DESCRIPTOR_HANDLE GetCPUHandle();
D3D12_GPU_DESCRIPTOR_HANDLE GetGPUHandle();
D3D12_GPU_DESCRIPTOR_HANDLE GetGPUHandle();
uint32_t GetIndex();

~DescriptorIndexContainer();

Expand Down
56 changes: 22 additions & 34 deletions Core/Pipelines/BillboardPipeline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -23,17 +23,11 @@ namespace Gradient::Pipelines
m_rootSignature.AddCBV(1, 0);
m_rootSignature.AddCBV(0, 1);
m_rootSignature.AddCBV(1, 1);

m_rootSignature.AddRootSRV(0, 0); // instance data
m_rootSignature.AddSRV(0, 1);
m_rootSignature.AddCBV(2, 1); // Material
m_rootSignature.AddRootSRV(0, 0); // instance data
m_rootSignature.AddSRV(1, 1);
m_rootSignature.AddSRV(2, 1);
m_rootSignature.AddSRV(3, 1);
m_rootSignature.AddSRV(4, 1);
m_rootSignature.AddSRV(5, 1);
m_rootSignature.AddSRV(6, 1);
m_rootSignature.AddSRV(7, 1);
m_rootSignature.AddSRV(8, 1);

m_rootSignature.AddStaticSampler(
CD3DX12_STATIC_SAMPLER_DESC(0, D3D12_FILTER_ANISOTROPIC),
Expand Down Expand Up @@ -145,7 +139,8 @@ namespace Gradient::Pipelines

m_rootSignature.SetCBV(cl, 0, 0, vertexConstants);
m_rootSignature.SetStructuredBufferSRV(cl, 0, 0, InstanceHandle);
m_rootSignature.SetSRV(cl, 0, 1, Material.Texture);

SetMaterialCB(cl);

DrawParamsCB drawConstants;
drawConstants.cameraPosition = CameraPosition;
Expand All @@ -154,14 +149,7 @@ namespace Gradient::Pipelines
drawConstants.cardHeight = CardDimensions.y;
drawConstants.numInstances = InstanceCount;
drawConstants.totalTimeSeconds = TotalTimeSeconds;
if (UsingOrthographic)
{
drawConstants.useCameraDirectionForCulling = 1;
}
else
{
drawConstants.useCameraDirectionForCulling = 0;
}
drawConstants.useCameraDirectionForCulling = UsingOrthographic ? 1u : 0u;
for (int i = 0; i < 6; i++)
{
drawConstants.cullingFrustumPlanes[i] = CullingFrustumPlanes[i];
Expand All @@ -182,14 +170,13 @@ namespace Gradient::Pipelines
}
else if (passType == DrawType::PixelDepthReadOnly)
{
m_maskedPixelDepthReadPSO->Set(cl, multisampled);
m_maskedPixelDepthReadPSO->Set(cl, multisampled);
}
else if (passType == DrawType::PixelDepthReadWrite)
{
m_maskedPixelDepthReadWritePSO->Set(cl, multisampled);
m_maskedPixelDepthReadWritePSO->Set(cl, multisampled);
}


m_rootSignature.SetOnCommandList(cl);

MatrixCB vertexConstants;
Expand All @@ -206,14 +193,7 @@ namespace Gradient::Pipelines
drawConstants.cardHeight = CardDimensions.y;
drawConstants.numInstances = InstanceCount;
drawConstants.totalTimeSeconds = TotalTimeSeconds;
if (UsingOrthographic)
{
drawConstants.useCameraDirectionForCulling = 1;
}
else
{
drawConstants.useCameraDirectionForCulling = 0;
}
drawConstants.useCameraDirectionForCulling = UsingOrthographic ? 1u : 0u;
for (int i = 0; i < 6; i++)
{
drawConstants.cullingFrustumPlanes[i] = CullingFrustumPlanes[i];
Expand Down Expand Up @@ -251,18 +231,15 @@ namespace Gradient::Pipelines
pixelConstants.tiling = Material.Tiling;
pixelConstants.shadowTransform = DirectX::XMMatrixTranspose(SunlightParams.ShadowTransform);
pixelConstants.emissiveRadiance = Material.EmissiveRadiance;
pixelConstants.SSAOMapIndex = GTAOTexture ? GTAOTexture->GetIndex() : 0u;

m_rootSignature.SetCBV(cl, 1, 1, pixelConstants);

m_rootSignature.SetSRV(cl, 0, 1, Material.Texture);
SetMaterialCB(cl);

m_rootSignature.SetSRV(cl, 1, 1, SunlightParams.ShadowMap);
m_rootSignature.SetSRV(cl, 2, 1, Material.NormalMap);
m_rootSignature.SetSRV(cl, 3, 1, Material.AOMap);
m_rootSignature.SetSRV(cl, 4, 1, Material.MetalnessMap);
m_rootSignature.SetSRV(cl, 5, 1, Material.RoughnessMap);
m_rootSignature.SetSRV(cl, 6, 1, EnvironmentMap);
m_rootSignature.SetSRV(cl, 7, 1, ShadowCubeArray);
m_rootSignature.SetSRV(cl, 8, 1, GTAOTexture);

cl->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
}
Expand All @@ -276,4 +253,15 @@ namespace Gradient::Pipelines
SunlightParams.LightIrradiance = dlight->GetIrradiance();
SunlightParams.LightDirection = dlight->GetDirection();
}

void BillboardPipeline::SetMaterialCB(ID3D12GraphicsCommandList* cl)
{
BillboardPipeline::MaterialCB materialConstants{};
materialConstants.AlbedoMapIndex = Material.Texture ? Material.Texture->GetIndex() : 0u;
materialConstants.NormalMapIndex = Material.NormalMap ? Material.NormalMap->GetIndex() : 0u;
materialConstants.MetallicMapIndex = Material.MetalnessMap ? Material.MetalnessMap->GetIndex() : 0u;
materialConstants.RoughnessMapIndex = Material.RoughnessMap ? Material.RoughnessMap->GetIndex() : 0u;
materialConstants.AOMapIndex = Material.AOMap ? Material.AOMap->GetIndex() : 0u;
m_rootSignature.SetCBV(cl, 2, 1, materialConstants);
}
}
14 changes: 13 additions & 1 deletion Core/Pipelines/BillboardPipeline.h
Original file line number Diff line number Diff line change
Expand Up @@ -48,7 +48,7 @@ namespace Gradient::Pipelines
DirectX::XMFLOAT3 cameraPosition;
float tiling;
DirectX::XMFLOAT3 emissiveRadiance;
float pad2;
uint32_t SSAOMapIndex;
DirectX::XMMATRIX shadowTransform;
};

Expand All @@ -59,6 +59,16 @@ namespace Gradient::Pipelines
uint32_t numPointLights;
};

struct __declspec(align(16)) MaterialCB
{
uint32_t AlbedoMapIndex;
uint32_t NormalMapIndex;
uint32_t MetallicMapIndex;
uint32_t RoughnessMapIndex;
uint32_t AOMapIndex;
DirectX::XMFLOAT3 _padding[3];
};

using VertexType = DirectX::VertexPositionNormalTexture;

explicit BillboardPipeline(ID3D12Device2* device);
Expand Down Expand Up @@ -115,6 +125,8 @@ namespace Gradient::Pipelines
void InitializeDepthWritePSO(ID3D12Device2* device);
void ApplyDepthOnlyPipeline(ID3D12GraphicsCommandList* cl, bool multisampled, DrawType passType);

void SetMaterialCB(ID3D12GraphicsCommandList* cl);

RootSignature m_rootSignature;

// All billboards are assumed to be masked
Expand Down
39 changes: 21 additions & 18 deletions Core/Pipelines/InstancedPBRPipeline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,17 +22,11 @@ namespace Gradient::Pipelines
m_rootSignature.AddCBV(0, 0);
m_rootSignature.AddCBV(0, 1);
m_rootSignature.AddCBV(1, 1);

m_rootSignature.AddRootSRV(0, 0); // instance data
m_rootSignature.AddSRV(0, 1);
m_rootSignature.AddSRV(1, 1);
m_rootSignature.AddSRV(2, 1);
m_rootSignature.AddSRV(3, 1);
m_rootSignature.AddSRV(4, 1);
m_rootSignature.AddSRV(5, 1);
m_rootSignature.AddSRV(6, 1);
m_rootSignature.AddSRV(7, 1);
m_rootSignature.AddSRV(8, 1);
m_rootSignature.AddCBV(2, 1); // Material
m_rootSignature.AddRootSRV(0, 0); // instance data (root SRV)
m_rootSignature.AddSRV(1, 1); // shadow map
m_rootSignature.AddSRV(6, 1); // environment map
m_rootSignature.AddSRV(7, 1); // point shadow maps

m_rootSignature.AddStaticSampler(
CD3DX12_STATIC_SAMPLER_DESC(0, D3D12_FILTER_ANISOTROPIC),
Expand Down Expand Up @@ -179,7 +173,8 @@ namespace Gradient::Pipelines

m_rootSignature.SetCBV(cl, 0, 0, vertexConstants);
m_rootSignature.SetStructuredBufferSRV(cl, 0, 0, m_instanceHandle);
m_rootSignature.SetSRV(cl, 0, 1, m_material.Texture);

SetMaterialCB(cl);

cl->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
}
Expand Down Expand Up @@ -253,22 +248,30 @@ namespace Gradient::Pipelines
pixelConstants.tiling = m_material.Tiling;
pixelConstants.shadowTransform = DirectX::XMMatrixTranspose(m_shadowTransform);
pixelConstants.emissiveRadiance = m_material.EmissiveRadiance;
pixelConstants.SSAOMapIndex = GTAOTexture->GetIndex();

m_rootSignature.SetCBV(cl, 1, 1, pixelConstants);

m_rootSignature.SetSRV(cl, 0, 1, m_material.Texture);
SetMaterialCB(cl);

m_rootSignature.SetSRV(cl, 1, 1, m_shadowMap);
m_rootSignature.SetSRV(cl, 2, 1, m_material.NormalMap);
m_rootSignature.SetSRV(cl, 3, 1, m_material.AOMap);
m_rootSignature.SetSRV(cl, 4, 1, m_material.MetalnessMap);
m_rootSignature.SetSRV(cl, 5, 1, m_material.RoughnessMap);
m_rootSignature.SetSRV(cl, 6, 1, m_environmentMap);
m_rootSignature.SetSRV(cl, 7, 1, m_shadowCubeArray);
m_rootSignature.SetSRV(cl, 8, 1, GTAOTexture);

cl->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
}

void InstancedPBRPipeline::SetMaterialCB(ID3D12GraphicsCommandList* cl)
{
MaterialCB materialConstants{};
materialConstants.AlbedoMapIndex = m_material.Texture ? m_material.Texture->GetIndex() : 0u;
materialConstants.NormalMapIndex = m_material.NormalMap ? m_material.NormalMap->GetIndex() : 0u;
materialConstants.MetallicMapIndex = m_material.MetalnessMap ? m_material.MetalnessMap->GetIndex() : 0u;
materialConstants.RoughnessMapIndex = m_material.RoughnessMap ? m_material.RoughnessMap->GetIndex() : 0u;
materialConstants.AOMapIndex = m_material.AOMap ? m_material.AOMap->GetIndex() : 0u;
m_rootSignature.SetCBV(cl, 2, 1, materialConstants);
}

void InstancedPBRPipeline::SetMaterial(const Rendering::PBRMaterial& material)
{
m_material = material;
Expand Down
14 changes: 13 additions & 1 deletion Core/Pipelines/InstancedPBRPipeline.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,7 @@ namespace Gradient::Pipelines
DirectX::XMFLOAT3 cameraPosition;
float tiling;
DirectX::XMFLOAT3 emissiveRadiance;
float pad2;
float SSAOMapIndex;
DirectX::XMMATRIX shadowTransform;
};

Expand All @@ -43,6 +43,16 @@ namespace Gradient::Pipelines
uint32_t numPointLights;
};

struct __declspec(align(16)) MaterialCB
{
uint32_t AlbedoMapIndex;
uint32_t NormalMapIndex;
uint32_t MetallicMapIndex;
uint32_t RoughnessMapIndex;
uint32_t AOMapIndex;
DirectX::XMFLOAT3 _padding[3];
};

using VertexType = DirectX::VertexPositionNormalTexture;

explicit InstancedPBRPipeline(ID3D12Device2* device);
Expand Down Expand Up @@ -76,6 +86,8 @@ namespace Gradient::Pipelines
void InitializeDepthWritePSO(ID3D12Device2* device);
void ApplyDepthOnlyPipeline(ID3D12GraphicsCommandList* cl, bool multisampled, DrawType passType);

void SetMaterialCB(ID3D12GraphicsCommandList* cl);

RootSignature m_rootSignature;
std::unique_ptr<PipelineState> m_unmaskedShadowPipelineState;
std::unique_ptr<PipelineState> m_unmaskedDepthWriteOnlyPSO;
Expand Down
30 changes: 17 additions & 13 deletions Core/Pipelines/PBRPipeline.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,10 @@ namespace Gradient::Pipelines
m_rootSignature.AddCBV(0, 0);
m_rootSignature.AddCBV(0, 1);
m_rootSignature.AddCBV(1, 1);

m_rootSignature.AddSRV(0, 1);
m_rootSignature.AddCBV(2, 1); // Material
m_rootSignature.AddSRV(1, 1);
m_rootSignature.AddSRV(2, 1);
m_rootSignature.AddSRV(3, 1);
m_rootSignature.AddSRV(4, 1);
m_rootSignature.AddSRV(5, 1);
m_rootSignature.AddSRV(6, 1);
m_rootSignature.AddSRV(7, 1);
m_rootSignature.AddSRV(8, 1);

m_rootSignature.AddStaticSampler(
CD3DX12_STATIC_SAMPLER_DESC(0, D3D12_FILTER_ANISOTROPIC),
Expand Down Expand Up @@ -179,6 +173,8 @@ namespace Gradient::Pipelines

m_rootSignature.SetCBV(cl, 0, 0, vertexConstants);

SetMaterialCB(cl);

cl->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
}

Expand Down Expand Up @@ -250,18 +246,15 @@ namespace Gradient::Pipelines
pixelConstants.tiling = m_material.Tiling;
pixelConstants.shadowTransform = DirectX::XMMatrixTranspose(m_shadowTransform);
pixelConstants.emissiveRadiance = m_material.EmissiveRadiance;
pixelConstants.SSAOMapIndex = GTAOTexture->GetIndex();

m_rootSignature.SetCBV(cl, 1, 1, pixelConstants);

m_rootSignature.SetSRV(cl, 0, 1, m_material.Texture);
SetMaterialCB(cl);

m_rootSignature.SetSRV(cl, 1, 1, m_shadowMap);
m_rootSignature.SetSRV(cl, 2, 1, m_material.NormalMap);
m_rootSignature.SetSRV(cl, 3, 1, m_material.AOMap);
m_rootSignature.SetSRV(cl, 4, 1, m_material.MetalnessMap);
m_rootSignature.SetSRV(cl, 5, 1, m_material.RoughnessMap);
m_rootSignature.SetSRV(cl, 6, 1, m_environmentMap);
m_rootSignature.SetSRV(cl, 7, 1, m_shadowCubeArray);
m_rootSignature.SetSRV(cl, 8, 1, GTAOTexture);

cl->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
}
Expand Down Expand Up @@ -322,4 +315,15 @@ namespace Gradient::Pipelines
{
m_cameraPosition = cameraPosition;
}

void PBRPipeline::SetMaterialCB(ID3D12GraphicsCommandList* cl)
{
MaterialCB materialConstants{};
materialConstants.AlbedoMapIndex = m_material.Texture ? m_material.Texture->GetIndex() : 0u;
materialConstants.NormalMapIndex = m_material.NormalMap ? m_material.NormalMap->GetIndex() : 0u;
materialConstants.MetallicMapIndex = m_material.MetalnessMap ? m_material.MetalnessMap->GetIndex() : 0u;
materialConstants.RoughnessMapIndex = m_material.RoughnessMap ? m_material.RoughnessMap->GetIndex() : 0u;
materialConstants.AOMapIndex = m_material.AOMap ? m_material.AOMap->GetIndex() : 0u;
m_rootSignature.SetCBV(cl, 2, 1, materialConstants);
}
}
14 changes: 13 additions & 1 deletion Core/Pipelines/PBRPipeline.h
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ namespace Gradient::Pipelines
DirectX::XMFLOAT3 cameraPosition;
float tiling;
DirectX::XMFLOAT3 emissiveRadiance;
float pad2;
uint32_t SSAOMapIndex;
DirectX::XMMATRIX shadowTransform;
};

Expand All @@ -42,6 +42,16 @@ namespace Gradient::Pipelines
uint32_t numPointLights;
};

struct __declspec(align(16)) MaterialCB
{
uint32_t AlbedoMapIndex;
uint32_t NormalMapIndex;
uint32_t MetallicMapIndex;
uint32_t RoughnessMapIndex;
uint32_t AOMapIndex;
DirectX::XMFLOAT3 _padding[3];
};

using VertexType = DirectX::VertexPositionNormalTexture;

explicit PBRPipeline(ID3D12Device2* device);
Expand Down Expand Up @@ -75,6 +85,8 @@ namespace Gradient::Pipelines
bool multisampled,
DrawType passType);

void SetMaterialCB(ID3D12GraphicsCommandList* cl);

RootSignature m_rootSignature;
std::unique_ptr<PipelineState> m_unmaskedPipelineState;
std::unique_ptr<PipelineState> m_unmaskedShadowPipelineState;
Expand Down
Loading