vulkan: Add dynamic state for tessellation domain origin
Reviewed-By: Mike Blumenkrantz <michael.blumenkrantz@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18878>
This commit is contained in:

committed by
Marge Bot

parent
9d0ed9cbcc
commit
1fee04d8ff
@@ -49,8 +49,10 @@ get_dynamic_state_groups(BITSET_WORD *dynamic,
|
||||
BITSET_SET(dynamic, MESA_VK_DYNAMIC_IA_PRIMITIVE_RESTART_ENABLE);
|
||||
}
|
||||
|
||||
if (groups & MESA_VK_GRAPHICS_STATE_TESSELLATION_BIT)
|
||||
if (groups & MESA_VK_GRAPHICS_STATE_TESSELLATION_BIT) {
|
||||
BITSET_SET(dynamic, MESA_VK_DYNAMIC_TS_PATCH_CONTROL_POINTS);
|
||||
BITSET_SET(dynamic, MESA_VK_DYNAMIC_TS_DOMAIN_ORIGIN);
|
||||
}
|
||||
|
||||
if (groups & MESA_VK_GRAPHICS_STATE_VIEWPORT_BIT) {
|
||||
BITSET_SET(dynamic, MESA_VK_DYNAMIC_VP_VIEWPORT_COUNT);
|
||||
@@ -116,6 +118,10 @@ fully_dynamic_state_groups(const BITSET_WORD *dynamic)
|
||||
if (BITSET_TEST(dynamic, MESA_VK_DYNAMIC_VI))
|
||||
groups |= MESA_VK_GRAPHICS_STATE_VERTEX_INPUT_BIT;
|
||||
|
||||
if (BITSET_TEST(dynamic, MESA_VK_DYNAMIC_TS_PATCH_CONTROL_POINTS) &&
|
||||
BITSET_TEST(dynamic, MESA_VK_DYNAMIC_TS_DOMAIN_ORIGIN))
|
||||
groups |= MESA_VK_GRAPHICS_STATE_TESSELLATION_BIT;
|
||||
|
||||
if (BITSET_TEST(dynamic, MESA_VK_DYNAMIC_FSR))
|
||||
groups |= MESA_VK_GRAPHICS_STATE_FRAGMENT_SHADING_RATE_BIT;
|
||||
|
||||
@@ -209,6 +215,7 @@ vk_get_dynamic_graphics_states(BITSET_WORD *dynamic,
|
||||
CASE( PATCH_CONTROL_POINTS_EXT, TS_PATCH_CONTROL_POINTS)
|
||||
CASE( LOGIC_OP_EXT, CB_LOGIC_OP)
|
||||
CASE( COLOR_WRITE_ENABLE_EXT, CB_COLOR_WRITE_ENABLES)
|
||||
CASE( TESSELLATION_DOMAIN_ORIGIN_EXT, TS_DOMAIN_ORIGIN)
|
||||
CASE( DEPTH_CLAMP_ENABLE_EXT, RS_DEPTH_CLAMP_ENABLE)
|
||||
CASE( POLYGON_MODE_EXT, RS_POLYGON_MODE)
|
||||
CASE( RASTERIZATION_STREAM_EXT, RS_RASTERIZATION_STREAM)
|
||||
@@ -343,14 +350,15 @@ vk_tessellation_state_init(struct vk_tessellation_state *ts,
|
||||
ts->patch_control_points = ts_info->patchControlPoints;
|
||||
}
|
||||
|
||||
const VkPipelineTessellationDomainOriginStateCreateInfo *ts_do_info =
|
||||
vk_find_struct_const(ts_info->pNext,
|
||||
PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO);
|
||||
if (ts_do_info != NULL) {
|
||||
assert(ts_do_info->domainOrigin <= UINT8_MAX);
|
||||
ts->domain_origin = ts_do_info->domainOrigin;
|
||||
} else {
|
||||
ts->domain_origin = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT;
|
||||
ts->domain_origin = VK_TESSELLATION_DOMAIN_ORIGIN_UPPER_LEFT;
|
||||
if (!IS_DYNAMIC(TS_DOMAIN_ORIGIN)) {
|
||||
const VkPipelineTessellationDomainOriginStateCreateInfo *ts_do_info =
|
||||
vk_find_struct_const(ts_info->pNext,
|
||||
PIPELINE_TESSELLATION_DOMAIN_ORIGIN_STATE_CREATE_INFO);
|
||||
if (ts_do_info != NULL) {
|
||||
assert(ts_do_info->domainOrigin <= UINT8_MAX);
|
||||
ts->domain_origin = ts_do_info->domainOrigin;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -359,7 +367,7 @@ vk_dynamic_graphics_state_init_ts(struct vk_dynamic_graphics_state *dst,
|
||||
const BITSET_WORD *needed,
|
||||
const struct vk_tessellation_state *ts)
|
||||
{
|
||||
dst->ts.patch_control_points = ts->patch_control_points;
|
||||
dst->ts = *ts;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1569,6 +1577,7 @@ vk_dynamic_graphics_state_copy(struct vk_dynamic_graphics_state *dst,
|
||||
COPY_IF_SET(IA_PRIMITIVE_TOPOLOGY, ia.primitive_topology);
|
||||
COPY_IF_SET(IA_PRIMITIVE_RESTART_ENABLE, ia.primitive_restart_enable);
|
||||
COPY_IF_SET(TS_PATCH_CONTROL_POINTS, ts.patch_control_points);
|
||||
COPY_IF_SET(TS_DOMAIN_ORIGIN, ts.domain_origin);
|
||||
|
||||
COPY_IF_SET(VP_VIEWPORT_COUNT, vp.viewport_count);
|
||||
if (IS_SET_IN_SRC(VP_VIEWPORTS)) {
|
||||
@@ -1787,6 +1796,16 @@ vk_common_CmdSetPatchControlPointsEXT(VkCommandBuffer commandBuffer,
|
||||
ts.patch_control_points, patchControlPoints);
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
vk_common_CmdSetTessellationDomainOriginEXT(VkCommandBuffer commandBuffer,
|
||||
VkTessellationDomainOrigin domainOrigin)
|
||||
{
|
||||
VK_FROM_HANDLE(vk_command_buffer, cmd, commandBuffer);
|
||||
struct vk_dynamic_graphics_state *dyn = &cmd->dynamic_graphics_state;
|
||||
|
||||
SET_DYN_VALUE(dyn, TS_DOMAIN_ORIGIN, ts.domain_origin, domainOrigin);
|
||||
}
|
||||
|
||||
VKAPI_ATTR void VKAPI_CALL
|
||||
vk_common_CmdSetViewport(VkCommandBuffer commandBuffer,
|
||||
uint32_t firstViewport,
|
||||
|
@@ -50,6 +50,7 @@ enum mesa_vk_dynamic_graphics_state {
|
||||
MESA_VK_DYNAMIC_IA_PRIMITIVE_TOPOLOGY,
|
||||
MESA_VK_DYNAMIC_IA_PRIMITIVE_RESTART_ENABLE,
|
||||
MESA_VK_DYNAMIC_TS_PATCH_CONTROL_POINTS,
|
||||
MESA_VK_DYNAMIC_TS_DOMAIN_ORIGIN,
|
||||
MESA_VK_DYNAMIC_VP_VIEWPORT_COUNT,
|
||||
MESA_VK_DYNAMIC_VP_VIEWPORTS,
|
||||
MESA_VK_DYNAMIC_VP_SCISSOR_COUNT,
|
||||
@@ -151,10 +152,16 @@ struct vk_input_assembly_state {
|
||||
};
|
||||
|
||||
struct vk_tessellation_state {
|
||||
/** VkPipelineTessellationStateCreateInfo::patchControlPoints */
|
||||
/** VkPipelineTessellationStateCreateInfo::patchControlPoints
|
||||
*
|
||||
* MESA_VK_DYNAMIC_TS_PATCH_CONTROL_POINTS
|
||||
*/
|
||||
uint8_t patch_control_points;
|
||||
|
||||
/** VkPipelineTessellationDomainOriginStateCreateInfo::domainOrigin */
|
||||
/** VkPipelineTessellationDomainOriginStateCreateInfo::domainOrigin
|
||||
*
|
||||
* MESA_VK_DYNAMIC_TS_DOMAIN_ORIGIN
|
||||
*/
|
||||
uint8_t domain_origin;
|
||||
};
|
||||
|
||||
@@ -616,11 +623,11 @@ struct vk_dynamic_graphics_state {
|
||||
*/
|
||||
uint16_t vi_binding_strides[MESA_VK_MAX_VERTEX_BINDINGS];
|
||||
|
||||
/** Input assembly state */
|
||||
struct vk_input_assembly_state ia;
|
||||
|
||||
struct {
|
||||
uint32_t patch_control_points;
|
||||
} ts;
|
||||
/** Tessellation state */
|
||||
struct vk_tessellation_state ts;
|
||||
|
||||
/** Viewport state */
|
||||
struct vk_viewport_state vp;
|
||||
|
Reference in New Issue
Block a user