wined3d: Use dynamic state for patch vertex count if possible.

This commit is contained in:
Zebediah Figura 2023-09-11 22:16:17 -05:00 committed by Alexandre Julliard
parent 6f6ef6cd04
commit b9d2885148
6 changed files with 23 additions and 3 deletions

View file

@ -2350,6 +2350,7 @@ static void wined3d_adapter_vk_init_d3d_info(struct wined3d_adapter_vk *adapter_
vk_info->multiple_viewports = device_info.features2.features.multiViewport;
vk_info->dynamic_state2 = device_info.dynamic_state2_features.extendedDynamicState2;
vk_info->dynamic_patch_vertex_count = device_info.dynamic_state2_features.extendedDynamicState2PatchControlPoints;
}
static bool wined3d_adapter_vk_init_device_extensions(struct wined3d_adapter_vk *adapter_vk)

View file

@ -115,6 +115,7 @@ void wined3d_context_init(struct wined3d_context *context, struct wined3d_swapch
| (1u << WINED3D_SHADER_TYPE_COMPUTE);
context->update_primitive_type = 1;
context->update_patch_vertex_count = 1;
}
HRESULT wined3d_context_no3d_init(struct wined3d_context *context_no3d, struct wined3d_swapchain *swapchain)

View file

@ -1906,6 +1906,7 @@ void wined3d_context_vk_submit_command_buffer(struct wined3d_context_vk *context
context_vk->c.update_unordered_access_view_bindings = 1;
context_vk->c.update_compute_unordered_access_view_bindings = 1;
context_vk->c.update_primitive_type = 1;
context_vk->c.update_patch_vertex_count = 1;
context_invalidate_state(&context_vk->c, STATE_STREAMSRC);
context_invalidate_state(&context_vk->c, STATE_INDEXBUFFER);
context_invalidate_state(&context_vk->c, STATE_BLEND_FACTOR);
@ -2142,6 +2143,8 @@ static void wined3d_context_vk_init_graphics_pipeline_key(struct wined3d_context
if (!(context_vk->c.d3d_info->wined3d_creation_flags & WINED3D_NO_PRIMITIVE_RESTART))
dynamic_states[dynamic_state_count++] = VK_DYNAMIC_STATE_PRIMITIVE_RESTART_ENABLE_EXT;
}
if (vk_info->dynamic_patch_vertex_count)
dynamic_states[dynamic_state_count++] = VK_DYNAMIC_STATE_PATCH_CONTROL_POINTS_EXT;
key = &context_vk->graphics.pipeline_key_vk;
memset(key, 0, sizeof(*key));
@ -2508,7 +2511,7 @@ static bool wined3d_context_vk_update_graphics_pipeline_key(struct wined3d_conte
}
}
if (key->ts_desc.patchControlPoints != state->patch_vertex_count)
if (!vk_info->dynamic_patch_vertex_count && key->ts_desc.patchControlPoints != state->patch_vertex_count)
{
key->ts_desc.patchControlPoints = state->patch_vertex_count;
@ -3868,6 +3871,13 @@ VkCommandBuffer wined3d_context_vk_apply_draw_state(struct wined3d_context_vk *c
context_vk->c.update_primitive_type = 0;
}
if (vk_info->dynamic_patch_vertex_count && context_vk->c.update_patch_vertex_count)
{
if (state->patch_vertex_count)
VK_CALL(vkCmdSetPatchControlPointsEXT(vk_command_buffer, state->patch_vertex_count));
context_vk->c.update_patch_vertex_count = 0;
}
if (vk_info->supported[WINED3D_VK_EXT_EXTENDED_DYNAMIC_STATE]
&& (wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_DEPTH_STENCIL)
|| wined3d_context_is_graphics_state_dirty(&context_vk->c, STATE_FRAMEBUFFER)))

View file

@ -1047,6 +1047,11 @@ static void wined3d_cs_exec_draw(struct wined3d_cs *cs, const void *data)
for (i = 0; i < device->context_count; ++i)
device->contexts[i]->update_primitive_type = 1;
}
if (state->patch_vertex_count != op->patch_vertex_count)
{
for (i = 0; i < device->context_count; ++i)
device->contexts[i]->update_patch_vertex_count = 1;
}
state->patch_vertex_count = op->patch_vertex_count;
cs->c.device->adapter->adapter_ops->adapter_draw_primitive(cs->c.device, state, &op->parameters);

View file

@ -1968,7 +1968,8 @@ struct wined3d_context
DWORD destroy_delayed : 1;
DWORD namedArraysLoaded : 1;
DWORD update_primitive_type : 1;
DWORD padding : 4;
DWORD update_patch_vertex_count : 1;
DWORD padding : 3;
DWORD clip_distance_mask : 8; /* WINED3D_MAX_CLIP_DISTANCES, 8 */

View file

@ -187,6 +187,7 @@ struct wined3d_device_vk;
VK_DEVICE_EXT_PFN(vkCmdSetStencilOpEXT) \
VK_DEVICE_EXT_PFN(vkCmdSetStencilTestEnableEXT) \
/* VK_EXT_extended_dynamic_state2 */ \
VK_DEVICE_EXT_PFN(vkCmdSetPatchControlPointsEXT) \
VK_DEVICE_EXT_PFN(vkCmdSetPrimitiveRestartEnableEXT) \
/* VK_EXT_transform_feedback */ \
VK_DEVICE_EXT_PFN(vkCmdBeginQueryIndexedEXT) \
@ -247,6 +248,7 @@ struct wined3d_vk_info
bool multiple_viewports;
bool dynamic_state2;
bool dynamic_patch_vertex_count;
};
#define VK_CALL(f) (vk_info->vk_ops.f)
@ -569,7 +571,7 @@ struct wined3d_context_vk
const struct wined3d_vk_info *vk_info;
VkDynamicState dynamic_states[13];
VkDynamicState dynamic_states[14];
uint32_t update_compute_pipeline : 1;
uint32_t update_stream_output : 1;