@@ -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
302314void 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}
0 commit comments