Skip to content

Commit 7bbefff

Browse files
committed
Meshrenderer rootsignature reset
1 parent 9dc5514 commit 7bbefff

33 files changed

+609
-1042
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,3 @@
11
.vs/
22
Build/
3+
/Asset/Sponza2/*.dds

Client/Client.vcxproj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
4444
<ConfigurationType>Application</ConfigurationType>
4545
<UseDebugLibraries>true</UseDebugLibraries>
46-
<PlatformToolset>v142</PlatformToolset>
46+
<PlatformToolset>v143</PlatformToolset>
4747
<CharacterSet>Unicode</CharacterSet>
4848
</PropertyGroup>
4949
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
@@ -149,10 +149,11 @@
149149
<SDLCheck>true</SDLCheck>
150150
<PreprocessorDefinitions>NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>
151151
<ConformanceMode>true</ConformanceMode>
152-
<AdditionalIncludeDirectories>../Renderer;../Tracy;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
152+
<AdditionalIncludeDirectories>../Renderer;../Tracy;../ModelView;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
153153
<LanguageStandard>stdcpp17</LanguageStandard>
154154
<MultiProcessorCompilation>true</MultiProcessorCompilation>
155155
<ScanSourceForModuleDependencies>false</ScanSourceForModuleDependencies>
156+
<DisableSpecificWarnings>4996</DisableSpecificWarnings>
156157
</ClCompile>
157158
<Link>
158159
<SubSystem>Windows</SubSystem>

Client/Main.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,6 @@ namespace GameApp
2121
virtual void Update(float deltaTime);
2222

2323
virtual void Cleanup();
24-
25-
//virtual void Render();
2624
};
2725

2826

@@ -34,8 +32,10 @@ namespace GameApp
3432
ModelConverter::BuildAllMeshes(sAsset);
3533
ModelConverter::BuildScene(sScenePtr, sAsset);
3634

37-
TextureRef radianceIBL = GET_TEX(ModelConverter::GetIBLTexture(L"CloudCommons_S"));
38-
TextureRef irradianceIBL = GET_TEX(ModelConverter::GetIBLTexture(L"CloudCommons_D"));
35+
sScenePtr->Startup();
36+
37+
TextureRef radianceIBL = GET_TEX(ModelConverter::GetIBLTexture(L"CloudCommon_S"));
38+
TextureRef irradianceIBL = GET_TEX(ModelConverter::GetIBLTexture(L"CloudCommon_D"));
3939
sScenePtr->SetIBLTextures(irradianceIBL, radianceIBL);
4040
}
4141

@@ -51,6 +51,8 @@ namespace GameApp
5151

5252
void SceneGameApp::Update(float deltaTime)
5353
{
54+
MaterialManager::GetInstance()->Update();
55+
5456
sScenePtr->Update(deltaTime);
5557
}
5658

@@ -61,11 +63,6 @@ namespace GameApp
6163
MaterialManager::RemoveInstance();
6264
MeshManager::RemoveInstance();
6365
}
64-
65-
//void SceneGameApp::Render()
66-
//{
67-
// sScenePtr->Render();
68-
//}
6966
}
7067

7168
CREATE_APPLICATION(GameApp::SceneGameApp);

ModelView/Material.cpp

Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#include "Material.h"
2+
#include "DescriptorHandle.h"
3+
4+
void MaterialManager::Reserve(size_t size)
5+
{
6+
if (size <= mAllMaterials.size())
7+
return;
8+
9+
mDirtyMaterialIndices.clear();
10+
for (size_t i = 0; i < mAllMaterials.size(); i++)
11+
{
12+
mAllMaterials[i]->mNumDirtyCount = SWAP_CHAIN_BUFFER_COUNT;
13+
mDirtyMaterialIndices.push_back(i);
14+
}
15+
mNumDirtyCount = SWAP_CHAIN_BUFFER_COUNT;
16+
17+
mAllMaterials.reserve(size);
18+
}
19+
20+
void MaterialManager::Update()
21+
{
22+
if (mNumDirtyCount > 0 && mConstantBufferSize > 0)
23+
{
24+
mGpuBuffer[CURRENT_SCENE_COLOR_BUFFER_INDEX].Create(L"Material Buffer", mConstantBufferSize * 256 * 2);
25+
mNumDirtyCount--;
26+
}
27+
28+
for (auto beg = mDirtyMaterialIndices.begin(); beg != mDirtyMaterialIndices.end();)
29+
{
30+
if (UpdateMaterial(*beg) == 0)
31+
beg = mDirtyMaterialIndices.erase(beg);
32+
else
33+
beg++;
34+
}
35+
}
36+
37+
uint16_t MaterialManager::UpdateMaterial(size_t index)
38+
{
39+
Material* material = mAllMaterials[index].get();
40+
ASSERT(material->mNumDirtyCount > 0);
41+
42+
void* mappedBuffer = mGpuBuffer[CURRENT_SCENE_COLOR_BUFFER_INDEX].Map();
43+
mappedBuffer = (uint8_t*)mappedBuffer + 256 * material->mBufferOffset;
44+
CopyMemory(mappedBuffer, material->GetMaterialConstant(), Math::AlignUp(material->GetMaterialConstantSize(), 256));
45+
return --material->mNumDirtyCount;
46+
}
47+
48+
void PBRMaterial::CreateHandles()
49+
{
50+
mTextureHandles = ALLOC_DESCRIPTOR(D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, kNumTextures);
51+
mSamplerHandles = ALLOC_DESCRIPTOR(D3D12_DESCRIPTOR_HEAP_TYPE_SAMPLER, kNumTextures);
52+
}
53+
54+
void PBRMaterial::DestroyHandles()
55+
{
56+
DEALLOC_DESCRIPTOR(mTextureHandles, kNumTextures);
57+
DEALLOC_DESCRIPTOR(mSamplerHandles, kNumTextures);
58+
}

ModelView/Material.h

Lines changed: 17 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,9 @@ class Material
4444

4545
virtual size_t GetMaterialConstantSize() const = 0;
4646

47+
virtual DescriptorHandle GetTextureHandles() const { return DescriptorHandle(); }
48+
virtual DescriptorHandle GetSamplerHandles() const { return DescriptorHandle(); }
49+
4750
uint16_t GetMaterialIdx() const { return mMaterialIdx; }
4851

4952
//uint16_t GetPSOIdx() const { return mPSOIndex; }
@@ -74,15 +77,22 @@ class PBRMaterial : public Material
7477
kNumTextures
7578
};
7679
public:
77-
PBRMaterial() : Material(kPBRMaterial) {}
78-
~PBRMaterial() {}
80+
PBRMaterial() : Material(kPBRMaterial) { CreateHandles(); }
81+
~PBRMaterial() { DestroyHandles(); }
82+
83+
virtual DescriptorHandle GetTextureHandles() const override { return mTextureHandles; }
84+
virtual DescriptorHandle GetSamplerHandles() const override { return mSamplerHandles; }
7985

8086
virtual const void* GetMaterialConstant() const override { return reinterpret_cast<const void*>(&mMaterialConstant); }
8187
virtual size_t GetMaterialConstantSize() const override { return sizeof(mMaterialConstant); }
88+
private:
89+
void CreateHandles();
90+
void DestroyHandles();
8291
public:
8392
PBRMaterialConstants mMaterialConstant;
8493
TextureRef mTextures[kNumTextures];
85-
DescriptorHandle mSamplers[kNumTextures];
94+
DescriptorHandle mSamplerHandles;
95+
DescriptorHandle mTextureHandles;
8696
};
8797

8898

@@ -91,26 +101,11 @@ class MaterialManager : public Singleton<MaterialManager>
91101
USE_SINGLETON;
92102
private:
93103
MaterialManager() : mConstantBufferSize(0), mNumDirtyCount(0)
94-
{
95-
}
104+
{}
96105
public:
97106
~MaterialManager() {}
98107

99-
void Reserve(size_t size)
100-
{
101-
if (size <= mAllMaterials.size())
102-
return;
103-
104-
mDirtyMaterialIndices.clear();
105-
for (size_t i = 0; i < mAllMaterials.size(); i++)
106-
{
107-
mAllMaterials[i]->mNumDirtyCount = SWAP_CHAIN_BUFFER_COUNT;
108-
mDirtyMaterialIndices.push_back(i);
109-
}
110-
mNumDirtyCount = SWAP_CHAIN_BUFFER_COUNT;
111-
112-
mAllMaterials.reserve(size);
113-
}
108+
void Reserve(size_t size);
114109

115110
Material* GetMaterial(size_t index) { return mAllMaterials[index].get(); }
116111

@@ -139,39 +134,15 @@ class MaterialManager : public Singleton<MaterialManager>
139134
mDirtyMaterialIndices.push_back(index);
140135
}
141136

142-
void Update()
143-
{
144-
if (mNumDirtyCount > 0 && mConstantBufferSize > 0)
145-
{
146-
mGpuBuffer[CURRENT_SCENE_COLOR_BUFFER_INDEX].Create(L"Material Buffer", mConstantBufferSize * 256 * 2);
147-
mNumDirtyCount--;
148-
}
149-
150-
for (auto beg = mDirtyMaterialIndices.begin(); beg != mDirtyMaterialIndices.end();)
151-
{
152-
if (UpdateMaterial(*beg) == 0)
153-
beg = mDirtyMaterialIndices.erase(beg);
154-
else
155-
beg++;
156-
}
157-
}
137+
void Update();
158138

159139
D3D12_GPU_VIRTUAL_ADDRESS GetGpuBufferView(size_t index) const
160140
{
161141
Material* material = mAllMaterials[index].get();
162142
return mGpuBuffer[CURRENT_SCENE_COLOR_BUFFER_INDEX].GetGpuVirtualAddress() + 256 * material->mBufferOffset;
163143
}
164144
private:
165-
uint16_t UpdateMaterial(size_t index)
166-
{
167-
Material* material = mAllMaterials[index].get();
168-
ASSERT(material->mNumDirtyCount > 0);
169-
170-
void* mappedBuffer = mGpuBuffer[CURRENT_SCENE_COLOR_BUFFER_INDEX].Map();
171-
mappedBuffer = (uint8_t*)mappedBuffer + 256 * material->mBufferOffset;
172-
CopyMemory(mappedBuffer, material->GetMaterialConstant(), Math::AlignUp(material->GetMaterialConstantSize(), 256));
173-
return --material->mNumDirtyCount;
174-
}
145+
uint16_t UpdateMaterial(size_t index);
175146
private:
176147
std::vector<std::unique_ptr<Material>> mAllMaterials; // store by index
177148
UploadBuffer mGpuBuffer[SWAP_CHAIN_BUFFER_COUNT]; // store frame resource index

ModelView/Mesh.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "Mesh.h"
22
#include "CommandList.h"
33
#include "CommandQueue.h"
4+
#include "FrameContext.h"
45

56
enum eGpuBufferUpdateFlags
67
{

ModelView/MeshRenderer.cpp

Lines changed: 11 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -7,31 +7,6 @@
77
#include "Scene.h"
88
#include "Model.h"
99

10-
void SetMaterialSRV(GraphicsCommandList& context, const Material& mat)
11-
{
12-
if (mat.GetType() == kPBRMaterial)
13-
{
14-
const PBRMaterial& pbrMaterial = reinterpret_cast<const PBRMaterial&>(mat);
15-
#define SetSRV(srvIndex, tex) context.SetDescriptorTable(srvIndex, tex.GetSRV())
16-
#define SetSampler(samIndex, sam) context.SetDescriptorTable(samIndex, sam)
17-
SetSRV(ModelRenderer::kBaseColorTextureSRV, pbrMaterial.mTextures[PBRMaterial::kBaseColor]);
18-
SetSRV(ModelRenderer::kMetallicRoughnessTextureSRV, pbrMaterial.mTextures[PBRMaterial::kMetallicRoughness]);
19-
SetSRV(ModelRenderer::kOcclusionTextureSRV, pbrMaterial.mTextures[PBRMaterial::kOcclusion]);
20-
SetSRV(ModelRenderer::kEmissiveTextureSRV, pbrMaterial.mTextures[PBRMaterial::kEmissive]);
21-
SetSRV(ModelRenderer::kNormalTextureSRV, pbrMaterial.mTextures[PBRMaterial::kNormal]);
22-
23-
SetSampler(ModelRenderer::kBaseColorTextureSampler, pbrMaterial.mSamplers[PBRMaterial::kBaseColor]);
24-
SetSampler(ModelRenderer::kMetallicTextureSampler, pbrMaterial.mSamplers[PBRMaterial::kMetallicRoughness]);
25-
SetSampler(ModelRenderer::kOcclusionTextureSampler, pbrMaterial.mSamplers[PBRMaterial::kOcclusion]);
26-
SetSampler(ModelRenderer::kEmissiveTextureSampler, pbrMaterial.mSamplers[PBRMaterial::kEmissive]);
27-
SetSampler(ModelRenderer::kNormalTextureSampler, pbrMaterial.mSamplers[PBRMaterial::kNormal]);
28-
#undef SetSRV
29-
#undef SetSampler
30-
return;
31-
}
32-
ASSERT(false);
33-
}
34-
3510
namespace ModelRenderer
3611
{
3712
std::map<size_t, uint32_t> sPSOIndices;
@@ -63,29 +38,12 @@ namespace ModelRenderer
6338
sForwardRootSig->GetParam(kMaterialConstants).InitAsConstantBuffer(0, D3D12_SHADER_VISIBILITY_PIXEL);
6439
sForwardRootSig->GetParam(kGlobalConstants).InitAsConstantBuffer(1, D3D12_SHADER_VISIBILITY_ALL);
6540

66-
#define InitTexture(SRV, Register) sForwardRootSig->GetParam(SRV).InitAsDescriptorRange( \
67-
D3D12_DESCRIPTOR_RANGE_TYPE_SRV, Register, 1, D3D12_SHADER_VISIBILITY_PIXEL)
68-
#define InitSampler(SAMPLER, Register) sForwardRootSig->GetParam(SAMPLER).InitAsDescriptorRange( \
69-
D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER, Register, 1, D3D12_SHADER_VISIBILITY_PIXEL)
70-
71-
InitTexture(kBaseColorTextureSRV, 0);
72-
InitTexture(kMetallicRoughnessTextureSRV, 1);
73-
InitTexture(kOcclusionTextureSRV, 2);
74-
InitTexture(kEmissiveTextureSRV, 3);
75-
InitTexture(kNormalTextureSRV, 4);
76-
77-
InitSampler(kBaseColorTextureSampler, 0);
78-
InitSampler(kMetallicTextureSampler, 1);
79-
InitSampler(kOcclusionTextureSampler, 2);
80-
InitSampler(kEmissiveTextureSampler, 3);
81-
InitSampler(kNormalTextureSampler, 4);
82-
83-
InitTexture(kRadianceIBLTexture, 10);
84-
InitTexture(kIrradianceIBLTexture, 11);
85-
InitTexture(kPreComputeGGXBRDFTexture, 12);
86-
InitTexture(kTexSunShadowTexture, 13);
87-
#undef InitTexture
88-
#undef InitSampler
41+
sForwardRootSig->GetParam(kModelTextures).InitAsDescriptorRange(
42+
D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 0, 5, D3D12_SHADER_VISIBILITY_PIXEL);
43+
sForwardRootSig->GetParam(kModelTextureSamplers).InitAsDescriptorRange(
44+
D3D12_DESCRIPTOR_RANGE_TYPE_SAMPLER, 0, 5, D3D12_SHADER_VISIBILITY_PIXEL);
45+
sForwardRootSig->GetParam(kSceneTextures).InitAsDescriptorRange(
46+
D3D12_DESCRIPTOR_RANGE_TYPE_SRV, 10, 5, D3D12_SHADER_VISIBILITY_PIXEL);
8947
sForwardRootSig->Finalize(D3D12_ROOT_SIGNATURE_FLAG_ALLOW_INPUT_ASSEMBLER_INPUT_LAYOUT);
9048

9149
ADD_SHADER("SkyBoxVS", L"MeshRender/SkyBoxVS.hlsl", kVS);
@@ -152,7 +110,7 @@ namespace ModelRenderer
152110
shadowCutOffPSO->SetRenderTargetFormats(0, nullptr, sShadowBuffer[0].GetFormat());
153111
shadowCutOffPSO->Finalize();
154112

155-
DXGI_FORMAT renderFormat = SWAP_CHAIN_FORMAT;
113+
DXGI_FORMAT renderFormat = HDR_FORMAT;
156114
sDefaultPSO.SetRootSignature(*sForwardRootSig);
157115
sDefaultPSO.SetRasterizerState(Graphics::RasterizerDefault);
158116
sDefaultPSO.SetBlendState(Graphics::BlendDisable);
@@ -318,6 +276,8 @@ void MeshRenderer::RenderMeshes(GraphicsCommandList& context, GlobalConstants& g
318276
globals.CameraPos = mCamera->GetPosition();
319277
globals.IBLRange = mScene->GetIBLRange() - mScene->GetIBLBias();
320278
globals.IBLBias = mScene->GetIBLBias();
279+
280+
context.SetRootSignature(*ModelRenderer::sForwardRootSig);
321281
context.SetDynamicConstantBufferView(ModelRenderer::kGlobalConstants, sizeof(GlobalConstants), &globals);
322282

323283
if (mBatchType == kShadows)
@@ -383,8 +343,8 @@ void MeshRenderer::RenderMeshes(GraphicsCommandList& context, GlobalConstants& g
383343
const Material& material = *GET_MATERIAL(subMesh.materialIdx);
384344

385345
context.SetConstantBuffer(ModelRenderer::kMaterialConstants, GET_MAT_VPTR(subMesh.materialIdx));
386-
387-
SetMaterialSRV(context, material);
346+
context.SetDescriptorTable(ModelRenderer::kModelTextures, material.GetTextureHandles());
347+
context.SetDescriptorTable(ModelRenderer::kModelTextureSamplers, material.GetSamplerHandles());
388348

389349
if (mCurrentPass == kZPass)
390350
context.SetVertexBuffer(0, { GET_MESH_DepthVB + mesh.vbDepthOffset, mesh.sizeDepthVB, subMesh.depthVertexStride });

ModelView/MeshRenderer.h

Lines changed: 8 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -27,22 +27,14 @@ namespace ModelRenderer
2727
kMaterialConstants,
2828
kGlobalConstants,
2929

30-
kBaseColorTextureSRV,
31-
kMetallicRoughnessTextureSRV,
32-
kOcclusionTextureSRV,
33-
kEmissiveTextureSRV,
34-
kNormalTextureSRV,
35-
36-
kBaseColorTextureSampler,
37-
kMetallicTextureSampler,
38-
kOcclusionTextureSampler,
39-
kEmissiveTextureSampler,
40-
kNormalTextureSampler,
41-
42-
kRadianceIBLTexture,
43-
kIrradianceIBLTexture,
44-
kPreComputeGGXBRDFTexture,
45-
kTexSunShadowTexture,
30+
kModelTextures,
31+
kModelTextureSamplers,
32+
33+
kSceneTextures,
34+
//kRadianceIBLTexture,
35+
//kIrradianceIBLTexture,
36+
//kPreComputeGGXBRDFTexture,
37+
//kTexSunShadowTexture,
4638

4739
kNumRootBindings
4840
};

ModelView/Model.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ void Model::Render(MeshRenderer& sorter, const Math::AffineTransform& transform,
1717
sphereWS.GetRadius() * transform.GetUniformScale());
1818
Math::BoundingSphere sphereVS = Math::BoundingSphere(viewMat * sphereWS.GetCenter(), sphereWS.GetRadius());
1919

20-
if (frustum.IntersectSphere(sphereVS))
20+
//if (frustum.IntersectSphere(sphereVS))
2121
{
2222
float distance = -sphereVS.GetCenter().GetZ() - sphereVS.GetRadius();
2323
sorter.AddMesh(mesh, this, distance, meshCBV);

0 commit comments

Comments
 (0)