anv: Update VK_KHR_fragment_shading_rate for newer HW
Per primitive & attachment shading rate support added. v2: Rebase on KHR_dynamic_rendering Signed-off-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Reviewed-by: Ivan Briano <ivan.briano@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/13739>
This commit is contained in:

committed by
Marge Bot

parent
fc837e9f8b
commit
665ffd4bf9
@@ -208,8 +208,10 @@ anv_dynamic_state_copy(struct anv_dynamic_state *dest,
|
||||
|
||||
ANV_CMP_COPY(color_writes, ANV_CMD_DIRTY_DYNAMIC_COLOR_BLEND_STATE);
|
||||
|
||||
ANV_CMP_COPY(fragment_shading_rate.width, ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE);
|
||||
ANV_CMP_COPY(fragment_shading_rate.height, ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE);
|
||||
ANV_CMP_COPY(fragment_shading_rate.rate.width, ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE);
|
||||
ANV_CMP_COPY(fragment_shading_rate.rate.height, ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE);
|
||||
ANV_CMP_COPY(fragment_shading_rate.ops[0], ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE);
|
||||
ANV_CMP_COPY(fragment_shading_rate.ops[1], ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE);
|
||||
|
||||
#undef ANV_CMP_COPY
|
||||
|
||||
@@ -1338,6 +1340,25 @@ void anv_TrimCommandPool(
|
||||
/* Nothing for us to do here. Our pools stay pretty tidy. */
|
||||
}
|
||||
|
||||
/**
|
||||
* Return NULL if the current subpass has no color attachment.
|
||||
*/
|
||||
const struct anv_image_view *
|
||||
anv_cmd_buffer_get_first_color_view(const struct anv_cmd_buffer *cmd_buffer)
|
||||
{
|
||||
const struct anv_subpass *subpass = cmd_buffer->state.subpass;
|
||||
|
||||
if (subpass->color_count == 0)
|
||||
return NULL;
|
||||
|
||||
const struct anv_image_view *iview =
|
||||
cmd_buffer->state.attachments[subpass->color_attachments[0].attachment].image_view;
|
||||
|
||||
assert(iview->vk.aspects & VK_IMAGE_ASPECT_COLOR_BIT);
|
||||
|
||||
return iview;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return NULL if the current subpass has no depthstencil attachment.
|
||||
*/
|
||||
@@ -1358,6 +1379,25 @@ anv_cmd_buffer_get_depth_stencil_view(const struct anv_cmd_buffer *cmd_buffer)
|
||||
return iview;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return NULL if the current subpass has no fragment shading rate attachment.
|
||||
*/
|
||||
const struct anv_image_view *
|
||||
anv_cmd_buffer_get_fsr_view(const struct anv_cmd_buffer *cmd_buffer)
|
||||
{
|
||||
const struct anv_subpass *subpass = cmd_buffer->state.subpass;
|
||||
|
||||
if (subpass->fsr_attachment == NULL)
|
||||
return NULL;
|
||||
|
||||
const struct anv_image_view *iview =
|
||||
cmd_buffer->state.attachments[subpass->fsr_attachment->attachment].image_view;
|
||||
|
||||
assert(iview->image->vk.usage & VK_IMAGE_USAGE_FRAGMENT_SHADING_RATE_ATTACHMENT_BIT_KHR);
|
||||
|
||||
return iview;
|
||||
}
|
||||
|
||||
static struct anv_descriptor_set *
|
||||
anv_cmd_buffer_push_descriptor_set(struct anv_cmd_buffer *cmd_buffer,
|
||||
VkPipelineBindPoint bind_point,
|
||||
@@ -1610,8 +1650,15 @@ void anv_CmdSetFragmentShadingRateKHR(
|
||||
{
|
||||
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||
|
||||
cmd_buffer->state.gfx.dynamic.fragment_shading_rate = *pFragmentSize;
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE;
|
||||
if (cmd_buffer->state.gfx.dynamic.fragment_shading_rate.rate.width != pFragmentSize->width ||
|
||||
cmd_buffer->state.gfx.dynamic.fragment_shading_rate.rate.height != pFragmentSize->height ||
|
||||
cmd_buffer->state.gfx.dynamic.fragment_shading_rate.ops[0] != combinerOps[0] ||
|
||||
cmd_buffer->state.gfx.dynamic.fragment_shading_rate.ops[1] != combinerOps[1]) {
|
||||
cmd_buffer->state.gfx.dynamic.fragment_shading_rate.rate = *pFragmentSize;
|
||||
memcpy(cmd_buffer->state.gfx.dynamic.fragment_shading_rate.ops, combinerOps,
|
||||
sizeof(cmd_buffer->state.gfx.dynamic.fragment_shading_rate.ops));
|
||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_SHADING_RATE;
|
||||
}
|
||||
}
|
||||
|
||||
static inline uint32_t
|
||||
|
Reference in New Issue
Block a user