gpu pass -> dispatch

This commit is contained in:
jacob 2025-06-03 15:10:25 -05:00
parent fae10387cd
commit f3ca533817
4 changed files with 141 additions and 179 deletions

View File

@ -83,5 +83,5 @@
/* TODO: Move these to user-configurable settings */ /* TODO: Move these to user-configurable settings */
#define AUDIO_ENABLED 0 #define AUDIO_ENABLED 0
#define VSYNC_ENABLED 1 #define VSYNC_ENABLED 0
#define USER_FPS_LIMIT 300 #define USER_FPS_LIMIT 300

View File

@ -111,29 +111,29 @@ void gpu_push_cmd(struct gpu_cmd_store gpu_cmd_store, struct gpu_cmd_params para
void gpu_submit_cmds(struct gpu_cmd_store gpu_cmd_store); void gpu_submit_cmds(struct gpu_cmd_store gpu_cmd_store);
/* ========================== * /* ========================== *
* Pass * Dispatch
* ========================== */ * ========================== */
struct gpu_pass_cmds_array { struct gpu_dispatch_cmds_array {
u64 count; u64 count;
struct gpu_cmd_store **cmds; struct gpu_cmd_store **cmds;
}; };
struct gpu_pass_params { struct gpu_dispatch_params {
struct gpu_pass_cmds_array cmds_array; struct gpu_dispatch_cmds_array cmds_array;
struct gpu_texture draw_target; struct gpu_texture draw_target;
struct rect draw_target_viewport; struct rect draw_target_viewport;
}; };
struct gpu_pass_state { struct gpu_dispatch_state {
u64 handle; u64 handle;
}; };
struct gpu_pass_state gpu_pass_state_alloc(void); struct gpu_dispatch_state gpu_dispatch_state_alloc(void);
void gpu_pass_state_release(struct gpu_pass_state gpu_pass_state); void gpu_dispatch_state_release(struct gpu_dispatch_state gpu_dispatch_state);
void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params params); void gpu_dispatch(struct gpu_dispatch_state gpu_dispatch_state, struct gpu_dispatch_params params);
/* ========================== * /* ========================== *
* Backbuffer * Backbuffer

View File

@ -28,7 +28,7 @@
/* FIXME: Enable this and resolve unreleased references */ /* FIXME: Enable this and resolve unreleased references */
#if RTC #if RTC
# define DX11_DEBUG 1 # define DX11_DEBUG 0
# define DX11_SHADER_DEBUG 1 # define DX11_SHADER_DEBUG 1
#else #else
# define DX11_DEBUG 0 # define DX11_DEBUG 0
@ -63,9 +63,11 @@ struct dx11_shader {
ID3D11PixelShader *ps; ID3D11PixelShader *ps;
}; };
struct dx11_pass_state { struct dx11_dispatch_state {
struct dx11_texture *albedo; struct dx11_texture *albedo;
struct dx11_pass_state *next_free; struct dx11_buffer *constant_buffer;
struct dx11_dispatch_state *next_free;
}; };
struct dx11_buffer { struct dx11_buffer {
@ -142,7 +144,6 @@ struct dx11_cmd_store {
struct dx11_cmd *gpu_last_cmd; struct dx11_cmd *gpu_last_cmd;
struct { struct {
struct dx11_buffer *constant_buffer;
struct { struct {
struct dx11_buffer *vertex_buffer; struct dx11_buffer *vertex_buffer;
struct dx11_buffer *index_buffer; struct dx11_buffer *index_buffer;
@ -219,10 +220,10 @@ GLOBAL struct {
struct arena cmd_stores_arena; struct arena cmd_stores_arena;
struct dx11_cmd_store *first_free_cmd_store; struct dx11_cmd_store *first_free_cmd_store;
/* Pass state pool */ /* Dispatch state pool */
struct sys_mutex pass_states_mutex; struct sys_mutex dispatch_states_mutex;
struct arena pass_states_arena; struct arena dispatch_states_arena;
struct dx11_pass_state *first_free_pass_state; struct dx11_dispatch_state *first_free_dispatch_state;
/* Texture pool */ /* Texture pool */
struct sys_mutex textures_mutex; struct sys_mutex textures_mutex;
@ -277,9 +278,9 @@ struct gpu_startup_receipt gpu_startup(struct sys_window *window)
G.cmd_stores_mutex = sys_mutex_alloc(); G.cmd_stores_mutex = sys_mutex_alloc();
G.cmd_stores_arena = arena_alloc(GIGABYTE(64)); G.cmd_stores_arena = arena_alloc(GIGABYTE(64));
/* Initialize pass state pool */ /* Initialize dispatch state pool */
G.pass_states_mutex = sys_mutex_alloc(); G.dispatch_states_mutex = sys_mutex_alloc();
G.pass_states_arena = arena_alloc(GIGABYTE(64)); G.dispatch_states_arena = arena_alloc(GIGABYTE(64));
/* Initialize texture pool */ /* Initialize texture pool */
G.textures_mutex = sys_mutex_alloc(); G.textures_mutex = sys_mutex_alloc();
@ -1259,12 +1260,7 @@ struct gpu_cmd_store gpu_cmd_store_alloc(void)
arena_reset(&store->gpu_cmds_arena); arena_reset(&store->gpu_cmds_arena);
} }
/* Desc templates */ /* Desc template */
const D3D11_BUFFER_DESC constant_buffer_desc = {
.Usage = D3D11_USAGE_DYNAMIC,
.BindFlags = D3D11_BIND_CONSTANT_BUFFER,
.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE
};
const D3D11_BUFFER_DESC structured_buffer_desc = { const D3D11_BUFFER_DESC structured_buffer_desc = {
.Usage = D3D11_USAGE_DYNAMIC, .Usage = D3D11_USAGE_DYNAMIC,
.BindFlags = D3D11_BIND_SHADER_RESOURCE, .BindFlags = D3D11_BIND_SHADER_RESOURCE,
@ -1274,11 +1270,6 @@ struct gpu_cmd_store gpu_cmd_store_alloc(void)
/* Allocate buffers */ /* Allocate buffers */
{ {
/* Constant buffer */
{
store->buffers.constant_buffer = dx11_buffer_alloc(constant_buffer_desc, NULL);
}
/* Mesh buffers */ /* Mesh buffers */
{ {
D3D11_BUFFER_DESC vdesc = ZI; D3D11_BUFFER_DESC vdesc = ZI;
@ -1524,21 +1515,21 @@ void gpu_submit_cmds(struct gpu_cmd_store gpu_cmd_store)
} }
/* ========================== * /* ========================== *
* Pass state * Dispatch state
* ========================== */ * ========================== */
struct gpu_pass_state gpu_pass_state_alloc(void) struct gpu_dispatch_state gpu_dispatch_state_alloc(void)
{ {
__prof; __prof;
struct dx11_pass_state *state = NULL; struct dx11_dispatch_state *state = NULL;
{ {
{ {
struct sys_lock lock = sys_mutex_lock_e(&G.pass_states_mutex); struct sys_lock lock = sys_mutex_lock_e(&G.dispatch_states_mutex);
if (G.first_free_pass_state) { if (G.first_free_dispatch_state) {
state = G.first_free_pass_state; state = G.first_free_dispatch_state;
G.first_free_pass_state = state->next_free; G.first_free_dispatch_state = state->next_free;
} else { } else {
state = arena_push_no_zero(&G.pass_states_arena, struct dx11_pass_state); state = arena_push_no_zero(&G.dispatch_states_arena, struct dx11_dispatch_state);
} }
sys_mutex_unlock(&lock); sys_mutex_unlock(&lock);
} }
@ -1546,21 +1537,21 @@ struct gpu_pass_state gpu_pass_state_alloc(void)
} }
struct gpu_pass_state res = ZI; struct gpu_dispatch_state res = ZI;
res.handle = (u64)state; res.handle = (u64)state;
return res; return res;
} }
void gpu_pass_state_release(struct gpu_pass_state gpu_pass_state) void gpu_dispatch_state_release(struct gpu_dispatch_state gpu_dispatch_state)
{ {
/* TODO */ /* TODO */
__prof; __prof;
ASSERT(false); ASSERT(false);
(UNUSED)gpu_pass_state; (UNUSED)gpu_dispatch_state;
} }
/* ========================== * /* ========================== *
* Pass * Dispatch
* ========================== */ * ========================== */
enum dx11_unbind_flags { enum dx11_unbind_flags {
@ -1629,13 +1620,13 @@ INTERNAL void dx11_unbind(u32 flags)
} }
} }
/* TODO: Lock resources during pass */ /* TODO: Lock resources during dispatch */
void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params params) void gpu_dispatch(struct gpu_dispatch_state gpu_dispatch_state, struct gpu_dispatch_params params)
{ {
__prof; __prof;
__profscope_dx11(G.profiling_ctx, Run pass, RGB_F(0.5, 0.2, 0.2)); __profscope_dx11(G.profiling_ctx, Dispatch, RGB_F(0.5, 0.2, 0.2));
struct sprite_scope *sprite_scope = sprite_scope_begin(); struct sprite_scope *sprite_scope = sprite_scope_begin();
struct dx11_pass_state *state = (struct dx11_pass_state *)gpu_pass_state.handle; struct dx11_dispatch_state *state = (struct dx11_dispatch_state *)gpu_dispatch_state.handle;
struct rect viewport = params.draw_target_viewport; struct rect viewport = params.draw_target_viewport;
@ -1649,99 +1640,21 @@ void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params p
d3d11_viewport.TopLeftY = viewport.y; d3d11_viewport.TopLeftY = viewport.y;
ID3D11DeviceContext_RSSetViewports(G.devcon, 1, &d3d11_viewport); ID3D11DeviceContext_RSSetViewports(G.devcon, 1, &d3d11_viewport);
struct mat4x4 vp_matrix = calculate_vp(XFORM_IDENT, viewport.width, viewport.height);
#if 0
/* GI pass */
{
__profscope(GI pass);
__profscope_dx11(G.profiling_ctx, GI pass, RGB_F(0.5, 0.5, 0.5));
for (u64 cmd_stores_array_index = 0; cmd_stores_array_index < params.cmds_array.count; ++cmd_stores_array_index) {
struct dx11_cmd_store *store = (struct dx11_cmd_store *)params.cmds_array.cmds[cmd_stores_array_index]->handle;
for (struct dx11_cmd *cmd = store->gpu_first_cmd; cmd; cmd = cmd->next) {
enum gpu_cmd_kind cmd_kind = cmd->kind;
switch (cmd_kind) {
default: break;
case GPU_CMD_KIND_DRAW_VIEW:
{
__profscope(Set draw view);
vp_matrix = calculate_vp(cmd->view.xf, viewport.width, viewport.height);
} break;
case GPU_CMD_KIND_DRAW_TEXTURE:
{
__profscope(Draw texture emittance);
__profscope_dx11(G.profiling_ctx, Draw texture emittance, RGB_F(0.2, 0.5, 0.2));
struct dx11_shader *shader = &G.shaders[DX11_SHADER_KIND_TEXTURE];
if (shader->valid) {
struct dx11_texture *texture = NULL;
if (cmd->texture.texture.handle) {
/* Load texture if handle is set */
texture = (struct dx11_texture *)cmd->texture.texture.handle;
} else if (cmd->texture.sprite.hash) {
/* Otherwise load sprite */
struct sprite_texture *sprite_texture = sprite_texture_from_tag_async(sprite_scope, cmd->texture.sprite);
if (sprite_texture->loaded) {
texture = (struct dx11_texture *)sprite_texture->texture.handle;
}
}
if (texture && texture->srv && shader->valid) {
struct dx11_buffer *constant_buffer = store->buffers.constant_buffer;
struct dx11_buffer *instance_buffer = store->buffers.texture.instance_buffer;
u32 instance_offset = cmd->texture.instance_offset;
u32 instance_count = cmd->texture.instance_count;
/* Bind shader */
ID3D11DeviceContext_VSSetShader(G.devcon, shader->vs, 0, 0);
ID3D11DeviceContext_PSSetShader(G.devcon, shader->ps, 0, 0);
/* Fill & bind constant buffer */
{
struct dx11_texture_uniform *uniform = dx11_buffer_push(constant_buffer, sizeof(struct dx11_texture_uniform));
uniform->vp = vp_matrix;
uniform->instance_offset = instance_offset;
dx11_buffer_submit(constant_buffer);
}
ID3D11DeviceContext_VSSetConstantBuffers(G.devcon, 0, 1, &constant_buffer->gpu_buffer);
ID3D11DeviceContext_PSSetConstantBuffers(G.devcon, 0, 1, &constant_buffer->gpu_buffer);
/* Bind dummy vertex buffer */
u32 zero = 0;
ID3D11DeviceContext_IASetVertexBuffers(G.devcon, 0, 1, &G.dummy_vertex_buffer->gpu_buffer, &zero, &zero);
ID3D11DeviceContext_IASetIndexBuffer(G.devcon, G.quad_index_buffer->gpu_buffer, DXGI_FORMAT_R16_UINT, zero);
/* Bind instance buffer */
ID3D11DeviceContext_VSSetShaderResources(G.devcon, 0, 1, &instance_buffer->srv);
ID3D11DeviceContext_PSSetShaderResources(G.devcon, 0, 1, &instance_buffer->srv);
/* Bind texture */
ID3D11DeviceContext_VSSetShaderResources(G.devcon, 1, 1, &texture->srv);
ID3D11DeviceContext_PSSetShaderResources(G.devcon, 1, 1, &texture->srv);
/* Bind RTV */
ID3D11DeviceContext_OMSetRenderTargets(G.devcon, 1, &draw_target->rtv, NULL);
/* Draw */
ID3D11DeviceContext_IASetPrimitiveTopology(G.devcon, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
ID3D11DeviceContext_DrawIndexedInstanced(G.devcon, 6, instance_count, 0, 0, 0);
/* Unbind */
dx11_unbind(DX11_UNBIND_VS | DX11_UNBIND_PS | DX11_UNBIND_CBUFF | DX11_UNBIND_VBUFF | DX11_UNBIND_IBUFF | DX11_UNBIND_SRV | DX11_UNBIND_RTV);
}
}
} break;
}
}
}
}
#endif
struct dx11_texture *final_tex = (struct dx11_texture *)params.draw_target.handle; struct dx11_texture *final_tex = (struct dx11_texture *)params.draw_target.handle;
struct v2i32 final_tex_size = final_tex->size; struct v2i32 final_tex_size = final_tex->size;
/* Allocate constant buffer */
struct dx11_buffer *constant_buffer = state->constant_buffer;
if (!constant_buffer) {
const D3D11_BUFFER_DESC desc = {
.Usage = D3D11_USAGE_DYNAMIC,
.BindFlags = D3D11_BIND_CONSTANT_BUFFER,
.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE
};
constant_buffer = dx11_buffer_alloc(desc, NULL);
state->constant_buffer = constant_buffer;
}
/* Allocate / resize albedo */ /* Allocate / resize albedo */
struct dx11_texture *albedo_tex = state->albedo; struct dx11_texture *albedo_tex = state->albedo;
if (!albedo_tex || !v2i32_eq(albedo_tex->size, final_tex->size)) { if (!albedo_tex || !v2i32_eq(albedo_tex->size, final_tex->size)) {
@ -1753,6 +1666,7 @@ void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params p
} }
/* Regular pass */ /* Regular pass */
struct mat4x4 vp_matrix = calculate_vp(XFORM_IDENT, viewport.width, viewport.height);
{ {
__profscope(Regular pass); __profscope(Regular pass);
__profscope_dx11(G.profiling_ctx, Regular pass, RGB_F(0.2, 0.5, 0.5)); __profscope_dx11(G.profiling_ctx, Regular pass, RGB_F(0.2, 0.5, 0.5));
@ -1780,7 +1694,6 @@ void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params p
__profscope_dx11(G.profiling_ctx, Draw mesh, RGB_F(0.5, 0.2, 0.2)); __profscope_dx11(G.profiling_ctx, Draw mesh, RGB_F(0.5, 0.2, 0.2));
struct dx11_shader *shader = &G.shaders[DX11_SHADER_KIND_MESH]; struct dx11_shader *shader = &G.shaders[DX11_SHADER_KIND_MESH];
if (shader->valid) { if (shader->valid) {
struct dx11_buffer *constant_buffer = store->buffers.constant_buffer;
struct dx11_buffer *vertex_buffer = store->buffers.mesh.vertex_buffer; struct dx11_buffer *vertex_buffer = store->buffers.mesh.vertex_buffer;
struct dx11_buffer *index_buffer = store->buffers.mesh.index_buffer; struct dx11_buffer *index_buffer = store->buffers.mesh.index_buffer;
@ -1791,8 +1704,6 @@ void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params p
/* Bind shader */ /* Bind shader */
ID3D11DeviceContext_VSSetShader(G.devcon, shader->vs, 0, 0); ID3D11DeviceContext_VSSetShader(G.devcon, shader->vs, 0, 0);
ID3D11DeviceContext_PSSetShader(G.devcon, shader->ps, 0, 0); ID3D11DeviceContext_PSSetShader(G.devcon, shader->ps, 0, 0);
/* Bind input layout */
ID3D11DeviceContext_IASetInputLayout(G.devcon, shader->input_layout); ID3D11DeviceContext_IASetInputLayout(G.devcon, shader->input_layout);
/* Fill & bind constant buffer */ /* Fill & bind constant buffer */
@ -1810,8 +1721,9 @@ void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params p
ID3D11DeviceContext_IASetVertexBuffers(G.devcon, 0, 1, &vertex_buffer->gpu_buffer, &stride, &zero); ID3D11DeviceContext_IASetVertexBuffers(G.devcon, 0, 1, &vertex_buffer->gpu_buffer, &stride, &zero);
ID3D11DeviceContext_IASetIndexBuffer(G.devcon, index_buffer->gpu_buffer, DXGI_FORMAT_R16_UINT, zero); ID3D11DeviceContext_IASetIndexBuffer(G.devcon, index_buffer->gpu_buffer, DXGI_FORMAT_R16_UINT, zero);
/* Bind RTV */ /* Bind RTVs */
ID3D11DeviceContext_OMSetRenderTargets(G.devcon, 1, &final_tex->rtv, NULL); ID3D11RenderTargetView *rtvs[] = { final_tex->rtv };
ID3D11DeviceContext_OMSetRenderTargets(G.devcon, ARRAY_COUNT(rtvs), rtvs, NULL);
/* Draw */ /* Draw */
ID3D11DeviceContext_IASetPrimitiveTopology(G.devcon, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); ID3D11DeviceContext_IASetPrimitiveTopology(G.devcon, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
@ -1840,8 +1752,7 @@ void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params p
} }
} }
if (texture && texture->srv && shader->valid) { if (texture && texture->srv) {
struct dx11_buffer *constant_buffer = store->buffers.constant_buffer;
struct dx11_buffer *instance_buffer = store->buffers.texture.instance_buffer; struct dx11_buffer *instance_buffer = store->buffers.texture.instance_buffer;
u32 instance_offset = cmd->texture.instance_offset; u32 instance_offset = cmd->texture.instance_offset;
u32 instance_count = cmd->texture.instance_count; u32 instance_count = cmd->texture.instance_count;
@ -1865,16 +1776,14 @@ void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params p
ID3D11DeviceContext_IASetVertexBuffers(G.devcon, 0, 1, &G.dummy_vertex_buffer->gpu_buffer, &zero, &zero); ID3D11DeviceContext_IASetVertexBuffers(G.devcon, 0, 1, &G.dummy_vertex_buffer->gpu_buffer, &zero, &zero);
ID3D11DeviceContext_IASetIndexBuffer(G.devcon, G.quad_index_buffer->gpu_buffer, DXGI_FORMAT_R16_UINT, zero); ID3D11DeviceContext_IASetIndexBuffer(G.devcon, G.quad_index_buffer->gpu_buffer, DXGI_FORMAT_R16_UINT, zero);
/* Bind instance buffer */ /* Bind SRVs */
ID3D11DeviceContext_VSSetShaderResources(G.devcon, 0, 1, &instance_buffer->srv); ID3D11ShaderResourceView *srvs[] = { instance_buffer->srv, texture->srv };
ID3D11DeviceContext_PSSetShaderResources(G.devcon, 0, 1, &instance_buffer->srv); ID3D11DeviceContext_VSSetShaderResources(G.devcon, 0, ARRAY_COUNT(srvs), srvs);
ID3D11DeviceContext_PSSetShaderResources(G.devcon, 0, ARRAY_COUNT(srvs), srvs);
/* Bind texture */ /* Bind RTVs */
ID3D11DeviceContext_VSSetShaderResources(G.devcon, 1, 1, &texture->srv); ID3D11RenderTargetView *rtvs[] = { final_tex->rtv };
ID3D11DeviceContext_PSSetShaderResources(G.devcon, 1, 1, &texture->srv); ID3D11DeviceContext_OMSetRenderTargets(G.devcon, ARRAY_COUNT(rtvs), rtvs, NULL);
/* Bind RTV */
ID3D11DeviceContext_OMSetRenderTargets(G.devcon, 1, &final_tex->rtv, NULL);
/* Draw */ /* Draw */
ID3D11DeviceContext_IASetPrimitiveTopology(G.devcon, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); ID3D11DeviceContext_IASetPrimitiveTopology(G.devcon, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
@ -1892,7 +1801,6 @@ void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params p
__profscope_dx11(G.profiling_ctx, Draw grid, RGB_F(0.2, 0.2, 0.5)); __profscope_dx11(G.profiling_ctx, Draw grid, RGB_F(0.2, 0.2, 0.5));
struct dx11_shader *shader = &G.shaders[DX11_SHADER_KIND_GRID]; struct dx11_shader *shader = &G.shaders[DX11_SHADER_KIND_GRID];
if (shader->valid) { if (shader->valid) {
struct dx11_buffer *constant_buffer = store->buffers.constant_buffer;
struct dx11_buffer *instance_buffer = store->buffers.grid.instance_buffer; struct dx11_buffer *instance_buffer = store->buffers.grid.instance_buffer;
u32 instance_offset = cmd->grid.instance_offset; u32 instance_offset = cmd->grid.instance_offset;
u32 instance_count = cmd->grid.instance_count; u32 instance_count = cmd->grid.instance_count;
@ -1916,12 +1824,14 @@ void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params p
ID3D11DeviceContext_IASetVertexBuffers(G.devcon, 0, 1, &G.dummy_vertex_buffer->gpu_buffer, &zero, &zero); ID3D11DeviceContext_IASetVertexBuffers(G.devcon, 0, 1, &G.dummy_vertex_buffer->gpu_buffer, &zero, &zero);
ID3D11DeviceContext_IASetIndexBuffer(G.devcon, G.quad_index_buffer->gpu_buffer, DXGI_FORMAT_R16_UINT, zero); ID3D11DeviceContext_IASetIndexBuffer(G.devcon, G.quad_index_buffer->gpu_buffer, DXGI_FORMAT_R16_UINT, zero);
/* Bind instance buffer */ /* Bind SRVs */
ID3D11DeviceContext_VSSetShaderResources(G.devcon, 0, 1, &instance_buffer->srv); ID3D11ShaderResourceView *srvs[] = { instance_buffer->srv };
ID3D11DeviceContext_PSSetShaderResources(G.devcon, 0, 1, &instance_buffer->srv); ID3D11DeviceContext_VSSetShaderResources(G.devcon, 0, ARRAY_COUNT(srvs), srvs);
ID3D11DeviceContext_PSSetShaderResources(G.devcon, 0, ARRAY_COUNT(srvs), srvs);
/* Bind RTV */ /* Bind RTVs */
ID3D11DeviceContext_OMSetRenderTargets(G.devcon, 1, &final_tex->rtv, NULL); ID3D11RenderTargetView *rtvs[] = { final_tex->rtv };
ID3D11DeviceContext_OMSetRenderTargets(G.devcon, ARRAY_COUNT(rtvs), rtvs, NULL);
/* Draw */ /* Draw */
ID3D11DeviceContext_IASetPrimitiveTopology(G.devcon, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); ID3D11DeviceContext_IASetPrimitiveTopology(G.devcon, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
@ -1938,7 +1848,6 @@ void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params p
__profscope_dx11(G.profiling_ctx, Test, RGB_F(1, 0.2, 1)); __profscope_dx11(G.profiling_ctx, Test, RGB_F(1, 0.2, 1));
struct dx11_shader *shader = &G.shaders[DX11_SHADER_KIND_TEST]; struct dx11_shader *shader = &G.shaders[DX11_SHADER_KIND_TEST];
if (shader->valid) { if (shader->valid) {
struct dx11_buffer *constant_buffer = store->buffers.constant_buffer;
struct dx11_buffer *instance_buffer = store->buffers.test.instance_buffer; struct dx11_buffer *instance_buffer = store->buffers.test.instance_buffer;
u32 instance_offset = cmd->test.instance_offset; u32 instance_offset = cmd->test.instance_offset;
u32 instance_count = cmd->test.instance_count; u32 instance_count = cmd->test.instance_count;
@ -1962,12 +1871,14 @@ void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params p
ID3D11DeviceContext_IASetVertexBuffers(G.devcon, 0, 1, &G.dummy_vertex_buffer->gpu_buffer, &zero, &zero); ID3D11DeviceContext_IASetVertexBuffers(G.devcon, 0, 1, &G.dummy_vertex_buffer->gpu_buffer, &zero, &zero);
ID3D11DeviceContext_IASetIndexBuffer(G.devcon, G.quad_index_buffer->gpu_buffer, DXGI_FORMAT_R16_UINT, zero); ID3D11DeviceContext_IASetIndexBuffer(G.devcon, G.quad_index_buffer->gpu_buffer, DXGI_FORMAT_R16_UINT, zero);
/* Bind instance buffer */ /* Bind SRVs */
ID3D11DeviceContext_VSSetShaderResources(G.devcon, 0, 1, &instance_buffer->srv); ID3D11ShaderResourceView *srvs[] = { instance_buffer->srv };
ID3D11DeviceContext_PSSetShaderResources(G.devcon, 0, 1, &instance_buffer->srv); ID3D11DeviceContext_VSSetShaderResources(G.devcon, 0, ARRAY_COUNT(srvs), srvs);
ID3D11DeviceContext_PSSetShaderResources(G.devcon, 0, ARRAY_COUNT(srvs), srvs);
/* Bind RTV */ /* Bind RTVs */
ID3D11DeviceContext_OMSetRenderTargets(G.devcon, 1, &final_tex->rtv, NULL); ID3D11RenderTargetView *rtvs[] = { final_tex->rtv };
ID3D11DeviceContext_OMSetRenderTargets(G.devcon, ARRAY_COUNT(rtvs), rtvs, NULL);
/* Draw */ /* Draw */
ID3D11DeviceContext_IASetPrimitiveTopology(G.devcon, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); ID3D11DeviceContext_IASetPrimitiveTopology(G.devcon, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
@ -1982,6 +1893,57 @@ void gpu_run_pass(struct gpu_pass_state gpu_pass_state, struct gpu_pass_params p
} }
} }
/* Finalize */
#if 0
vp_matrix = calculate_vp(XFORM_IDENT, viewport.width, viewport.height);
{
__profscope(Finalize);
__profscope_dx11(G.profiling_ctx, Finalize, RGB_F(0.5, 0.2, 0.5));
struct dx11_shader *shader = &G.shaders[DX11_SHADER_KIND_TEXTURE];
if (shader->valid) {
struct dx11_texture *texture = NULL;
struct dx11_buffer *instance_buffer = store->buffers.texture.instance_buffer;
u32 instance_offset = cmd->texture.instance_offset;
u32 instance_count = cmd->texture.instance_count;
/* Bind shader */
ID3D11DeviceContext_VSSetShader(G.devcon, shader->vs, 0, 0);
ID3D11DeviceContext_PSSetShader(G.devcon, shader->ps, 0, 0);
/* Fill & bind constant buffer */
{
struct dx11_texture_uniform *uniform = dx11_buffer_push(constant_buffer, sizeof(struct dx11_texture_uniform));
uniform->vp = vp_matrix;
uniform->instance_offset = instance_offset;
dx11_buffer_submit(constant_buffer);
}
ID3D11DeviceContext_VSSetConstantBuffers(G.devcon, 0, 1, &constant_buffer->gpu_buffer);
ID3D11DeviceContext_PSSetConstantBuffers(G.devcon, 0, 1, &constant_buffer->gpu_buffer);
/* Bind dummy vertex buffer */
u32 zero = 0;
ID3D11DeviceContext_IASetVertexBuffers(G.devcon, 0, 1, &G.dummy_vertex_buffer->gpu_buffer, &zero, &zero);
ID3D11DeviceContext_IASetIndexBuffer(G.devcon, G.quad_index_buffer->gpu_buffer, DXGI_FORMAT_R16_UINT, zero);
/* Bind SRVs */
ID3D11ShaderResourceView *srvs[] = { instance_buffer->srv, texture->srv };
ID3D11DeviceContext_VSSetShaderResources(G.devcon, 0, ARRAY_COUNT(srvs), srvs);
ID3D11DeviceContext_PSSetShaderResources(G.devcon, 0, ARRAY_COUNT(srvs), srvs);
/* Bind RTVs */
ID3D11RenderTargetView *rtvs[] = { final_tex->rtv };
ID3D11DeviceContext_OMSetRenderTargets(G.devcon, ARRAY_COUNT(rtvs), rtvs, NULL);
/* Draw */
ID3D11DeviceContext_IASetPrimitiveTopology(G.devcon, D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
ID3D11DeviceContext_DrawIndexedInstanced(G.devcon, 6, instance_count, 0, 0, 0);
/* Unbind */
dx11_unbind(DX11_UNBIND_VS | DX11_UNBIND_PS | DX11_UNBIND_CBUFF | DX11_UNBIND_VBUFF | DX11_UNBIND_IBUFF | DX11_UNBIND_SRV | DX11_UNBIND_RTV);
}
#endif
sprite_scope_end(sprite_scope); sprite_scope_end(sprite_scope);
} }

View File

@ -78,8 +78,8 @@ GLOBAL struct {
struct gpu_cmd_store user_gpu_cmd_store; struct gpu_cmd_store user_gpu_cmd_store;
struct gpu_cmd_store backbuffer_gpu_cmd_store; struct gpu_cmd_store backbuffer_gpu_cmd_store;
struct gpu_pass_state user_pass_state; struct gpu_dispatch_state user_dispatch_state;
struct gpu_pass_state backbuffer_pass_state; struct gpu_dispatch_state backbuffer_dispatch_state;
struct xform world_to_user_xf; struct xform world_to_user_xf;
@ -261,8 +261,8 @@ struct user_startup_receipt user_startup(struct work_startup_receipt *work_sr,
G.world_gpu_cmd_store = gpu_cmd_store_alloc(); G.world_gpu_cmd_store = gpu_cmd_store_alloc();
G.user_gpu_cmd_store = gpu_cmd_store_alloc(); G.user_gpu_cmd_store = gpu_cmd_store_alloc();
G.backbuffer_gpu_cmd_store = gpu_cmd_store_alloc(); G.backbuffer_gpu_cmd_store = gpu_cmd_store_alloc();
G.user_pass_state = gpu_pass_state_alloc(); G.user_dispatch_state = gpu_dispatch_state_alloc();
G.backbuffer_pass_state = gpu_pass_state_alloc(); G.backbuffer_dispatch_state = gpu_dispatch_state_alloc();
//log_register_callback(debug_console_log_callback, LOG_LEVEL_SUCCESS); //log_register_callback(debug_console_log_callback, LOG_LEVEL_SUCCESS);
log_register_callback(debug_console_log_callback, LOG_LEVEL_DEBUG); log_register_callback(debug_console_log_callback, LOG_LEVEL_DEBUG);
@ -2116,24 +2116,24 @@ INTERNAL void user_update(void)
/* Render to user texture */ /* Render to user texture */
{ {
struct gpu_cmd_store *pass_cmds[] = { &G.world_gpu_cmd_store, &G.user_gpu_cmd_store }; struct gpu_cmd_store *dispatch_cmds[] = { &G.world_gpu_cmd_store, &G.user_gpu_cmd_store };
struct gpu_pass_params params = ZI; struct gpu_dispatch_params params = ZI;
params.cmds_array.cmds = pass_cmds; params.cmds_array.cmds = dispatch_cmds;
params.cmds_array.count = ARRAY_COUNT(pass_cmds); params.cmds_array.count = ARRAY_COUNT(dispatch_cmds);
params.draw_target = G.user_texture; params.draw_target = G.user_texture;
params.draw_target_viewport = user_viewport; params.draw_target_viewport = user_viewport;
gpu_run_pass(G.user_pass_state, params); gpu_dispatch(G.user_dispatch_state, params);
} }
/* Render to backbuffer texture */ /* Render to backbuffer texture */
{ {
struct gpu_cmd_store *pass_cmds[] = { &G.backbuffer_gpu_cmd_store }; struct gpu_cmd_store *dispatch_cmds[] = { &G.backbuffer_gpu_cmd_store };
struct gpu_pass_params params = ZI; struct gpu_dispatch_params params = ZI;
params.cmds_array.cmds = pass_cmds; params.cmds_array.cmds = dispatch_cmds;
params.cmds_array.count = ARRAY_COUNT(pass_cmds); params.cmds_array.count = ARRAY_COUNT(dispatch_cmds);
params.draw_target = G.backbuffer_texture; params.draw_target = G.backbuffer_texture;
params.draw_target_viewport = backbuffer_viewport; params.draw_target_viewport = backbuffer_viewport;
gpu_run_pass(G.backbuffer_pass_state, params); gpu_dispatch(G.backbuffer_dispatch_state, params);
} }
/* Swap backbuffer */ /* Swap backbuffer */