gpu layer refactor progress

This commit is contained in:
jacob 2025-07-31 22:00:24 -05:00
parent 19c0140868
commit bdac093378
2 changed files with 346 additions and 365 deletions

File diff suppressed because it is too large Load Diff

View File

@ -51,19 +51,38 @@
* structs * structs
* ========================== */ * ========================== */
struct shader_desc Struct(GPU_D12_Descriptor)
{ {
String file; struct GPU_D12_CpuDescriptorHeap *heap;
String func;
u32 index;
D3D12_CPU_DESCRIPTOR_HANDLE handle;
GPU_D12_Descriptor *next_free;
}; };
struct pipeline_rtv_desc Struct(GPU_D12_Resource)
{
enum D3D12_RESOURCE_STATES state;
ID3D12Resource *resource;
GPU_D12_Descriptor *cbv_descriptor;
GPU_D12_Descriptor *srv_descriptor;
GPU_D12_Descriptor *uav_descriptor;
GPU_D12_Descriptor *rtv_descriptor;
D3D12_GPU_VIRTUAL_ADDRESS gpu_address; /* NOTE: 0 for textures */
Vec2I32 texture_size;
GPU_D12_Resource *next_free;
};
Struct(GPU_D12_RtvDesc)
{ {
DXGI_FORMAT format; DXGI_FORMAT format;
b32 blending; b32 blending;
}; };
struct pipeline_desc Struct(GPU_D12_PipelineDesc)
{ {
String name; String name;
@ -72,10 +91,10 @@ struct pipeline_desc
String ps_dxc; String ps_dxc;
String cs_dxc; String cs_dxc;
struct pipeline_rtv_desc rtvs[8]; GPU_D12_RtvDesc rtvs[8];
}; };
struct pipeline Struct(GPU_D12_Pipeline)
{ {
String name; String name;
u64 hash; u64 hash;
@ -89,41 +108,28 @@ struct pipeline
ID3D12PipelineState *pso; ID3D12PipelineState *pso;
ID3D12RootSignature *rootsig; ID3D12RootSignature *rootsig;
struct pipeline_desc desc; GPU_D12_PipelineDesc desc;
struct pipeline *next; GPU_D12_Pipeline *next;
}; };
struct pipeline_error Struct(GPU_D12_PipelineScope)
{
String msg;
struct pipeline_error *next;
};
struct pipeline_include
{
String name;
u64 name_hash;
struct pipeline_include *next;
};
struct pipeline_scope
{ {
Arena *arena; Arena *arena;
Dict *refs; Dict *refs;
struct pipeline_scope *next_free; GPU_D12_PipelineScope *next_free;
}; };
struct command_queue_desc Struct(GPU_D12_CommandQueueDesc)
{ {
enum D3D12_COMMAND_LIST_TYPE type; enum D3D12_COMMAND_LIST_TYPE type;
enum D3D12_COMMAND_QUEUE_PRIORITY priority; enum D3D12_COMMAND_QUEUE_PRIORITY priority;
String dbg_name; String dbg_name;
}; };
struct command_queue Struct(GPU_D12_CommandQueue)
{ {
struct command_queue_desc desc; GPU_D12_CommandQueueDesc desc;
ID3D12CommandQueue *cq; ID3D12CommandQueue *cq;
Arena *arena; Arena *arena;
@ -131,123 +137,98 @@ struct command_queue
u64 submit_fence_target; u64 submit_fence_target;
ID3D12Fence *submit_fence; ID3D12Fence *submit_fence;
struct command_list_pool *cl_pool; struct GPU_D12_CommandListPool *cl_pool;
#if ProfilingGpu #if ProfilingGpu
__prof_dx12_ctx(prof); __prof_dx12_ctx(prof);
#endif #endif
}; };
struct command_list_pool Struct(GPU_D12_CommandListPool)
{ {
struct command_queue *cq; GPU_D12_CommandQueue *cq;
Arena *arena; Arena *arena;
P_Mutex mutex; P_Mutex mutex;
struct command_list *first_submitted_command_list; struct GPU_D12_CommandList *first_submitted_command_list;
struct command_list *last_submitted_command_list; struct GPU_D12_CommandList *last_submitted_command_list;
}; };
struct command_list Struct(GPU_D12_CommandDescriptorHeap)
{
struct command_queue *cq;
struct command_list_pool *pool;
struct ID3D12CommandAllocator *ca;
struct ID3D12GraphicsCommandList *cl;
P_Lock global_record_lock;
struct pipeline *cur_pipeline;
struct command_descriptor_heap *first_command_descriptor_heap;
struct command_buffer *first_command_buffer;
u64 submitted_fence_target;
struct command_list *prev_submitted;
struct command_list *next_submitted;
};
struct command_descriptor_heap
{ {
D3D12_DESCRIPTOR_HEAP_TYPE type; D3D12_DESCRIPTOR_HEAP_TYPE type;
ID3D12DescriptorHeap *heap; ID3D12DescriptorHeap *heap;
D3D12_CPU_DESCRIPTOR_HANDLE start_cpu_handle; D3D12_CPU_DESCRIPTOR_HANDLE start_cpu_handle;
D3D12_GPU_DESCRIPTOR_HANDLE start_gpu_handle; D3D12_GPU_DESCRIPTOR_HANDLE start_gpu_handle;
struct command_descriptor_heap *next_in_command_list; GPU_D12_CommandDescriptorHeap *next_in_command_list;
u64 submitted_fence_target; u64 submitted_fence_target;
struct command_queue *submitted_cq; GPU_D12_CommandQueue *submitted_cq;
struct command_descriptor_heap *prev_submitted; GPU_D12_CommandDescriptorHeap *prev_submitted;
struct command_descriptor_heap *next_submitted; GPU_D12_CommandDescriptorHeap *next_submitted;
}; };
struct command_buffer Struct(GPU_D12_CommandBuffer)
{ {
struct command_buffer_group *group; struct GPU_D12_CommandBufferGroup *group;
u64 size; u64 size;
struct dx12_resource *resource; GPU_D12_Resource *resource;
D3D12_VERTEX_BUFFER_VIEW vbv; D3D12_VERTEX_BUFFER_VIEW vbv;
D3D12_INDEX_BUFFER_VIEW Ibv; D3D12_INDEX_BUFFER_VIEW Ibv;
struct command_buffer *next_in_command_list; GPU_D12_CommandBuffer *next_in_command_list;
u64 submitted_fence_target; u64 submitted_fence_target;
struct command_queue *submitted_cq; GPU_D12_CommandQueue *submitted_cq;
struct command_buffer *prev_submitted; GPU_D12_CommandBuffer *prev_submitted;
struct command_buffer *next_submitted; GPU_D12_CommandBuffer *next_submitted;
}; };
struct command_buffer_group Struct(GPU_D12_CommandBufferGroup)
{ {
struct command_buffer *first_submitted; GPU_D12_CommandBuffer *first_submitted;
struct command_buffer *last_submitted; GPU_D12_CommandBuffer *last_submitted;
}; };
struct descriptor Struct(GPU_D12_CommandList)
{ {
struct cpu_descriptor_heap *heap; GPU_D12_CommandQueue *cq;
GPU_D12_CommandListPool *pool;
struct ID3D12CommandAllocator *ca;
struct ID3D12GraphicsCommandList *cl;
P_Lock global_record_lock;
u32 index; GPU_D12_Pipeline *cur_pipeline;
D3D12_CPU_DESCRIPTOR_HANDLE handle;
struct descriptor *next_free; GPU_D12_CommandDescriptorHeap *first_command_descriptor_heap;
GPU_D12_CommandBuffer *first_command_buffer;
u64 submitted_fence_target;
GPU_D12_CommandList *prev_submitted;
GPU_D12_CommandList *next_submitted;
}; };
struct dx12_resource Struct(GPU_D12_SwapchainBuffer)
{ {
enum D3D12_RESOURCE_STATES state; struct GPU_D12_Swapchain *swapchain;
ID3D12Resource *resource; ID3D12Resource *resource;
struct descriptor *cbv_descriptor; GPU_D12_Descriptor *rtv_descriptor;
struct descriptor *srv_descriptor;
struct descriptor *uav_descriptor;
struct descriptor *rtv_descriptor;
D3D12_GPU_VIRTUAL_ADDRESS gpu_address; /* NOTE: 0 for textures */
Vec2I32 texture_size;
struct dx12_resource *next_free;
};
struct swapchain_buffer
{
struct swapchain *swapchain;
ID3D12Resource *resource;
struct descriptor *rtv_descriptor;
D3D12_RESOURCE_STATES state; D3D12_RESOURCE_STATES state;
}; };
struct swapchain Struct(GPU_D12_Swapchain)
{ {
IDXGISwapChain3 *swapchain; IDXGISwapChain3 *swapchain;
HWND hwnd; HWND hwnd;
HANDLE waitable; HANDLE waitable;
Vec2I32 resolution; Vec2I32 resolution;
struct swapchain_buffer buffers[DX12_SWAPCHAIN_BUFFER_COUNT]; GPU_D12_SwapchainBuffer buffers[DX12_SWAPCHAIN_BUFFER_COUNT];
struct swapchain *next_free; GPU_D12_Swapchain *next_free;
}; };
struct cpu_descriptor_heap Struct(GPU_D12_CpuDescriptorHeap)
{ {
enum D3D12_DESCRIPTOR_HEAP_TYPE type; enum D3D12_DESCRIPTOR_HEAP_TYPE type;
Arena *arena; Arena *arena;
@ -257,32 +238,32 @@ struct cpu_descriptor_heap
u32 num_descriptors_reserved; u32 num_descriptors_reserved;
u32 num_descriptors_capacity; u32 num_descriptors_capacity;
struct descriptor *first_free_descriptor; GPU_D12_Descriptor *first_free_descriptor;
ID3D12DescriptorHeap *heap; ID3D12DescriptorHeap *heap;
struct D3D12_CPU_DESCRIPTOR_HANDLE handle; struct D3D12_CPU_DESCRIPTOR_HANDLE handle;
}; };
enum fenced_release_kind typedef i32 GPU_D12_FencedReleaseKind; enum
{ {
FENCED_RELEASE_KIND_NONE, GPU_D12_FencedReleaseKind_None,
FENCED_RELEASE_KIND_RESOURCE, GPU_D12_FencedReleaseKind_Resource,
FENCED_RELEASE_KIND_PIPELINE GPU_D12_FencedReleaseKind_Pipeline
}; };
struct fenced_release_data Struct(GPU_D12_FencedReleaseData)
{ {
enum fenced_release_kind kind; GPU_D12_FencedReleaseKind kind;
void *ptr; void *ptr;
}; };
struct command_queue_alloc_job_sig { struct command_queue_desc *descs_in; struct command_queue **cqs_out; }; Struct(GPU_D12_AllocCommandQueueJobSig) { GPU_D12_CommandQueueDesc *descs_in; GPU_D12_CommandQueue **cqs_out; };
struct pipeline_alloc_job_sig { struct pipeline_desc *descs_in; struct pipeline **pipelines_out; }; Struct(GPU_D12_AllocPipelineJobSig) { GPU_D12_PipelineDesc *descs_in; GPU_D12_Pipeline **pipelines_out; };
struct dx12_upload_job_sig { struct dx12_resource *resource; void *data; }; Struct(GPU_D12_UploadJobSig) { GPU_D12_Resource *resource; void *data; };
struct shader_compile_desc Struct(GPU_D12_ShaderDesc)
{ {
String src; String src;
String friendly_name; String friendly_name;
@ -290,7 +271,7 @@ struct shader_compile_desc
String target; String target;
}; };
struct shader_compile_result Struct(GPU_D12_CompiledShaderResult)
{ {
i64 elapsed_ns; i64 elapsed_ns;
String dxc; String dxc;
@ -298,15 +279,15 @@ struct shader_compile_result
b32 success; b32 success;
}; };
struct shader_compile_job_sig Struct(GPU_D12_CompileShaderJobSig)
{ {
Arena *arena; Arena *arena;
struct shader_compile_desc *descs; GPU_D12_ShaderDesc *descs;
struct shader_compile_result *results; GPU_D12_CompiledShaderResult *results;
}; };
struct render_sig Struct(GPU_D12_RenderSig)
{ {
Arena *arena; Arena *arena;
RandState rand; RandState rand;
@ -329,16 +310,16 @@ struct render_sig
Arena *material_grid_descs_arena; Arena *material_grid_descs_arena;
/* Resources */ /* Resources */
struct dx12_resource *albedo; GPU_D12_Resource *albedo;
struct dx12_resource *emittance; GPU_D12_Resource *emittance;
struct dx12_resource *emittance_flood_read; GPU_D12_Resource *emittance_flood_read;
struct dx12_resource *emittance_flood_target; GPU_D12_Resource *emittance_flood_target;
struct dx12_resource *shade_read; GPU_D12_Resource *shade_read;
struct dx12_resource *shade_target; GPU_D12_Resource *shade_target;
struct dx12_resource *ui_target; GPU_D12_Resource *ui_target;
}; };
struct material_instance_desc Struct(GPU_D12_MaterialInstanceDesc)
{ {
Xform xf; Xform xf;
u32 texture_id; u32 texture_id;
@ -349,7 +330,7 @@ struct material_instance_desc
u32 grid_id; u32 grid_id;
}; };
struct ui_rect_instance_desc Struct(GPU_D12_UiRectInstanceDesc)
{ {
Xform xf; Xform xf;
u32 texture_id; u32 texture_id;
@ -357,7 +338,7 @@ struct ui_rect_instance_desc
u32 tint; u32 tint;
}; };
struct material_grid_desc Struct(GPU_D12_MaterialGridDesc)
{ {
f32 line_thickness; f32 line_thickness;
f32 line_spacing; f32 line_spacing;
@ -380,8 +361,8 @@ Struct(GPU_D12_SharedState)
/* Descriptor heaps pool */ /* Descriptor heaps pool */
P_Mutex command_descriptor_heaps_mutex; P_Mutex command_descriptor_heaps_mutex;
Arena *command_descriptor_heaps_arena; Arena *command_descriptor_heaps_arena;
struct command_descriptor_heap *first_submitted_command_descriptor_heap; GPU_D12_CommandDescriptorHeap *first_submitted_command_descriptor_heap;
struct command_descriptor_heap *last_submitted_command_descriptor_heap; GPU_D12_CommandDescriptorHeap *last_submitted_command_descriptor_heap;
/* Command buffers pool */ /* Command buffers pool */
P_Mutex command_buffers_mutex; P_Mutex command_buffers_mutex;
@ -391,12 +372,12 @@ Struct(GPU_D12_SharedState)
/* Resources pool */ /* Resources pool */
P_Mutex resources_mutex; P_Mutex resources_mutex;
Arena *resources_arena; Arena *resources_arena;
struct dx12_resource *first_free_resource; GPU_D12_Resource *first_free_resource;
/* Swapchains pool */ /* Swapchains pool */
P_Mutex swapchains_mutex; P_Mutex swapchains_mutex;
Arena *swapchains_arena; Arena *swapchains_arena;
struct swapchain *first_free_swapchain; GPU_D12_Swapchain *first_free_swapchain;
/* Shader bytecode archive */ /* Shader bytecode archive */
TAR_Archive dxc_archive; TAR_Archive dxc_archive;
@ -404,11 +385,11 @@ Struct(GPU_D12_SharedState)
/* Pipeline cache */ /* Pipeline cache */
P_Mutex pipelines_mutex; P_Mutex pipelines_mutex;
Arena *pipelines_arena; Arena *pipelines_arena;
struct pipeline *first_free_pipeline; GPU_D12_Pipeline *first_free_pipeline;
Dict *pipeline_descs; Dict *pipeline_descs;
Dict *top_pipelines; /* Latest pipelines */ Dict *top_pipelines; /* Latest pipelines */
Dict *top_successful_pipelines; /* Latest pipelines that successfully compiled */ Dict *top_successful_pipelines; /* Latest pipelines that successfully compiled */
struct pipeline_scope *first_free_pipeline_scope; GPU_D12_PipelineScope *first_free_pipeline_scope;
/* Fenced release queue */ /* Fenced release queue */
P_Mutex fenced_releases_mutex; P_Mutex fenced_releases_mutex;
@ -429,13 +410,13 @@ Struct(GPU_D12_SharedState)
u32 desc_counts[D3D12_DESCRIPTOR_HEAP_TYPE_NUM_TYPES]; u32 desc_counts[D3D12_DESCRIPTOR_HEAP_TYPE_NUM_TYPES];
/* Global descriptor heaps */ /* Global descriptor heaps */
struct cpu_descriptor_heap *cbv_srv_uav_heap; GPU_D12_CpuDescriptorHeap *cbv_srv_uav_heap;
struct cpu_descriptor_heap *rtv_heap; GPU_D12_CpuDescriptorHeap *rtv_heap;
/* Command queues */ /* Command queues */
P_Mutex global_command_list_record_mutex; P_Mutex global_command_list_record_mutex;
P_Mutex global_submit_mutex; P_Mutex global_submit_mutex;
struct command_queue *command_queues[DX12_NUM_QUEUES]; GPU_D12_CommandQueue *command_queues[DX12_NUM_QUEUES];
/* Evictor job */ /* Evictor job */
P_Counter evictor_job_counter; P_Counter evictor_job_counter;
@ -493,20 +474,20 @@ P_JobDef(shader_compile_job, job);
P_JobDef(pipeline_alloc_job, job); P_JobDef(pipeline_alloc_job, job);
void pipeline_release_now(struct pipeline *pipeline); void pipeline_release_now(GPU_D12_Pipeline *pipeline);
/* ========================== * /* ========================== *
* Pipeline cache * Pipeline cache
* ========================== */ * ========================== */
struct pipeline_scope *pipeline_scope_begin(void); GPU_D12_PipelineScope *pipeline_scope_begin(void);
void pipeline_scope_end(struct pipeline_scope *scope); void pipeline_scope_end(GPU_D12_PipelineScope *scope);
extern Readonly struct pipeline g_nil_pipeline; extern Readonly GPU_D12_Pipeline g_nil_pipeline;
struct pipeline *pipeline_from_name(struct pipeline_scope *scope, String name); GPU_D12_Pipeline *pipeline_from_name(GPU_D12_PipelineScope *scope, String name);
void pipeline_register(u64 num_pipelines, struct pipeline **pipelines); void pipeline_register(u64 num_pipelines, GPU_D12_Pipeline **pipelines);
W_CallbackFuncDef(pipeline_watch_callback, name); W_CallbackFuncDef(pipeline_watch_callback, name);
@ -514,29 +495,29 @@ W_CallbackFuncDef(pipeline_watch_callback, name);
* Descriptor * Descriptor
* ========================== */ * ========================== */
struct descriptor *descriptor_alloc(struct cpu_descriptor_heap *dh); GPU_D12_Descriptor *descriptor_alloc(GPU_D12_CpuDescriptorHeap *dh);
void descriptor_release(struct descriptor *descriptor); void descriptor_release(GPU_D12_Descriptor *descriptor);
/* ========================== * /* ========================== *
* CPU descriptor heap * CPU descriptor heap
* ========================== */ * ========================== */
struct cpu_descriptor_heap *cpu_descriptor_heap_alloc(enum D3D12_DESCRIPTOR_HEAP_TYPE type); GPU_D12_CpuDescriptorHeap *cpu_descriptor_heap_alloc(enum D3D12_DESCRIPTOR_HEAP_TYPE type);
/* ========================== * /* ========================== *
* Fenced release * Fenced release
* ========================== */ * ========================== */
void fenced_release(void *data, enum fenced_release_kind kind); void fenced_release(void *data, GPU_D12_FencedReleaseKind kind);
/* ========================== * /* ========================== *
* Resource * Resource
* ========================== */ * ========================== */
struct dx12_resource *dx12_resource_alloc(D3D12_HEAP_PROPERTIES heap_props, D3D12_HEAP_FLAGS heap_flags, D3D12_RESOURCE_DESC desc, D3D12_RESOURCE_STATES initial_state); GPU_D12_Resource *dx12_resource_alloc(D3D12_HEAP_PROPERTIES heap_props, D3D12_HEAP_FLAGS heap_flags, D3D12_RESOURCE_DESC desc, D3D12_RESOURCE_STATES initial_state);
void dx12_resource_release_now(struct dx12_resource *t); void dx12_resource_release_now(GPU_D12_Resource *t);
void GPU_ReleaseResource(GPU_Resource *resource); void GPU_ReleaseResource(GPU_Resource *resource);
@ -547,7 +528,7 @@ void GPU_ReleaseResource(GPU_Resource *resource);
struct dx12_resource_barrier_desc struct dx12_resource_barrier_desc
{ {
enum D3D12_RESOURCE_BARRIER_TYPE type; enum D3D12_RESOURCE_BARRIER_TYPE type;
struct dx12_resource *resource; GPU_D12_Resource *resource;
enum D3D12_RESOURCE_STATES new_state; /* 0 if type != D3D12_RESOURCE_BARRIER_TYPE_TRANSITION */ enum D3D12_RESOURCE_STATES new_state; /* 0 if type != D3D12_RESOURCE_BARRIER_TYPE_TRANSITION */
}; };
@ -559,24 +540,24 @@ void dx12_resource_barriers(ID3D12GraphicsCommandList *cl, i32 num_descs, struct
P_JobDef(command_queue_alloc_job, job); P_JobDef(command_queue_alloc_job, job);
void command_queue_release(struct command_queue *cq); void command_queue_release(GPU_D12_CommandQueue *cq);
/* ========================== * /* ========================== *
* Command list * Command list
* ========================== */ * ========================== */
struct command_list_pool *command_list_pool_alloc(struct command_queue *cq); GPU_D12_CommandListPool *command_list_pool_alloc(GPU_D12_CommandQueue *cq);
struct command_list *command_list_open(struct command_list_pool *pool); GPU_D12_CommandList *command_list_open(GPU_D12_CommandListPool *pool);
/* TODO: Allow multiple command list submissions */ /* TODO: Allow multiple command list submissions */
u64 command_list_close(struct command_list *cl); u64 command_list_close(GPU_D12_CommandList *cl);
/* ========================== * /* ========================== *
* Command descriptor heap (GPU / shader visible descriptor heap) * Command descriptor heap (GPU / shader visible descriptor heap)
* ========================== */ * ========================== */
struct command_descriptor_heap *command_list_push_descriptor_heap(struct command_list *cl, struct cpu_descriptor_heap *dh_cpu); GPU_D12_CommandDescriptorHeap *command_list_push_descriptor_heap(GPU_D12_CommandList *cl, GPU_D12_CpuDescriptorHeap *dh_cpu);
/* ========================== * /* ========================== *
* Command buffer * Command buffer
@ -587,7 +568,7 @@ u64 command_buffer_hash_from_size(u64 size);
u64 align_up_pow2(u64 v); u64 align_up_pow2(u64 v);
#define command_list_push_buffer(cl, count, elems) _command_list_push_buffer((cl), count * ((elems) ? sizeof(*(elems)) : 0), (elems), (elems) ? sizeof(*(elems)) : 1) #define command_list_push_buffer(cl, count, elems) _command_list_push_buffer((cl), count * ((elems) ? sizeof(*(elems)) : 0), (elems), (elems) ? sizeof(*(elems)) : 1)
struct command_buffer *_command_list_push_buffer(struct command_list *cl, u64 data_len, void *data, u64 data_stride); GPU_D12_CommandBuffer *_command_list_push_buffer(GPU_D12_CommandList *cl, u64 data_len, void *data, u64 data_stride);
/* ========================== * /* ========================== *
* Wait job * Wait job
@ -619,33 +600,33 @@ P_JobDef(dx12_upload_job, job);
* Run utils * Run utils
* ========================== */ * ========================== */
void command_list_set_pipeline(struct command_list *cl, struct pipeline *pipeline); void command_list_set_pipeline(GPU_D12_CommandList *cl, GPU_D12_Pipeline *pipeline);
void command_list_set_sig(struct command_list *cl, void *src, u32 size); void command_list_set_sig(GPU_D12_CommandList *cl, void *src, u32 size);
struct D3D12_VIEWPORT viewport_from_rect(Rect r); struct D3D12_VIEWPORT viewport_from_rect(Rect r);
D3D12_RECT scissor_from_rect(Rect r); D3D12_RECT scissor_from_rect(Rect r);
D3D12_VERTEX_BUFFER_VIEW vbv_from_command_buffer(struct command_buffer *cb, u32 vertex_size); D3D12_VERTEX_BUFFER_VIEW vbv_from_command_buffer(GPU_D12_CommandBuffer *cb, u32 vertex_size);
D3D12_INDEX_BUFFER_VIEW ibv_from_command_buffer(struct command_buffer *cb, DXGI_FORMAT format); D3D12_INDEX_BUFFER_VIEW ibv_from_command_buffer(GPU_D12_CommandBuffer *cb, DXGI_FORMAT format);
struct dx12_resource *gbuff_alloc(DXGI_FORMAT format, Vec2I32 size, D3D12_RESOURCE_STATES initial_state); GPU_D12_Resource *gbuff_alloc(DXGI_FORMAT format, Vec2I32 size, D3D12_RESOURCE_STATES initial_state);
/* Calculate the view projection matrix */ /* Calculate the view projection matrix */
Inline Mat4x4 calculate_vp(Xform view, f32 viewport_width, f32 viewport_height); Inline Mat4x4 calculate_vp(Xform view, f32 viewport_width, f32 viewport_height);
D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle_from_descriptor(struct descriptor *descriptor, struct command_descriptor_heap *cdh); D3D12_GPU_DESCRIPTOR_HANDLE gpu_handle_from_descriptor(GPU_D12_Descriptor *descriptor, GPU_D12_CommandDescriptorHeap *cdh);
/* ========================== * /* ========================== *
* Render sig * Render sig
* ========================== */ * ========================== */
struct render_sig *render_sig_alloc(void); GPU_D12_RenderSig *render_sig_alloc(void);
void render_sig_reset(struct render_sig *sig); void render_sig_reset(GPU_D12_RenderSig *sig);
GPU_RenderSig *GPU_AllocRenderSig(void); GPU_RenderSig *GPU_AllocRenderSig(void);
@ -667,7 +648,7 @@ GPU_MemoryInfo GPU_QueryMemoryInfo(void);
* Swapchain * Swapchain
* ========================== */ * ========================== */
void swapchain_init_resources(struct swapchain *swapchain); void swapchain_init_resources(GPU_D12_Swapchain *swapchain);
GPU_Swapchain *GPU_AllocSwapchain(P_Window *window, Vec2I32 resolution); GPU_Swapchain *GPU_AllocSwapchain(P_Window *window, Vec2I32 resolution);
@ -675,13 +656,13 @@ void GPU_ReleaseSwapchain(GPU_Swapchain *gp_swapchain);
void GPU_WaitOnSwapchain(GPU_Swapchain *gp_swapchain); void GPU_WaitOnSwapchain(GPU_Swapchain *gp_swapchain);
struct swapchain_buffer *update_swapchain(struct swapchain *swapchain, Vec2I32 resolution); GPU_D12_SwapchainBuffer *update_swapchain(GPU_D12_Swapchain *swapchain, Vec2I32 resolution);
/* ========================== * /* ========================== *
* Present * Present
* ========================== */ * ========================== */
void present_blit(struct swapchain_buffer *dst, struct dx12_resource *src, Xform src_xf); void present_blit(GPU_D12_SwapchainBuffer *dst, GPU_D12_Resource *src, Xform src_xf);
void GPU_PresentSwapchain(GPU_Swapchain *gp_swapchain, Vec2I32 backbuffer_resolution, GPU_Resource *texture, Xform texture_xf, i32 vsync); void GPU_PresentSwapchain(GPU_Swapchain *gp_swapchain, Vec2I32 backbuffer_resolution, GPU_Resource *texture, Xform texture_xf, i32 vsync);