From 62e097c9fa2b04a5577809d855f8824bf87053f9 Mon Sep 17 00:00:00 2001 From: Patedam Date: Wed, 28 Oct 2026 22:58:37 -0400 Subject: [PATCH] depth buffer --- Juliet/render/d3d12/render_d3d12.c | 62 ++++++++++++++++++++++++++++++ Juliet/render/d3d12/render_d3d12.h | 5 +++ 2 files changed, 67 insertions(+) diff --git a/Juliet/render/d3d12/render_d3d12.c b/Juliet/render/d3d12/render_d3d12.c index e37034a..f20b8ce 100644 --- a/Juliet/render/d3d12/render_d3d12.c +++ b/Juliet/render/d3d12/render_d3d12.c @@ -268,6 +268,37 @@ R_Handle r_window_equip(WM_Window handle) Vector2i resolution = { (int32)(client_rect.x1 - client_rect.x0), (int32)(client_rect.y1 - client_rect.y0) }; window->last_resolution = resolution; + // create depth buffer + D3D12_DESCRIPTOR_HEAP_DESC dsv_heap_desc = { 0 }; + dsv_heap_desc.Type = D3D12_DESCRIPTOR_HEAP_TYPE_DSV; + dsv_heap_desc.NumDescriptors = 1; + dsv_heap_desc.Flags = D3D12_DESCRIPTOR_HEAP_FLAG_NONE; + ID3D12Device4_CreateDescriptorHeap(r_d3d12_state->device, &dsv_heap_desc, &IID_ID3D12DescriptorHeap, + (void**)&window->dsv_heap); + ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(window->dsv_heap, &window->dsv_handle); + + D3D12_HEAP_PROPERTIES depth_prop = { 0 }; + depth_prop.Type = D3D12_HEAP_TYPE_DEFAULT; + D3D12_RESOURCE_DESC depth_desc = { 0 }; + depth_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + depth_desc.Format = DXGI_FORMAT_D32_FLOAT; + depth_desc.Width = resolution.x; + depth_desc.Height = resolution.y; + depth_desc.DepthOrArraySize = 1; + depth_desc.MipLevels = 1; + depth_desc.SampleDesc.Count = 1; + depth_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; + depth_desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL; + + D3D12_CLEAR_VALUE depth_clear_val = { 0 }; + depth_clear_val.Format = DXGI_FORMAT_D32_FLOAT; + depth_clear_val.DepthStencil.Depth = 1.0f; + + ID3D12Device4_CreateCommittedResource(r_d3d12_state->device, &depth_prop, D3D12_HEAP_FLAG_NONE, &depth_desc, + D3D12_RESOURCE_STATE_DEPTH_WRITE, &depth_clear_val, &IID_ID3D12Resource, + (void**)&window->depth_buffer); + ID3D12Device4_CreateDepthStencilView(r_d3d12_state->device, window->depth_buffer, 0, window->dsv_handle); + result = r_d3d12_handle_from_window(window); } return result; @@ -282,6 +313,8 @@ void r_window_unequip(WM_Window handle, R_Handle handle_equip) R_D3D12_Window* window = r_d3d12_window_from_handle(handle_equip); if (window != 0 && window != &r_d3d12_nil_window) { + ID3D12Resource_Release(window->depth_buffer); + ID3D12DescriptorHeap_Release(window->dsv_heap); for EachIndex(i, 2) { ID3D12Resource_Release(window->framebuffer[i]); @@ -356,6 +389,31 @@ void r_window_begin_frame(WM_Window window, R_Handle window_equip) IDXGISwapChain3_GetBuffer(r_window->swapchain, i, &IID_ID3D12Resource, (void**)&r_window->framebuffer[i]); ID3D12Device4_CreateRenderTargetView(r_d3d12_state->device, r_window->framebuffer[i], 0, r_window->rtv_handles[i]); } + + // recreate depth buffer + ID3D12Resource_Release(r_window->depth_buffer); + D3D12_HEAP_PROPERTIES depth_prop = { 0 }; + depth_prop.Type = D3D12_HEAP_TYPE_DEFAULT; + D3D12_RESOURCE_DESC depth_desc = { 0 }; + depth_desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + depth_desc.Format = DXGI_FORMAT_D32_FLOAT; + depth_desc.Width = resolution.x; + depth_desc.Height = resolution.y; + depth_desc.DepthOrArraySize = 1; + depth_desc.MipLevels = 1; + depth_desc.SampleDesc.Count = 1; + depth_desc.Layout = D3D12_TEXTURE_LAYOUT_UNKNOWN; + depth_desc.Flags = D3D12_RESOURCE_FLAG_ALLOW_DEPTH_STENCIL; + + D3D12_CLEAR_VALUE depth_clear_val = { 0 }; + depth_clear_val.Format = DXGI_FORMAT_D32_FLOAT; + depth_clear_val.DepthStencil.Depth = 1.0f; + + ID3D12Device4_CreateCommittedResource(r_d3d12_state->device, &depth_prop, D3D12_HEAP_FLAG_NONE, &depth_desc, + D3D12_RESOURCE_STATE_DEPTH_WRITE, &depth_clear_val, + &IID_ID3D12Resource, (void**)&r_window->depth_buffer); + ID3D12Resource_SetName(r_window->depth_buffer, L"Window_DepthBuffer"); + ID3D12Device4_CreateDepthStencilView(r_d3d12_state->device, r_window->depth_buffer, 0, r_window->dsv_handle); } // Open the command list for that window that frame @@ -380,6 +438,10 @@ void r_window_begin_frame(WM_Window window, R_Handle window_equip) float32 background[4] = { 0.1f, 0.2f, 0.8f, 1.0f }; ID3D12GraphicsCommandList_ClearRenderTargetView(cmd_list, r_window->rtv_handles[r_window->framebuffer_idx], background, 0, 0); + + ID3D12GraphicsCommandList_ClearDepthStencilView(cmd_list, r_window->dsv_handle, D3D12_CLEAR_FLAG_DEPTH, 1.0f, 0, 0, 0); + ID3D12GraphicsCommandList_OMSetRenderTargets(cmd_list, 1, &r_window->rtv_handles[r_window->framebuffer_idx], + FALSE, &r_window->dsv_handle); } } diff --git a/Juliet/render/d3d12/render_d3d12.h b/Juliet/render/d3d12/render_d3d12.h index 37a4e33..89d09d3 100644 --- a/Juliet/render/d3d12/render_d3d12.h +++ b/Juliet/render/d3d12/render_d3d12.h @@ -26,6 +26,11 @@ struct R_D3D12_Window ID3D12DescriptorHeap* rtv_heap; uint8 framebuffer_idx; + // depth buffer + ID3D12Resource* depth_buffer; + ID3D12DescriptorHeap* dsv_heap; + D3D12_CPU_DESCRIPTOR_HANDLE dsv_handle; + // last state Vector2i last_resolution; };