From 6c8ae19be66cee247980a48e736a4e05d14de179 Mon Sep 17 00:00:00 2001 From: 3gg <3gg@shellblade.net> Date: Tue, 2 Dec 2025 16:39:36 -0800 Subject: Immediate-mode renderer, triangle demo, shader compilation in cmake, Agility SDK --- dxg/include/dxg/dxcommon.h | 98 +++++++++++++++++++++++++++++++++++++++------- dxg/include/dxg/dxg.h | 4 ++ dxg/include/dxg/imm.h | 13 ++++++ 3 files changed, 100 insertions(+), 15 deletions(-) create mode 100644 dxg/include/dxg/dxg.h create mode 100644 dxg/include/dxg/imm.h (limited to 'dxg/include') diff --git a/dxg/include/dxg/dxcommon.h b/dxg/include/dxg/dxcommon.h index bfcdbe8..96cf3a5 100644 --- a/dxg/include/dxg/dxcommon.h +++ b/dxg/include/dxg/dxcommon.h @@ -5,16 +5,57 @@ #include #include +#include #include +#include + +#define COUNTOF(ARR) (sizeof(ARR) / sizeof(ARR[0])) + +// MSVC currently has neither aligned_alloc nor alignof. +//#define ALLOC(TYPE, COUNT) (TYPE*)aligned_alloc(alignof(TYPE), sizeof(TYPE) * (COUNT)) + +typedef struct alloc_t { + void* base; // The result of malloc(). Pass this to free(). + void* ptr; // Aligned pointer within the allocation. +} alloc_t; + +static inline bool is_pow2_or_0(size_t x) { return (x & (x - 1)) == 0; } + +static inline void* align(void* address, size_t alignment) { + assert(is_pow2_or_0(alignment)); + const size_t mask = alignment - 1; + return (void*)(((uintptr_t)address + mask) & ~mask); +} + +static inline alloc_t alloc_aligned(size_t size, size_t alignment) { + void* base = malloc(size + (alignment - 1)); + return (alloc_t){.base = base, .ptr = align(base, alignment)}; +} + +static inline free_aligned(alloc_t* alloc) { + assert(alloc); + free(alloc->base); + *alloc = (alloc_t){0}; +} + +#define ALIGNOF(TYPE) _Alignof(TYPE) +#define ALLOC(TYPE, COUNT) alloc_aligned(sizeof(TYPE) * (COUNT), ALIGNOF(TYPE)) +#define FREE(ALLOC) free_aligned(&(ALLOC)) + +#ifndef NDEBUG +#define DEBUG_PRINT OutputDebugStringA +#else +#define DEBUG_PRINT +#endif #define TRAP(ERROR) { \ - fprintf(stderr, "Error in file:[%s] line:%d: %s", __FILE__, __LINE__, ERROR);\ + fprintf(stderr, "Error in file:[%s] line:%d: %s\n", __FILE__, __LINE__, ERROR);\ assert(false);\ __debugbreak();\ } #define TRAP_HRESULT(RESULT) { \ - fprintf(stderr, "HRESULT: %u", RESULT);\ + fprintf(stderr, "HRESULT: 0x%x - ", RESULT);\ TRAP("API call failed")\ } @@ -31,25 +72,52 @@ }\ } +#define MIN(A, B) ((A) < (B) ? (A) : (B)) + #define CD3DX12_CPU_DESCRIPTOR_HANDLE(HANDLE, INDEX, SIZE) \ (D3D12_CPU_DESCRIPTOR_HANDLE){HANDLE.ptr + (INDEX * SIZE)} #define OFFSET_HANDLE(HANDLE, OFFSET, SIZE) \ (D3D12_CPU_DESCRIPTOR_HANDLE){HANDLE.ptr + (OFFSET * SIZE)} -static inline D3D12_RESOURCE_BARRIER CD3DX12_RESOURCE_BARRIER_Transition( - _In_ ID3D12Resource* pResource, - D3D12_RESOURCE_STATES stateBefore, - D3D12_RESOURCE_STATES stateAfter) { - return (D3D12_RESOURCE_BARRIER){ - .Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION, - .Flags = D3D12_RESOURCE_BARRIER_FLAG_NONE, - .Transition.pResource = pResource, - .Transition.StateBefore = stateBefore, - .Transition.StateAfter = stateAfter, - .Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES}; -} - typedef enum SampleMask { PointSampling = 0xffffffff } SampleMask; + +D3D12_RESOURCE_BARRIER CD3DX12_RESOURCE_BARRIER_Transition( + ID3D12Resource* pResource, + D3D12_RESOURCE_STATES stateBefore, + D3D12_RESOURCE_STATES stateAfter); +D3D12_RASTERIZER_DESC CD3DX12_RASTERIZER_DESC_DEFAULT(); +D3D12_BLEND_DESC CD3DX12_BLEND_DESC_DEFAULT(); + +void dxg_wait(ID3D12Fence*, HANDLE fenceEvent, UINT64 fenceValue); + +// ----------------------------------------------------------------------------- +// Command Recorder +// ----------------------------------------------------------------------------- + +// Currently handling graphics command lists only. +// Add compute when needed. +typedef struct CommandRecorder { + ID3D12GraphicsCommandList* pCmdList; + ID3D12CommandAllocator* pCmdAllocator; +} CommandRecorder; + +HRESULT dxg_cmdrec_init(CommandRecorder*, ID3D12Device*); +void dxg_cmdrec_destroy(CommandRecorder*); +HRESULT dxg_cmdrec_reset(CommandRecorder*); + +// ----------------------------------------------------------------------------- +// Upload Buffer +// ----------------------------------------------------------------------------- + +typedef struct UploadBuffer { + ID3D12Resource* pUploadBuffer; + size_t size; +} UploadBuffer; + +void dxg_upload_buffer_init(UploadBuffer*, ID3D12Device*, size_t size); +void dxg_upload_buffer_destroy(UploadBuffer*, ID3D12Device*); +void dxg_upload_buffer_load(UploadBuffer*, const void* pData, size_t bytes, ID3D12Resource* pDstBuffer); +bool dxg_upload_buffer_done(UploadBuffer*); diff --git a/dxg/include/dxg/dxg.h b/dxg/include/dxg/dxg.h new file mode 100644 index 0000000..0982d9c --- /dev/null +++ b/dxg/include/dxg/dxg.h @@ -0,0 +1,4 @@ +#pragma once + +#include +#include diff --git a/dxg/include/dxg/imm.h b/dxg/include/dxg/imm.h new file mode 100644 index 0000000..fdee725 --- /dev/null +++ b/dxg/include/dxg/imm.h @@ -0,0 +1,13 @@ +#pragma once + +#include + +#include + +typedef struct DxgImm DxgImm; + +DxgImm* dxg_imm_init(ID3D12Device* pDevice, ID3D12CommandQueue*, DXGI_FORMAT swapChainRtvFormat, DXGI_SAMPLE_DESC swapChainSampleDesc, size_t bufferSizeVerts); +void dxg_imm_destroy(DxgImm**); +void dxg_imm_set_graphics_state(DxgImm*, const D3D12_VIEWPORT*, D3D12_CPU_DESCRIPTOR_HANDLE hBackBufferView, D3D12_CPU_DESCRIPTOR_HANDLE hDepthStencilView); +void dxg_imm_flush(DxgImm*); +void dxg_imm_draw_triangles(DxgImm*, const float* pVerts, size_t numTris); -- cgit v1.2.3