radv: use vk_dynamic_graphic_state for the viewport state

Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/20314>
This commit is contained in:
Samuel Pitoiset
2022-12-14 09:18:08 +01:00
committed by Marge Bot
parent 251933efa7
commit 104a564920
4 changed files with 52 additions and 70 deletions

View File

@@ -73,6 +73,12 @@ const struct radv_dynamic_state default_dynamic_state = {
.primitive_topology = 0u, .primitive_topology = 0u,
.primitive_restart_enable = 0u, .primitive_restart_enable = 0u,
}, },
.vp =
{
.depth_clip_negative_one_to_one = 0u,
.viewport_count = 0,
.scissor_count = 0,
},
.ts = .ts =
{ {
.patch_control_points = 0, .patch_control_points = 0,
@@ -85,14 +91,6 @@ const struct radv_dynamic_state default_dynamic_state = {
VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR}, VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR},
}, },
}, },
.viewport =
{
.count = 0,
},
.scissor =
{
.count = 0,
},
.line_width = 1.0f, .line_width = 1.0f,
.depth_bias = .depth_bias =
{ {
@@ -139,7 +137,6 @@ const struct radv_dynamic_state default_dynamic_state = {
.sample_mask = 0u, .sample_mask = 0u,
.depth_clip_enable = 0u, .depth_clip_enable = 0u,
.conservative_rast_mode = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT, .conservative_rast_mode = VK_CONSERVATIVE_RASTERIZATION_MODE_DISABLED_EXT,
.depth_clip_negative_one_to_one = 0u,
.provoking_vertex_mode = VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT, .provoking_vertex_mode = VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT,
.depth_clamp_enable = 0u, .depth_clamp_enable = 0u,
.color_write_mask = 0u, .color_write_mask = 0u,
@@ -159,28 +156,28 @@ radv_bind_dynamic_state(struct radv_cmd_buffer *cmd_buffer, const struct radv_dy
dest->sample_location.count = src->sample_location.count; dest->sample_location.count = src->sample_location.count;
if (copy_mask & RADV_DYNAMIC_VIEWPORT) { if (copy_mask & RADV_DYNAMIC_VIEWPORT) {
if (dest->viewport.count != src->viewport.count) { if (dest->vk.vp.viewport_count != src->vk.vp.viewport_count) {
dest->viewport.count = src->viewport.count; dest->vk.vp.viewport_count = src->vk.vp.viewport_count;
dest_mask |= RADV_DYNAMIC_VIEWPORT; dest_mask |= RADV_DYNAMIC_VIEWPORT;
} }
if (memcmp(&dest->viewport.viewports, &src->viewport.viewports, if (memcmp(&dest->vk.vp.viewports, &src->vk.vp.viewports,
src->viewport.count * sizeof(VkViewport))) { src->vk.vp.viewport_count * sizeof(VkViewport))) {
typed_memcpy(dest->viewport.viewports, src->viewport.viewports, src->viewport.count); typed_memcpy(dest->vk.vp.viewports, src->vk.vp.viewports, src->vk.vp.viewport_count);
typed_memcpy(dest->hw_vp.xform, src->hw_vp.xform, src->viewport.count); typed_memcpy(dest->hw_vp.xform, src->hw_vp.xform, src->vk.vp.viewport_count);
dest_mask |= RADV_DYNAMIC_VIEWPORT; dest_mask |= RADV_DYNAMIC_VIEWPORT;
} }
} }
if (copy_mask & RADV_DYNAMIC_SCISSOR) { if (copy_mask & RADV_DYNAMIC_SCISSOR) {
if (dest->scissor.count != src->scissor.count) { if (dest->vk.vp.scissor_count != src->vk.vp.scissor_count) {
dest->scissor.count = src->scissor.count; dest->vk.vp.scissor_count = src->vk.vp.scissor_count;
dest_mask |= RADV_DYNAMIC_SCISSOR; dest_mask |= RADV_DYNAMIC_SCISSOR;
} }
if (memcmp(&dest->scissor.scissors, &src->scissor.scissors, if (memcmp(&dest->vk.vp.scissors, &src->vk.vp.scissors,
src->scissor.count * sizeof(VkRect2D))) { src->vk.vp.scissor_count * sizeof(VkRect2D))) {
typed_memcpy(dest->scissor.scissors, src->scissor.scissors, src->scissor.count); typed_memcpy(dest->vk.vp.scissors, src->vk.vp.scissors, src->vk.vp.scissor_count);
dest_mask |= RADV_DYNAMIC_SCISSOR; dest_mask |= RADV_DYNAMIC_SCISSOR;
} }
} }
@@ -295,7 +292,7 @@ radv_bind_dynamic_state(struct radv_cmd_buffer *cmd_buffer, const struct radv_dy
RADV_CMP_COPY(conservative_rast_mode, RADV_DYNAMIC_CONSERVATIVE_RAST_MODE); RADV_CMP_COPY(conservative_rast_mode, RADV_DYNAMIC_CONSERVATIVE_RAST_MODE);
RADV_CMP_COPY(depth_clip_negative_one_to_one, RADV_DYNAMIC_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE); RADV_CMP_COPY(vk.vp.depth_clip_negative_one_to_one, RADV_DYNAMIC_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE);
RADV_CMP_COPY(provoking_vertex_mode, RADV_DYNAMIC_PROVOKING_VERTEX_MODE); RADV_CMP_COPY(provoking_vertex_mode, RADV_DYNAMIC_PROVOKING_VERTEX_MODE);
@@ -2021,38 +2018,39 @@ radv_emit_viewport(struct radv_cmd_buffer *cmd_buffer)
const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic; const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic;
enum radv_depth_clamp_mode depth_clamp_mode = radv_get_depth_clamp_mode(cmd_buffer); enum radv_depth_clamp_mode depth_clamp_mode = radv_get_depth_clamp_mode(cmd_buffer);
assert(d->viewport.count); assert(d->vk.vp.viewport_count);
radeon_set_context_reg_seq(cmd_buffer->cs, R_02843C_PA_CL_VPORT_XSCALE, d->viewport.count * 6); radeon_set_context_reg_seq(cmd_buffer->cs, R_02843C_PA_CL_VPORT_XSCALE,
d->vk.vp.viewport_count * 6);
for (unsigned i = 0; i < d->viewport.count; i++) { for (unsigned i = 0; i < d->vk.vp.viewport_count; i++) {
radeon_emit(cmd_buffer->cs, fui(d->hw_vp.xform[i].scale[0])); radeon_emit(cmd_buffer->cs, fui(d->hw_vp.xform[i].scale[0]));
radeon_emit(cmd_buffer->cs, fui(d->hw_vp.xform[i].translate[0])); radeon_emit(cmd_buffer->cs, fui(d->hw_vp.xform[i].translate[0]));
radeon_emit(cmd_buffer->cs, fui(d->hw_vp.xform[i].scale[1])); radeon_emit(cmd_buffer->cs, fui(d->hw_vp.xform[i].scale[1]));
radeon_emit(cmd_buffer->cs, fui(d->hw_vp.xform[i].translate[1])); radeon_emit(cmd_buffer->cs, fui(d->hw_vp.xform[i].translate[1]));
double scale_z, translate_z; double scale_z, translate_z;
if (d->depth_clip_negative_one_to_one) { if (d->vk.vp.depth_clip_negative_one_to_one) {
scale_z = d->hw_vp.xform[i].scale[2] * 0.5f; scale_z = d->hw_vp.xform[i].scale[2] * 0.5f;
translate_z = (d->hw_vp.xform[i].translate[2] + d->viewport.viewports[i].maxDepth) * 0.5f; translate_z = (d->hw_vp.xform[i].translate[2] + d->vk.vp.viewports[i].maxDepth) * 0.5f;
} else { } else {
scale_z = d->hw_vp.xform[i].scale[2]; scale_z = d->hw_vp.xform[i].scale[2];
translate_z = d->hw_vp.xform[i].translate[2]; translate_z = d->hw_vp.xform[i].translate[2];
} }
radeon_emit(cmd_buffer->cs, fui(scale_z)); radeon_emit(cmd_buffer->cs, fui(scale_z));
radeon_emit(cmd_buffer->cs, fui(translate_z)); radeon_emit(cmd_buffer->cs, fui(translate_z));
} }
radeon_set_context_reg_seq(cmd_buffer->cs, R_0282D0_PA_SC_VPORT_ZMIN_0, d->viewport.count * 2); radeon_set_context_reg_seq(cmd_buffer->cs, R_0282D0_PA_SC_VPORT_ZMIN_0,
for (unsigned i = 0; i < d->viewport.count; i++) { d->vk.vp.viewport_count * 2);
for (unsigned i = 0; i < d->vk.vp.viewport_count; i++) {
float zmin, zmax; float zmin, zmax;
if (depth_clamp_mode == RADV_DEPTH_CLAMP_MODE_ZERO_TO_ONE) { if (depth_clamp_mode == RADV_DEPTH_CLAMP_MODE_ZERO_TO_ONE) {
zmin = 0.0f; zmin = 0.0f;
zmax = 1.0f; zmax = 1.0f;
} else { } else {
zmin = MIN2(d->viewport.viewports[i].minDepth, d->viewport.viewports[i].maxDepth); zmin = MIN2(d->vk.vp.viewports[i].minDepth, d->vk.vp.viewports[i].maxDepth);
zmax = MAX2(d->viewport.viewports[i].minDepth, d->viewport.viewports[i].maxDepth); zmax = MAX2(d->vk.vp.viewports[i].minDepth, d->vk.vp.viewports[i].maxDepth);
} }
radeon_emit(cmd_buffer->cs, fui(zmin)); radeon_emit(cmd_buffer->cs, fui(zmin));
@@ -2065,7 +2063,7 @@ radv_write_scissors(struct radv_cmd_buffer *cmd_buffer, struct radeon_cmdbuf *cs
{ {
const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic; const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic;
si_write_scissors(cs, d->scissor.count, d->scissor.scissors, d->viewport.viewports); si_write_scissors(cs, d->vk.vp.scissor_count, d->vk.vp.scissors, d->vk.vp.viewports);
} }
static void static void
@@ -2365,7 +2363,7 @@ radv_emit_clipping(struct radv_cmd_buffer *cmd_buffer)
S_028810_DX_RASTERIZATION_KILL(d->rasterizer_discard_enable) | S_028810_DX_RASTERIZATION_KILL(d->rasterizer_discard_enable) |
S_028810_ZCLIP_NEAR_DISABLE(!d->depth_clip_enable) | S_028810_ZCLIP_NEAR_DISABLE(!d->depth_clip_enable) |
S_028810_ZCLIP_FAR_DISABLE(!d->depth_clip_enable) | S_028810_ZCLIP_FAR_DISABLE(!d->depth_clip_enable) |
S_028810_DX_CLIP_SPACE_DEF(!d->depth_clip_negative_one_to_one) | S_028810_DX_CLIP_SPACE_DEF(!d->vk.vp.depth_clip_negative_one_to_one) |
S_028810_DX_LINEAR_ATTR_CLIP_ENA(1)); S_028810_DX_LINEAR_ATTR_CLIP_ENA(1));
} }
@@ -3498,7 +3496,7 @@ radv_emit_guardband_state(struct radv_cmd_buffer *cmd_buffer)
rast_prim = si_conv_prim_to_gs_out(d->vk.ia.primitive_topology); rast_prim = si_conv_prim_to_gs_out(d->vk.ia.primitive_topology);
} }
si_write_guardband(cmd_buffer->cs, d->viewport.count, d->viewport.viewports, rast_prim, si_write_guardband(cmd_buffer->cs, d->vk.vp.viewport_count, d->vk.vp.viewports, rast_prim,
d->polygon_mode, d->line_width); d->polygon_mode, d->line_width);
cmd_buffer->state.dirty &= ~RADV_CMD_DIRTY_GUARDBAND; cmd_buffer->state.dirty &= ~RADV_CMD_DIRTY_GUARDBAND;
@@ -6172,10 +6170,10 @@ radv_CmdSetViewport(VkCommandBuffer commandBuffer, uint32_t firstViewport, uint3
assert(firstViewport < MAX_VIEWPORTS); assert(firstViewport < MAX_VIEWPORTS);
assert(total_count >= 1 && total_count <= MAX_VIEWPORTS); assert(total_count >= 1 && total_count <= MAX_VIEWPORTS);
if (state->dynamic.viewport.count < total_count) if (state->dynamic.vk.vp.viewport_count < total_count)
state->dynamic.viewport.count = total_count; state->dynamic.vk.vp.viewport_count = total_count;
memcpy(state->dynamic.viewport.viewports + firstViewport, pViewports, memcpy(state->dynamic.vk.vp.viewports + firstViewport, pViewports,
viewportCount * sizeof(*pViewports)); viewportCount * sizeof(*pViewports));
for (unsigned i = 0; i < viewportCount; i++) { for (unsigned i = 0; i < viewportCount; i++) {
radv_get_viewport_xform(&pViewports[i], radv_get_viewport_xform(&pViewports[i],
@@ -6197,10 +6195,10 @@ radv_CmdSetScissor(VkCommandBuffer commandBuffer, uint32_t firstScissor, uint32_
assert(firstScissor < MAX_SCISSORS); assert(firstScissor < MAX_SCISSORS);
assert(total_count >= 1 && total_count <= MAX_SCISSORS); assert(total_count >= 1 && total_count <= MAX_SCISSORS);
if (state->dynamic.scissor.count < total_count) if (state->dynamic.vk.vp.scissor_count < total_count)
state->dynamic.scissor.count = total_count; state->dynamic.vk.vp.scissor_count = total_count;
memcpy(state->dynamic.scissor.scissors + firstScissor, pScissors, memcpy(state->dynamic.vk.vp.scissors + firstScissor, pScissors,
scissorCount * sizeof(*pScissors)); scissorCount * sizeof(*pScissors));
state->dirty |= RADV_CMD_DIRTY_DYNAMIC_SCISSOR; state->dirty |= RADV_CMD_DIRTY_DYNAMIC_SCISSOR;
@@ -6756,7 +6754,7 @@ radv_CmdSetDepthClipNegativeOneToOneEXT(VkCommandBuffer commandBuffer, VkBool32
RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer); RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
struct radv_cmd_state *state = &cmd_buffer->state; struct radv_cmd_state *state = &cmd_buffer->state;
state->dynamic.depth_clip_negative_one_to_one = negativeOneToOne; state->dynamic.vk.vp.depth_clip_negative_one_to_one = negativeOneToOne;
state->dirty |= RADV_CMD_DIRTY_DYNAMIC_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE; state->dirty |= RADV_CMD_DIRTY_DYNAMIC_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE;
} }

View File

@@ -1122,8 +1122,8 @@ radv_prepare_dgc(struct radv_cmd_buffer *cmd_buffer,
if (!layout->push_constant_mask) if (!layout->push_constant_mask)
const_size = 0; const_size = 0;
unsigned scissor_size = (8 + 2 * cmd_buffer->state.dynamic.scissor.count) * 4; unsigned scissor_size = (8 + 2 * cmd_buffer->state.dynamic.vk.vp.scissor_count) * 4;
if (!layout->binds_state || !cmd_buffer->state.dynamic.scissor.count || if (!layout->binds_state || !cmd_buffer->state.dynamic.vk.vp.scissor_count ||
!cmd_buffer->device->physical_device->rad_info.has_gfx9_scissor_bug) !cmd_buffer->device->physical_device->rad_info.has_gfx9_scissor_bug)
scissor_size = 0; scissor_size = 0;

View File

@@ -1522,19 +1522,19 @@ radv_pipeline_init_dynamic_state(struct radv_graphics_pipeline *pipeline,
struct radv_dynamic_state *dynamic = &pipeline->dynamic_state; struct radv_dynamic_state *dynamic = &pipeline->dynamic_state;
if (needed_states & RADV_DYNAMIC_VIEWPORT) { if (needed_states & RADV_DYNAMIC_VIEWPORT) {
dynamic->viewport.count = state->vp->viewport_count; dynamic->vk.vp.viewport_count = state->vp->viewport_count;
if (states & RADV_DYNAMIC_VIEWPORT) { if (states & RADV_DYNAMIC_VIEWPORT) {
typed_memcpy(dynamic->viewport.viewports, state->vp->viewports, state->vp->viewport_count); typed_memcpy(dynamic->vk.vp.viewports, state->vp->viewports, state->vp->viewport_count);
for (unsigned i = 0; i < dynamic->viewport.count; i++) for (unsigned i = 0; i < dynamic->vk.vp.viewport_count; i++)
radv_get_viewport_xform(&dynamic->viewport.viewports[i], radv_get_viewport_xform(&dynamic->vk.vp.viewports[i], dynamic->hw_vp.xform[i].scale,
dynamic->hw_vp.xform[i].scale, dynamic->hw_vp.xform[i].translate); dynamic->hw_vp.xform[i].translate);
} }
} }
if (needed_states & RADV_DYNAMIC_SCISSOR) { if (needed_states & RADV_DYNAMIC_SCISSOR) {
dynamic->scissor.count = state->vp->scissor_count; dynamic->vk.vp.scissor_count = state->vp->scissor_count;
if (states & RADV_DYNAMIC_SCISSOR) { if (states & RADV_DYNAMIC_SCISSOR) {
typed_memcpy(dynamic->scissor.scissors, state->vp->scissors, state->vp->scissor_count); typed_memcpy(dynamic->vk.vp.scissors, state->vp->scissors, state->vp->scissor_count);
} }
} }
@@ -1726,7 +1726,7 @@ radv_pipeline_init_dynamic_state(struct radv_graphics_pipeline *pipeline,
} }
if (states & RADV_DYNAMIC_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE) { if (states & RADV_DYNAMIC_DEPTH_CLIP_NEGATIVE_ONE_TO_ONE) {
dynamic->depth_clip_negative_one_to_one = state->vp->depth_clip_negative_one_to_one; dynamic->vk.vp.depth_clip_negative_one_to_one = state->vp->depth_clip_negative_one_to_one;
} }
if (states & RADV_DYNAMIC_PROVOKING_VERTEX_MODE) { if (states & RADV_DYNAMIC_PROVOKING_VERTEX_MODE) {

View File

@@ -1298,16 +1298,6 @@ struct radv_streamout_state {
bool streamout_enabled; bool streamout_enabled;
}; };
struct radv_viewport_state {
uint32_t count;
VkViewport viewports[MAX_VIEWPORTS];
};
struct radv_scissor_state {
uint32_t count;
VkRect2D scissors[MAX_SCISSORS];
};
struct radv_discard_rectangle_state { struct radv_discard_rectangle_state {
uint32_t count; uint32_t count;
VkRect2D rectangles[MAX_DISCARD_RECTANGLES]; VkRect2D rectangles[MAX_DISCARD_RECTANGLES];
@@ -1336,10 +1326,6 @@ struct radv_dynamic_state {
} xform[MAX_VIEWPORTS]; } xform[MAX_VIEWPORTS];
} hw_vp; } hw_vp;
struct radv_viewport_state viewport;
struct radv_scissor_state scissor;
float line_width; float line_width;
struct { struct {
@@ -1425,8 +1411,6 @@ struct radv_dynamic_state {
VkConservativeRasterizationModeEXT conservative_rast_mode; VkConservativeRasterizationModeEXT conservative_rast_mode;
bool depth_clip_negative_one_to_one;
VkProvokingVertexModeEXT provoking_vertex_mode; VkProvokingVertexModeEXT provoking_vertex_mode;
bool depth_clamp_enable; bool depth_clamp_enable;