vkd3d: Introduce vkd3d_dynamic_state.
And add a function to (re-)apply dynamic state as necessary. This will allow us to ignore dynamic state not needed by the pipeline, and may become necessary if we implement shader-based copies etc. Currently unused; the following commits will subsequently change state setting methods over. Signed-off-by: Philip Rebohle <philip.rebohle@tu-dortmund.de>
This commit is contained in:
parent
6fbc38118a
commit
d8a6d71038
|
@ -2694,6 +2694,12 @@ static void d3d12_command_list_reset_state(struct d3d12_command_list *list,
|
|||
list->current_render_pass = VK_NULL_HANDLE;
|
||||
list->uav_counter_address_buffer = VK_NULL_HANDLE;
|
||||
|
||||
memset(&list->dynamic_state, 0, sizeof(list->dynamic_state));
|
||||
list->dynamic_state.blend_constants[0] = D3D12_DEFAULT_BLEND_FACTOR_RED;
|
||||
list->dynamic_state.blend_constants[1] = D3D12_DEFAULT_BLEND_FACTOR_GREEN;
|
||||
list->dynamic_state.blend_constants[2] = D3D12_DEFAULT_BLEND_FACTOR_BLUE;
|
||||
list->dynamic_state.blend_constants[3] = D3D12_DEFAULT_BLEND_FACTOR_ALPHA;
|
||||
|
||||
memset(list->pipeline_bindings, 0, sizeof(list->pipeline_bindings));
|
||||
memset(list->descriptor_heaps, 0, sizeof(list->descriptor_heaps));
|
||||
|
||||
|
@ -3494,6 +3500,38 @@ static bool d3d12_command_list_update_compute_state(struct d3d12_command_list *l
|
|||
return true;
|
||||
}
|
||||
|
||||
static void d3d12_command_list_update_dynamic_state(struct d3d12_command_list *list)
|
||||
{
|
||||
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
|
||||
struct vkd3d_dynamic_state *dyn_state = &list->dynamic_state;
|
||||
|
||||
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_VIEWPORT)
|
||||
{
|
||||
VK_CALL(vkCmdSetViewport(list->vk_command_buffer,
|
||||
0, dyn_state->viewport_count, dyn_state->viewports));
|
||||
}
|
||||
|
||||
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_SCISSOR)
|
||||
{
|
||||
VK_CALL(vkCmdSetScissor(list->vk_command_buffer,
|
||||
0, dyn_state->viewport_count, dyn_state->scissors));
|
||||
}
|
||||
|
||||
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_BLEND_CONSTANTS)
|
||||
{
|
||||
VK_CALL(vkCmdSetBlendConstants(list->vk_command_buffer,
|
||||
dyn_state->blend_constants));
|
||||
}
|
||||
|
||||
if (dyn_state->dirty_flags & VKD3D_DYNAMIC_STATE_STENCIL_REFERENCE)
|
||||
{
|
||||
VK_CALL(vkCmdSetStencilReference(list->vk_command_buffer,
|
||||
VK_STENCIL_FRONT_AND_BACK, dyn_state->stencil_reference));
|
||||
}
|
||||
|
||||
dyn_state->dirty_flags = 0;
|
||||
}
|
||||
|
||||
static bool d3d12_command_list_begin_render_pass(struct d3d12_command_list *list)
|
||||
{
|
||||
const struct vkd3d_vk_device_procs *vk_procs = &list->device->vk_procs;
|
||||
|
@ -3506,6 +3544,9 @@ static bool d3d12_command_list_begin_render_pass(struct d3d12_command_list *list
|
|||
if (!d3d12_command_list_update_current_framebuffer(list))
|
||||
return false;
|
||||
|
||||
if (list->dynamic_state.dirty_flags)
|
||||
d3d12_command_list_update_dynamic_state(list);
|
||||
|
||||
d3d12_command_list_update_descriptors(list, VK_PIPELINE_BIND_POINT_GRAPHICS);
|
||||
|
||||
if (list->current_render_pass != VK_NULL_HANDLE)
|
||||
|
|
|
@ -827,6 +827,16 @@ struct d3d12_root_signature *unsafe_impl_from_ID3D12RootSignature(ID3D12RootSign
|
|||
int vkd3d_parse_root_signature_v_1_0(const struct vkd3d_shader_code *dxbc,
|
||||
struct vkd3d_versioned_root_signature_desc *desc) DECLSPEC_HIDDEN;
|
||||
|
||||
#define VKD3D_MAX_DYNAMIC_STATE_COUNT (4)
|
||||
|
||||
enum vkd3d_dynamic_state_flag
|
||||
{
|
||||
VKD3D_DYNAMIC_STATE_VIEWPORT = (1 << 0),
|
||||
VKD3D_DYNAMIC_STATE_SCISSOR = (1 << 1),
|
||||
VKD3D_DYNAMIC_STATE_BLEND_CONSTANTS = (1 << 2),
|
||||
VKD3D_DYNAMIC_STATE_STENCIL_REFERENCE = (1 << 3),
|
||||
};
|
||||
|
||||
struct d3d12_graphics_pipeline_state
|
||||
{
|
||||
VkPipelineShaderStageCreateInfo stages[VKD3D_MAX_SHADER_STAGES];
|
||||
|
@ -1070,6 +1080,18 @@ struct d3d12_deferred_descriptor_set_update
|
|||
unsigned int root_parameter_index;
|
||||
};
|
||||
|
||||
struct vkd3d_dynamic_state
|
||||
{
|
||||
uint32_t dirty_flags; /* vkd3d_dynamic_state_flags */
|
||||
|
||||
uint32_t viewport_count;
|
||||
VkViewport viewports[D3D12_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
|
||||
VkRect2D scissors[D3D12_VIEWPORT_AND_SCISSORRECT_OBJECT_COUNT_PER_PIPELINE];
|
||||
|
||||
float blend_constants[4];
|
||||
uint32_t stencil_reference;
|
||||
};
|
||||
|
||||
/* ID3D12CommandList */
|
||||
typedef ID3D12GraphicsCommandList2 d3d12_command_list_iface;
|
||||
|
||||
|
@ -1106,6 +1128,7 @@ struct d3d12_command_list
|
|||
VkRenderPass pso_render_pass;
|
||||
VkRenderPass current_render_pass;
|
||||
VkBuffer uav_counter_address_buffer;
|
||||
struct vkd3d_dynamic_state dynamic_state;
|
||||
struct vkd3d_pipeline_bindings pipeline_bindings[VK_PIPELINE_BIND_POINT_RANGE_SIZE];
|
||||
struct vkd3d_descriptor_updates packed_descriptors[VK_PIPELINE_BIND_POINT_RANGE_SIZE];
|
||||
|
||||
|
|
Loading…
Reference in New Issue