Skip to content

Commit c11bc23

Browse files
committed
Patched some output errors with Resource states
1 parent 961b62e commit c11bc23

File tree

5 files changed

+32
-4
lines changed

5 files changed

+32
-4
lines changed

src/private/Core/GameObject/Component/Mesh.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -168,7 +168,8 @@ void Mesh::InitPipeline() {
168168
plDesc.BlendState = CD3DX12_BLEND_DESC(D3D12_DEFAULT);
169169
plDesc.DSVFormat = DXGI_FORMAT_D24_UNORM_S8_UINT;
170170
plDesc.RasterizerState = CD3DX12_RASTERIZER_DESC(D3D12_DEFAULT);
171-
plDesc.RasterizerState.CullMode = D3D12_CULL_MODE_NONE;
171+
plDesc.RasterizerState.CullMode = D3D12_CULL_MODE_BACK;
172+
plDesc.RasterizerState.FrontCounterClockwise = TRUE;
172173
plDesc.RTVFormats[0] = DXGI_FORMAT_B8G8R8A8_UNORM;
173174
plDesc.RTVFormats[1] = DXGI_FORMAT_B8G8R8A8_UNORM;
174175
plDesc.RTVFormats[2] = DXGI_FORMAT_B8G8R8A8_UNORM;

src/private/Core/Renderer/D3D12.cpp

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,11 @@ void D3D12::Init(HWND hwnd) {
125125
this->ResourceBarrier(this->m_uvBuff.Get(), D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_RENDER_TARGET);
126126
this->ResourceBarrier(this->m_positionBuff.Get(), D3D12_RESOURCE_STATE_GENERIC_READ, D3D12_RESOURCE_STATE_RENDER_TARGET);
127127

128+
/* Track states */
129+
m_resourceStates[this->m_albedoBuff.Get()] = D3D12_RESOURCE_STATE_RENDER_TARGET;
130+
m_resourceStates[this->m_uvBuff.Get()] = D3D12_RESOURCE_STATE_RENDER_TARGET;
131+
m_resourceStates[this->m_positionBuff.Get()] = D3D12_RESOURCE_STATE_RENDER_TARGET;
132+
128133
// We'll allocate 3 for our ScreenQuad.
129134
this->m_cbvSrvHeap = new DescriptorHeap(3, D3D12_DESCRIPTOR_HEAP_TYPE_CBV_SRV_UAV, true);
130135

@@ -163,7 +168,7 @@ void D3D12::InitDepth() {
163168
depthBuffDesc.Height = this->m_nHeight;
164169
depthBuffDesc.MipLevels = 1;
165170
depthBuffDesc.DepthOrArraySize = 1;
166-
depthBuffDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL;
171+
depthBuffDesc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL | D3D12_RESOURCE_FLAG_DENY_SHADER_RESOURCE;
167172
depthBuffDesc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D;
168173

169174
D3D12_HEAP_PROPERTIES heapProps = { };
@@ -172,7 +177,7 @@ void D3D12::InitDepth() {
172177
D3D12_CLEAR_VALUE dsvClear = { };
173178
dsvClear.Format = depthBuffDesc.Format;
174179
dsvClear.DepthStencil.Depth = 1.f;
175-
dsvClear.DepthStencil.Depth = 1.f;
180+
dsvClear.DepthStencil.Stencil = 0.f;
176181

177182
ThrowIfFailed(this->m_dev->CreateCommittedResource(
178183
&heapProps,
@@ -203,6 +208,10 @@ void D3D12::Update() {
203208
ComPtr<ID3D12Resource> actualBuffer = this->m_backBuffers[this->m_nActualBackBuffer];
204209
this->ResourceBarrier(actualBuffer, D3D12_RESOURCE_STATE_PRESENT, D3D12_RESOURCE_STATE_RENDER_TARGET);
205210

211+
if (this->m_resourceStates[this->m_albedoBuff.Get()] != D3D12_RESOURCE_STATE_RENDER_TARGET)
212+
this->ResourceBarrier(this->m_albedoBuff, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, D3D12_RESOURCE_STATE_RENDER_TARGET);
213+
214+
206215
Descriptor albedoDesc = this->m_rtvHeap->GetDescriptor(this->m_nAlbedoIndex);
207216
Descriptor UVDesc = this->m_rtvHeap->GetDescriptor(this->m_nUVIndex);
208217
Descriptor positionDesc = this->m_rtvHeap->GetDescriptor(this->m_nPositionIndex);
@@ -228,8 +237,11 @@ void D3D12::Update() {
228237
};
229238
this->m_list->SetDescriptorHeaps(_countof(descriptorHeaps), descriptorHeaps);
230239

240+
231241
this->sceneMgr->Render();
232242

243+
this->ResourceBarrier(this->m_albedoBuff, D3D12_RESOURCE_STATE_RENDER_TARGET, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE);
244+
233245
Descriptor rtv = this->m_rtvHeap->GetDescriptor(this->m_nActualBackBuffer);
234246
this->m_list->OMSetRenderTargets(1, &rtv.cpuHandle, FALSE, nullptr);
235247
this->m_list->ClearRenderTargetView(rtv.cpuHandle, RGBA{ 0.f, 0.f, 0.f, 1.f }, 0, nullptr);
@@ -300,6 +312,16 @@ void D3D12::InitGBufferShader() {
300312
}
301313

302314
void D3D12::ResourceBarrier(ComPtr<ID3D12Resource> resource, D3D12_RESOURCE_STATES oldState, D3D12_RESOURCE_STATES newState) {
315+
if (oldState == newState)
316+
return;
317+
318+
D3D12_RESOURCE_STATES currentState = m_resourceStates[resource.Get()];
319+
320+
// Si el estado conocido no es el declarado, usa el conocido
321+
if (currentState != oldState && currentState != D3D12_RESOURCE_STATE_COMMON)
322+
oldState = currentState;
323+
324+
303325
D3D12_RESOURCE_BARRIER barrier = { };
304326
barrier.Transition.pResource = resource.Get();
305327
barrier.Transition.StateBefore = oldState;
@@ -308,6 +330,7 @@ void D3D12::ResourceBarrier(ComPtr<ID3D12Resource> resource, D3D12_RESOURCE_STAT
308330
barrier.Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE;
309331

310332
this->m_list->ResourceBarrier(1, &barrier);
333+
this->m_resourceStates[resource.Get()] = newState;
311334

312335
return;
313336
}

src/private/Core/Renderer/ResourceManager.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ bool ResourceManager::ResourceExists(std::string resource) {
4747

4848
void ResourceManager::LoadTexture(const uint8_t* pData, DWORD dwDataSize, std::string texName, ComPtr<ID3D12Resource>& resource) {
4949
if (!this->AddResource(texName, resource)) {
50-
spdlog::error("Error adding resource {0} to the resource manager", texName);
50+
resource = this->m_resources[texName];
5151
return;
5252
}
5353

src/public/Core/Renderer/D3D12.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ class D3D12 : public Renderer {
3939
std::vector<ComPtr<ID3D12Resource>> m_backBuffers;
4040
ComPtr<ID3D12Resource> m_depthBuffer;
4141

42+
std::unordered_map<ID3D12Resource*, D3D12_RESOURCE_STATES> m_resourceStates;
43+
4244
UINT m_nActualBackBuffer;
4345

4446
void GetMostCapableAdapter();

src/public/Util.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
#include <Windows.h>
44
#include <DXMath/DirectXMath.h>
55

6+
using namespace DirectX;
7+
68
typedef float RGBA[4];
79
typedef float RGB[3];
810
typedef float RG[2];

0 commit comments

Comments
 (0)