我手上已经有了 Jai d3d12 example,可以渲染一个三角形。

接下来对照了 龙书:Introduction to 3D Game Programming with DirectX 12 的 Chatper 4 - Direct3D Initialization,理解现有的 Jai 代码。

DXGI

DirectX Graphics Infrastructure, DirectX 图形基础设施

d3d12_factory: *IDXGIFactory4;  // DXGI 的关键接口之一
d3d12_adapter: *IDXGIAdapter1;  // 硬件设备,例如独立显卡

init_backend :: () -> bool {...}
deinit_backend :: () {...}

Device

首先创建一个设备

d3d12_device    : *ID3D12Device;
d3d12_queue     : *ID3D12CommandQueue;
d3d12_info_queue: *ID3D12InfoQueue;
d3d12_queue_wi_fence: *ID3D12Fence;
d3d12_queue_wi_event: *void;

init_device :: () -> bool {...}
deinit_debvice :: () {...}

Render Context

VSYNC :: false;
MAX_SWAPCHAIN_BUFFER_COUNT :: 3;

d3d12_swapchain    : *IDXGISwapChain3;
d3d12_rtvs         : [MAX_SWAPCHAIN_BUFFER_COUNT] *ID3D12Resource;
d3d12_rtv_heap     : *ID3D12DescriptorHeap;
d3d12_rtv_heap_inc_size: u32;
d3d12_present_fence: *ID3D12Fence;
d3d12_present_event: *void;

ctx_buffer_count       : u32;  // use this to get actual count.
ctx_active_buffer_index: u32;
ctx_present_counter    : u64;

init_render_context :: () -> bool {...}
deinit_render_context :: () {...}
render_context_present :: () {...}

Pipeline

d3d12_root_signature: *ID3D12RootSignature;
d3d12_pipeline_state: *ID3D12PipelineState;

init_pipeline :: () -> bool {...}
deinit_pipieline :: () {...}

Command Encoder

d3d12_command_allocator: *ID3D12CommandAllocator;
d3d12_command_lists    : [FRAME_COUNT] *ID3D12GraphicsCommandList;
d3d12_submit_fence     : *ID3D12Fence;
d3d12_submit_event     : *void;

active_frame_index: u32; 
submit_counter    : u64;

init_command_encoder :: () -> bool {...}
deinit_command_encoder :: () {...}

GOAL