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:
Philip Rebohle 2020-04-01 12:09:51 +02:00 committed by Hans-Kristian Arntzen
parent 6fbc38118a
commit d8a6d71038
2 changed files with 64 additions and 0 deletions

View File

@ -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)

View File

@ -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];