From b9d9e60e9f0bbf67b95eb58bc49eafbc85dbbd44 Mon Sep 17 00:00:00 2001 From: Anton Ljungdahl Date: Sun, 1 Jun 2025 17:48:47 +0200 Subject: [PATCH] hello triangle! --- src/base/base_core.h | 14 ++++ src/render/d3d12/render_d3d12.c | 122 ++++++++++++++++++++++++++++++-- src/render/d3d12/render_d3d12.h | 10 +++ 3 files changed, 141 insertions(+), 5 deletions(-) diff --git a/src/base/base_core.h b/src/base/base_core.h index 8b69dfc..2b4e3eb 100644 --- a/src/base/base_core.h +++ b/src/base/base_core.h @@ -109,6 +109,20 @@ union U128 /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //~ +global U64 U64_MAX = 0xffffffffffffffffull; +global U32 U32_MAX = 0xffffffff; +global U16 U16_MAX = 0xffff; +global U8 U8_MAX = 0xff; +global S64 S64_MAX = (S64)0x7fffffffffffffffll; +global S32 S32_MAX = (S32)0x7fffffff; +global S16 S16_MAX = (S16)0x7fff; +global S8 S8_MAX = (S8)0x7f; + +global S64 S64_MIN = (S64)0x8000000000000000ll; +global S32 S32_MIN = (S32)0x80000000; +global S16 S16_MIN = (S16)0x8000; +global S8 S8_MIN = (S8)0x80; + global const U32 bitmask1 = 0x00000001; global const U32 bitmask2 = 0x00000003; global const U32 bitmask3 = 0x00000007; diff --git a/src/render/d3d12/render_d3d12.c b/src/render/d3d12/render_d3d12.c index a83075f..217ce0f 100644 --- a/src/render/d3d12/render_d3d12.c +++ b/src/render/d3d12/render_d3d12.c @@ -33,6 +33,7 @@ global R_D3D12_State *r_d3d12_state = 0; global R_D3D12_Command *r_d3d12_cmd = 0; global R_D3D12_RenderTarget *r_d3d12_rt = 0; +global R_D3D12_Pipeline *r_d3d12_pipeline = 0; /////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //~ @@ -95,6 +96,20 @@ internal void r_init() r_d3d12_state->arena = arena; r_d3d12_state->window_handle = g_win32_window_handle; + r_d3d12_state->viewport = push_array(arena, D3D12_VIEWPORT, 1); + r_d3d12_state->viewport->TopLeftX = 0.0f; + r_d3d12_state->viewport->TopLeftY = 0.0f; + r_d3d12_state->viewport->Width = (F32)WINDOW_WIDTH_PX; + r_d3d12_state->viewport->Height = (F32)WINDOW_HEIGHT_PX; + r_d3d12_state->viewport->MinDepth = 0.0f; + r_d3d12_state->viewport->MaxDepth = 1.0f; + + r_d3d12_state->scissor_rect = push_array(arena, D3D12_RECT, 1); + r_d3d12_state->scissor_rect->left = 0; + r_d3d12_state->scissor_rect->top = 0; + r_d3d12_state->scissor_rect->right = WINDOW_WIDTH_PX; + r_d3d12_state->scissor_rect->bottom = WINDOW_HEIGHT_PX; + r_d3d12_cmd = push_array(arena, R_D3D12_Command, 1); @@ -105,6 +120,10 @@ internal void r_init() R_D3D12_RenderTarget, 1); r_d3d12_rt->arena = arena; + r_d3d12_pipeline = push_array(arena, + R_D3D12_Pipeline, 1); + r_d3d12_pipeline->arena = arena; + HRESULT hr; hr = D3D12GetDebugInterface(&IID_ID3D12Debug, (void **)&r_d3d12_state->debug); if(SUCCEEDED(hr) && r_d3d12_state->debug) @@ -363,9 +382,83 @@ internal void r_init() &err_blob); D3D12_SHADER_CHECK(hr, err_blob); + /// Vertex input layout + D3D12_INPUT_ELEMENT_DESC input_element_desc[2]; + input_element_desc[0].SemanticName = "POSITION"; + input_element_desc[0].SemanticIndex = 0; + input_element_desc[0].Format = DXGI_FORMAT_R32G32B32_FLOAT; + input_element_desc[0].InputSlot = 0; + input_element_desc[0].AlignedByteOffset = 0; + input_element_desc[0].InputSlotClass = D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA; + input_element_desc[0].InstanceDataStepRate = 0; + + input_element_desc[1].SemanticName = "COLOR"; + input_element_desc[1].SemanticIndex = 0; + input_element_desc[1].Format = DXGI_FORMAT_R32G32B32A32_FLOAT; + input_element_desc[1].InputSlot = 0; + input_element_desc[1].AlignedByteOffset = 12; + input_element_desc[1].InputSlotClass = D3D12_INPUT_CLASSIFICATION_PER_VERTEX_DATA; + input_element_desc[1].InstanceDataStepRate = 0; + + + // Pipeline State Object PSO + D3D12_GRAPHICS_PIPELINE_STATE_DESC pso_desc = {0}; + { + pso_desc.InputLayout.pInputElementDescs = input_element_desc; + pso_desc.InputLayout.NumElements = ArrayCount(input_element_desc); + + pso_desc.pRootSignature = r_d3d12_state->root_signature; + + pso_desc.VS = r_d3d12_get_shader_bytecode(vtx_shader); + pso_desc.PS = r_d3d12_get_shader_bytecode(pxl_shader); + + D3D12_RASTERIZER_DESC raster_desc = { .FillMode = D3D12_FILL_MODE_SOLID, + .CullMode = D3D12_CULL_MODE_BACK, + .FrontCounterClockwise = FALSE, + .DepthBias = D3D12_DEFAULT_DEPTH_BIAS, + .DepthBiasClamp = D3D12_DEFAULT_DEPTH_BIAS_CLAMP, + .SlopeScaledDepthBias = D3D12_DEFAULT_SLOPE_SCALED_DEPTH_BIAS, + .DepthClipEnable = TRUE, + .MultisampleEnable = FALSE, + .AntialiasedLineEnable = FALSE, + .ForcedSampleCount = 0, + .ConservativeRaster = D3D12_CONSERVATIVE_RASTERIZATION_MODE_OFF}; + pso_desc.RasterizerState = raster_desc; + + D3D12_BLEND_DESC blend_desc = {0}; + blend_desc.RenderTarget[0].SrcBlend = D3D12_BLEND_ONE; + blend_desc.RenderTarget[0].DestBlend = D3D12_BLEND_ZERO; + blend_desc.RenderTarget[0].BlendOp = D3D12_BLEND_OP_ADD; + blend_desc.RenderTarget[0].SrcBlendAlpha = D3D12_BLEND_ONE; + blend_desc.RenderTarget[0].DestBlendAlpha = D3D12_BLEND_ZERO; + blend_desc.RenderTarget[0].BlendOpAlpha = D3D12_BLEND_OP_ADD; + blend_desc.RenderTarget[0].LogicOp = D3D12_LOGIC_OP_NOOP; + blend_desc.RenderTarget[0].RenderTargetWriteMask = D3D12_COLOR_WRITE_ENABLE_ALL; + + pso_desc.BlendState = blend_desc; + + pso_desc.DepthStencilState.DepthEnable = FALSE; + pso_desc.DepthStencilState.StencilEnable = FALSE; + pso_desc.SampleMask = U32_MAX; + pso_desc.PrimitiveTopologyType = D3D12_PRIMITIVE_TOPOLOGY_TYPE_TRIANGLE; + pso_desc.NumRenderTargets = 1; + pso_desc.RTVFormats[0] = DXGI_FORMAT_R8G8B8A8_UNORM; + pso_desc.SampleDesc.Count = 1; + + hr = ID3D12Device_CreateGraphicsPipelineState(r_d3d12_state->device, + &pso_desc, + &IID_ID3D12PipelineState, + (void **)&r_d3d12_pipeline->pso); + D3D12_CHECK(hr, "Failed to create pipeline state \n"); + + + + + } + + + - - if(pxl_shader) { ID3D10Blob_Release(pxl_shader); @@ -382,8 +475,6 @@ internal void r_init() } - - // --------------------------------------------------------------------------- // Fence hr = ID3D12Device_CreateFence(r_d3d12_state->device, @@ -424,11 +515,18 @@ internal void r_render() HRESULT hr = ID3D12CommandAllocator_Reset(r_d3d12_cmd->allocator); D3D12_CHECK(hr, "Failed to reset command allocator\n"); - hr = ID3D12GraphicsCommandList_Reset(r_d3d12_cmd->list1, r_d3d12_cmd->allocator, 0); + hr = ID3D12GraphicsCommandList_Reset(r_d3d12_cmd->list1, r_d3d12_cmd->allocator, r_d3d12_pipeline->pso); D3D12_CHECK(hr, "Failed to reset command list\n"); U32 frame_index = IDXGISwapChain3_GetCurrentBackBufferIndex(r_d3d12_state->swapchain); + ID3D12GraphicsCommandList_SetGraphicsRootSignature(r_d3d12_cmd->list1, + r_d3d12_state->root_signature); + ID3D12GraphicsCommandList_RSSetViewports(r_d3d12_cmd->list1, + 1, r_d3d12_state->viewport); + ID3D12GraphicsCommandList_RSSetScissorRects(r_d3d12_cmd->list1, + 1, r_d3d12_state->scissor_rect); + D3D12_RESOURCE_BARRIER barrier = { .Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION, @@ -447,6 +545,9 @@ internal void r_render() D3D12_CPU_DESCRIPTOR_HANDLE rtv_handle; ID3D12DescriptorHeap_GetCPUDescriptorHandleForHeapStart(r_d3d12_rt->heap, &rtv_handle); rtv_handle.ptr += frame_index * r_d3d12_rt->descriptor_size; + + ID3D12GraphicsCommandList_OMSetRenderTargets(r_d3d12_cmd->list1, + 1, &rtv_handle, FALSE, 0); // Clear render target F32 clearColor[4] = {0.1f, 0.2f, 0.3f, 1.0f}; @@ -456,6 +557,13 @@ internal void r_render() 0, 0); + ID3D12GraphicsCommandList_IASetPrimitiveTopology(r_d3d12_cmd->list1, + D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST); + ID3D12GraphicsCommandList_IASetVertexBuffers(r_d3d12_cmd->list1, + 0, 1, &r_d3d12_state->vtx_buf_view); + ID3D12GraphicsCommandList_DrawInstanced(r_d3d12_cmd->list1, + 3, 1, 0, 0); + // Transition render target back to present state @@ -508,6 +616,10 @@ internal void r_cleanup() D3D12_RELEASE(r_d3d12_state->swapchain); D3D12_RELEASE(r_d3d12_state->fence); D3D12_RELEASE(r_d3d12_state->vertex_buffer); + D3D12_RELEASE(r_d3d12_state->root_signature); + + // PSOs + D3D12_RELEASE(r_d3d12_pipeline->pso); // RT D3D12_RELEASE(r_d3d12_rt->heap); diff --git a/src/render/d3d12/render_d3d12.h b/src/render/d3d12/render_d3d12.h index d2a647d..6af294e 100644 --- a/src/render/d3d12/render_d3d12.h +++ b/src/render/d3d12/render_d3d12.h @@ -43,6 +43,13 @@ struct R_D3D12_RenderTarget ID3D12Resource *targets[R_NUM_FRAMES_IN_FLIGHT]; }; +typedef struct R_D3D12_Pipeline R_D3D12_Pipeline; +struct R_D3D12_Pipeline +{ + Arena *arena; + ID3D12PipelineState *pso; +}; + typedef struct R_D3D12_State R_D3D12_State; struct R_D3D12_State { @@ -59,6 +66,9 @@ struct R_D3D12_State D3D12_VERTEX_BUFFER_VIEW vtx_buf_view; ID3D12PipelineState *pipeline; ID3D12RootSignature *root_signature; + D3D12_VIEWPORT *viewport; + D3D12_RECT *scissor_rect; + }; ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////