clear render target
This commit is contained in:
parent
878ff5cba5
commit
7a4554ba99
@ -17,7 +17,7 @@
|
|||||||
|
|
||||||
cbuffer cb : register(b0) { struct sh_material_constants g_constants; };
|
cbuffer cb : register(b0) { struct sh_material_constants g_constants; };
|
||||||
StructuredBuffer<struct sh_material_instance> g_instances : register(t0);
|
StructuredBuffer<struct sh_material_instance> g_instances : register(t0);
|
||||||
Texture2D g_textures[] : register(t1);
|
Texture2D g_nuri_textures[] : register(t1);
|
||||||
SamplerState g_sampler : register(s0);
|
SamplerState g_sampler : register(s0);
|
||||||
|
|
||||||
/* ========================== *
|
/* ========================== *
|
||||||
@ -45,7 +45,7 @@ SH_ENTRY(ROOTSIG) struct vs_output vs(struct vs_input input)
|
|||||||
float2(-0.5f, 0.5f)
|
float2(-0.5f, 0.5f)
|
||||||
};
|
};
|
||||||
|
|
||||||
struct sh_material_instance instance = g_instances[g_constants.instance_offset + input.SV_InstanceID];
|
struct sh_material_instance instance = g_instances[input.SV_InstanceID];
|
||||||
float2 vert = unit_quad_verts[input.SV_VertexID];
|
float2 vert = unit_quad_verts[input.SV_VertexID];
|
||||||
float2 world_pos = mul(instance.xf, float3(vert, 1)).xy;
|
float2 world_pos = mul(instance.xf, float3(vert, 1)).xy;
|
||||||
|
|
||||||
@ -72,6 +72,6 @@ struct ps_output {
|
|||||||
SH_ENTRY(ROOTSIG) struct ps_output ps(struct ps_input input)
|
SH_ENTRY(ROOTSIG) struct ps_output ps(struct ps_input input)
|
||||||
{
|
{
|
||||||
struct ps_output output;
|
struct ps_output output;
|
||||||
output.SV_Target = g_textures[NURI(input.vs.texture_nuri)].Sample(g_sampler, input.vs.uv) * input.vs.tint_lin;
|
output.SV_Target = g_nuri_textures[NURI(input.vs.texture_nuri)].Sample(g_sampler, input.vs.uv) * input.vs.tint_lin;
|
||||||
return output;
|
return output;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -1,9 +1,5 @@
|
|||||||
#if SH_CPU
|
#if SH_CPU
|
||||||
|
|
||||||
/* ========================== *
|
|
||||||
* CPU
|
|
||||||
* ========================== */
|
|
||||||
|
|
||||||
#define SH_STRUCT(s) PACK(struct s)
|
#define SH_STRUCT(s) PACK(struct s)
|
||||||
#define SH_DECL(t, n) struct CAT(sh_, t) n
|
#define SH_DECL(t, n) struct CAT(sh_, t) n
|
||||||
#define SH_ENTRY(rootsig) static
|
#define SH_ENTRY(rootsig) static
|
||||||
@ -46,13 +42,9 @@ INLINE struct sh_float2x3 sh_float2x3_from_xform(struct xform v)
|
|||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
||||||
/* ========================== *
|
|
||||||
* GPU
|
|
||||||
* ========================== */
|
|
||||||
|
|
||||||
#define SH_STRUCT(s) struct s
|
#define SH_STRUCT(s) struct s
|
||||||
#define SH_DECL(t, n) t n
|
#define SH_DECL(t, n) t n
|
||||||
# define SH_ENTRY(rootsig) [RootSignature(rootsig)]
|
#define SH_ENTRY(rootsig) [RootSignature(rootsig)]
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -62,7 +54,6 @@ INLINE struct sh_float2x3 sh_float2x3_from_xform(struct xform v)
|
|||||||
|
|
||||||
SH_STRUCT(sh_material_constants {
|
SH_STRUCT(sh_material_constants {
|
||||||
SH_DECL(float4x4, projection);
|
SH_DECL(float4x4, projection);
|
||||||
SH_DECL(uint, instance_offset);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
SH_STRUCT(sh_material_instance {
|
SH_STRUCT(sh_material_instance {
|
||||||
|
|||||||
7
src/gp.h
7
src/gp.h
@ -32,6 +32,10 @@ struct gp_handle_array {
|
|||||||
struct gp_handle **handles;
|
struct gp_handle **handles;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* NOTE: Internally, the layer will make sure to not release any resources
|
||||||
|
* until after the GPU finishes using them. However, it is up to the caller
|
||||||
|
* to make sure the released resources aren't referenced in any flows before
|
||||||
|
* dispatching. */
|
||||||
void gp_release(struct gp_handle handle);
|
void gp_release(struct gp_handle handle);
|
||||||
|
|
||||||
/* ========================== *
|
/* ========================== *
|
||||||
@ -114,6 +118,7 @@ struct gp_dispatch_params {
|
|||||||
struct gp_handle draw_target;
|
struct gp_handle draw_target;
|
||||||
struct rect draw_target_viewport;
|
struct rect draw_target_viewport;
|
||||||
struct xform draw_target_view;
|
struct xform draw_target_view;
|
||||||
|
b32 clear_target;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct gp_handle gp_flow_alloc(void);
|
struct gp_handle gp_flow_alloc(void);
|
||||||
@ -126,7 +131,7 @@ void gp_dispatch(struct gp_dispatch_params params);
|
|||||||
* Present
|
* Present
|
||||||
* ========================== */
|
* ========================== */
|
||||||
|
|
||||||
/* 1. Ensures the backbuffer is at size `backbuffer_resolution`
|
/* 1. Clears the backbuffer and ensures its at size `backbuffer_resolution`
|
||||||
* 2. Blits `texture` to the backbuffer using `texture_xf` (applied to centered unit square)
|
* 2. Blits `texture` to the backbuffer using `texture_xf` (applied to centered unit square)
|
||||||
* 3. Presents the backbuffer */
|
* 3. Presents the backbuffer */
|
||||||
void gp_present(struct sys_window *window, struct v2i32 backbuffer_resolution, struct gp_handle texture, struct xform texture_xf, i32 vsync);
|
void gp_present(struct sys_window *window, struct v2i32 backbuffer_resolution, struct gp_handle texture, struct xform texture_xf, i32 vsync);
|
||||||
|
|||||||
@ -2006,7 +2006,18 @@ void gp_dispatch(struct gp_dispatch_params params)
|
|||||||
/* Create temporary descriptor heap */
|
/* Create temporary descriptor heap */
|
||||||
/* NOTE: This should always occur after buffers are submitted */
|
/* NOTE: This should always occur after buffers are submitted */
|
||||||
|
|
||||||
/* Push commands */
|
|
||||||
|
/* Transition render target */
|
||||||
|
enum D3D12_RESOURCE_STATES target_old_state = dx12_resource_barrier(cl->cl, target, D3D12_RESOURCE_STATE_RENDER_TARGET);
|
||||||
|
{
|
||||||
|
ID3D12GraphicsCommandList_OMSetRenderTargets(cl->cl, 1, &target->rtv_descriptor->handle, false, NULL);
|
||||||
|
if (params.clear_target) {
|
||||||
|
f32 clear_color[] = { 0.0f, 0.0f, 0.0f, 0.0f };
|
||||||
|
ID3D12GraphicsCommandList_ClearRenderTargetView(cl->cl, target->rtv_descriptor->handle, clear_color, 0, NULL);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Material pass */
|
||||||
{
|
{
|
||||||
//struct pipeline *pipeline = dx12_get_pipeline(pipeline_scope, LIT("material"));
|
//struct pipeline *pipeline = dx12_get_pipeline(pipeline_scope, LIT("material"));
|
||||||
struct pipeline *pipeline = &G.test_pipeline;
|
struct pipeline *pipeline = &G.test_pipeline;
|
||||||
@ -2017,9 +2028,9 @@ void gp_dispatch(struct gp_dispatch_params params)
|
|||||||
ID3D12GraphicsCommandList_SetGraphicsRootSignature(cl->cl, pipeline->rootsig);
|
ID3D12GraphicsCommandList_SetGraphicsRootSignature(cl->cl, pipeline->rootsig);
|
||||||
|
|
||||||
/* Fill & bind constant buffer */
|
/* Fill & bind constant buffer */
|
||||||
|
/* TODO: Move into root constant */
|
||||||
struct sh_material_constants constants = ZI;
|
struct sh_material_constants constants = ZI;
|
||||||
constants.projection = sh_float4x4_from_mat4x4(vp_matrix);
|
constants.projection = sh_float4x4_from_mat4x4(vp_matrix);
|
||||||
constants.instance_offset = sh_uint_from_u32(0);
|
|
||||||
struct command_buffer *constant_buffer = command_list_push_buffer(cl, STRING_FROM_STRUCT(&constants));
|
struct command_buffer *constant_buffer = command_list_push_buffer(cl, STRING_FROM_STRUCT(&constants));
|
||||||
ID3D12GraphicsCommandList_SetGraphicsRootConstantBufferView(cl->cl, 0, constant_buffer->resource->gpu_address);
|
ID3D12GraphicsCommandList_SetGraphicsRootConstantBufferView(cl->cl, 0, constant_buffer->resource->gpu_address);
|
||||||
|
|
||||||
@ -2035,20 +2046,16 @@ void gp_dispatch(struct gp_dispatch_params params)
|
|||||||
ID3D12GraphicsCommandList_RSSetViewports(cl->cl, 1, &d3d12_viewport);
|
ID3D12GraphicsCommandList_RSSetViewports(cl->cl, 1, &d3d12_viewport);
|
||||||
ID3D12GraphicsCommandList_RSSetScissorRects(cl->cl, 1, &d3d12_scissor);
|
ID3D12GraphicsCommandList_RSSetScissorRects(cl->cl, 1, &d3d12_scissor);
|
||||||
|
|
||||||
/* Transition render target */
|
|
||||||
enum D3D12_RESOURCE_STATES old_state = dx12_resource_barrier(cl->cl, target, D3D12_RESOURCE_STATE_RENDER_TARGET);
|
|
||||||
ID3D12GraphicsCommandList_OMSetRenderTargets(cl->cl, 1, &target->rtv_descriptor->handle, false, NULL);
|
|
||||||
//f32 clear_color[] = { 0.0f, 0.0f, 0.0f, 0.0f };
|
|
||||||
//ID3D12GraphicsCommandList_ClearRenderTargetView(cl->cl, target->rtv_descriptor->handle, clear_color, 0, NULL);
|
|
||||||
|
|
||||||
/* Draw */
|
/* Draw */
|
||||||
ID3D12GraphicsCommandList_IASetPrimitiveTopology(cl->cl, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
ID3D12GraphicsCommandList_IASetPrimitiveTopology(cl->cl, D3D_PRIMITIVE_TOPOLOGY_TRIANGLELIST);
|
||||||
ID3D12GraphicsCommandList_IASetVertexBuffers(cl->cl, 0, 1, &dummy_vertex_buffer_view);
|
ID3D12GraphicsCommandList_IASetVertexBuffers(cl->cl, 0, 1, &dummy_vertex_buffer_view);
|
||||||
ID3D12GraphicsCommandList_IASetIndexBuffer(cl->cl, &quad_index_buffer_view);
|
ID3D12GraphicsCommandList_IASetIndexBuffer(cl->cl, &quad_index_buffer_view);
|
||||||
ID3D12GraphicsCommandList_DrawIndexedInstanced(cl->cl, 6, instance_count, 0, 0, 0);
|
ID3D12GraphicsCommandList_DrawIndexedInstanced(cl->cl, 6, instance_count, 0, 0, 0);
|
||||||
|
}
|
||||||
|
|
||||||
/* Reset render target */
|
/* Reset render target */
|
||||||
dx12_resource_barrier(cl->cl, target, old_state);
|
{
|
||||||
|
dx12_resource_barrier(cl->cl, target, target_old_state);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
command_list_close(cl);
|
command_list_close(cl);
|
||||||
@ -2067,7 +2074,6 @@ void gp_dispatch(struct gp_dispatch_params params)
|
|||||||
* Present
|
* Present
|
||||||
* ========================== */
|
* ========================== */
|
||||||
|
|
||||||
#if 0
|
|
||||||
#if GSTAT_ENABLED || PROFILING
|
#if GSTAT_ENABLED || PROFILING
|
||||||
INTERNAL void query_memory_info(void)
|
INTERNAL void query_memory_info(void)
|
||||||
{
|
{
|
||||||
@ -2116,7 +2122,6 @@ INTERNAL void query_memory_info(void)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
#endif
|
|
||||||
|
|
||||||
INTERNAL struct dx12_resource *update_swapchain(struct sys_window *window, struct v2i32 resolution)
|
INTERNAL struct dx12_resource *update_swapchain(struct sys_window *window, struct v2i32 resolution)
|
||||||
{
|
{
|
||||||
@ -2218,11 +2223,14 @@ INTERNAL void present_blit(struct dx12_resource *dst, struct dx12_resource *src,
|
|||||||
params.draw_target = dst_texture_handle;
|
params.draw_target = dst_texture_handle;
|
||||||
params.draw_target_viewport = RECT_FROM_V2(V2(0, 0), V2(dst->texture_size.x, dst->texture_size.y));
|
params.draw_target_viewport = RECT_FROM_V2(V2(0, 0), V2(dst->texture_size.x, dst->texture_size.y));
|
||||||
params.draw_target_view = XFORM_IDENT;
|
params.draw_target_view = XFORM_IDENT;
|
||||||
|
params.clear_target = true;
|
||||||
gp_dispatch(params);
|
gp_dispatch(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
void gp_present(struct sys_window *window, struct v2i32 backbuffer_resolution, struct gp_handle texture, struct xform texture_xf, i32 vsync)
|
void gp_present(struct sys_window *window, struct v2i32 backbuffer_resolution, struct gp_handle texture, struct xform texture_xf, i32 vsync)
|
||||||
{
|
{
|
||||||
|
query_memory_info();
|
||||||
|
|
||||||
//sys_sleep(0.1);
|
//sys_sleep(0.1);
|
||||||
|
|
||||||
struct dx12_resource *backbuffer_resource = update_swapchain(window, backbuffer_resolution);
|
struct dx12_resource *backbuffer_resource = update_swapchain(window, backbuffer_resolution);
|
||||||
|
|||||||
@ -2079,6 +2079,7 @@ INTERNAL void user_update(void)
|
|||||||
params.draw_target = G.user_texture;
|
params.draw_target = G.user_texture;
|
||||||
params.draw_target_viewport = user_viewport;
|
params.draw_target_viewport = user_viewport;
|
||||||
params.draw_target_view = G.world_to_user_xf;
|
params.draw_target_view = G.world_to_user_xf;
|
||||||
|
params.clear_target = true;
|
||||||
gp_dispatch(params);
|
gp_dispatch(params);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user