radv: add support for dynamic polygon mode
Signed-off-by: Samuel Pitoiset <samuel.pitoiset@gmail.com> Reviewed-by: Bas Nieuwenhuizen <bas@basnieuwenhuizen.nl> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/18882>
This commit is contained in:

committed by
Marge Bot

parent
e0b4b12066
commit
6bf34e9f36
@@ -122,6 +122,7 @@ const struct radv_dynamic_state default_dynamic_state = {
|
|||||||
.logic_op = 0u,
|
.logic_op = 0u,
|
||||||
.color_write_enable = 0u,
|
.color_write_enable = 0u,
|
||||||
.patch_control_points = 0,
|
.patch_control_points = 0,
|
||||||
|
.polygon_mode = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -255,6 +256,8 @@ radv_bind_dynamic_state(struct radv_cmd_buffer *cmd_buffer, const struct radv_dy
|
|||||||
|
|
||||||
RADV_CMP_COPY(patch_control_points, RADV_DYNAMIC_PATCH_CONTROL_POINTS);
|
RADV_CMP_COPY(patch_control_points, RADV_DYNAMIC_PATCH_CONTROL_POINTS);
|
||||||
|
|
||||||
|
RADV_CMP_COPY(polygon_mode, RADV_DYNAMIC_POLYGON_MODE);
|
||||||
|
|
||||||
#undef RADV_CMP_COPY
|
#undef RADV_CMP_COPY
|
||||||
|
|
||||||
cmd_buffer->state.dirty |= dest_mask;
|
cmd_buffer->state.dirty |= dest_mask;
|
||||||
@@ -1463,7 +1466,8 @@ radv_emit_graphics_pipeline(struct radv_cmd_buffer *cmd_buffer)
|
|||||||
cmd_buffer->state.emitted_graphics_pipeline->pa_su_sc_mode_cntl != pipeline->pa_su_sc_mode_cntl)
|
cmd_buffer->state.emitted_graphics_pipeline->pa_su_sc_mode_cntl != pipeline->pa_su_sc_mode_cntl)
|
||||||
cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_CULL_MODE |
|
cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_CULL_MODE |
|
||||||
RADV_CMD_DIRTY_DYNAMIC_FRONT_FACE |
|
RADV_CMD_DIRTY_DYNAMIC_FRONT_FACE |
|
||||||
RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS;
|
RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS |
|
||||||
|
RADV_CMD_DIRTY_DYNAMIC_POLYGON_MODE;
|
||||||
|
|
||||||
if (!cmd_buffer->state.emitted_graphics_pipeline ||
|
if (!cmd_buffer->state.emitted_graphics_pipeline ||
|
||||||
cmd_buffer->state.emitted_graphics_pipeline->pa_cl_clip_cntl != pipeline->pa_cl_clip_cntl)
|
cmd_buffer->state.emitted_graphics_pipeline->pa_cl_clip_cntl != pipeline->pa_cl_clip_cntl)
|
||||||
@@ -1698,6 +1702,7 @@ radv_emit_line_stipple(struct radv_cmd_buffer *cmd_buffer)
|
|||||||
uint32_t
|
uint32_t
|
||||||
radv_get_pa_su_sc_mode_cntl(const struct radv_cmd_buffer *cmd_buffer)
|
radv_get_pa_su_sc_mode_cntl(const struct radv_cmd_buffer *cmd_buffer)
|
||||||
{
|
{
|
||||||
|
enum amd_gfx_level gfx_level = cmd_buffer->device->physical_device->rad_info.gfx_level;
|
||||||
unsigned pa_su_sc_mode_cntl = cmd_buffer->state.graphics_pipeline->pa_su_sc_mode_cntl;
|
unsigned pa_su_sc_mode_cntl = cmd_buffer->state.graphics_pipeline->pa_su_sc_mode_cntl;
|
||||||
const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic;
|
const struct radv_dynamic_state *d = &cmd_buffer->state.dynamic;
|
||||||
|
|
||||||
@@ -1706,7 +1711,16 @@ radv_get_pa_su_sc_mode_cntl(const struct radv_cmd_buffer *cmd_buffer)
|
|||||||
S_028814_FACE(d->front_face) |
|
S_028814_FACE(d->front_face) |
|
||||||
S_028814_POLY_OFFSET_FRONT_ENABLE(d->depth_bias_enable) |
|
S_028814_POLY_OFFSET_FRONT_ENABLE(d->depth_bias_enable) |
|
||||||
S_028814_POLY_OFFSET_BACK_ENABLE(d->depth_bias_enable) |
|
S_028814_POLY_OFFSET_BACK_ENABLE(d->depth_bias_enable) |
|
||||||
S_028814_POLY_OFFSET_PARA_ENABLE(d->depth_bias_enable);
|
S_028814_POLY_OFFSET_PARA_ENABLE(d->depth_bias_enable) |
|
||||||
|
S_028814_POLY_MODE(d->polygon_mode != V_028814_X_DRAW_TRIANGLES) |
|
||||||
|
S_028814_POLYMODE_FRONT_PTYPE(d->polygon_mode) |
|
||||||
|
S_028814_POLYMODE_BACK_PTYPE(d->polygon_mode);
|
||||||
|
|
||||||
|
if (gfx_level >= GFX10) {
|
||||||
|
pa_su_sc_mode_cntl |=
|
||||||
|
S_028814_KEEP_TOGETHER_ENABLE(d->polygon_mode != V_028814_X_DRAW_TRIANGLES);
|
||||||
|
}
|
||||||
|
|
||||||
return pa_su_sc_mode_cntl;
|
return pa_su_sc_mode_cntl;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3318,7 +3332,7 @@ radv_cmd_buffer_flush_dynamic_state(struct radv_cmd_buffer *cmd_buffer, bool pip
|
|||||||
radv_emit_line_stipple(cmd_buffer);
|
radv_emit_line_stipple(cmd_buffer);
|
||||||
|
|
||||||
if (states & (RADV_CMD_DIRTY_DYNAMIC_CULL_MODE | RADV_CMD_DIRTY_DYNAMIC_FRONT_FACE |
|
if (states & (RADV_CMD_DIRTY_DYNAMIC_CULL_MODE | RADV_CMD_DIRTY_DYNAMIC_FRONT_FACE |
|
||||||
RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE))
|
RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE | RADV_CMD_DIRTY_DYNAMIC_POLYGON_MODE))
|
||||||
radv_emit_culling(cmd_buffer);
|
radv_emit_culling(cmd_buffer);
|
||||||
|
|
||||||
if (states & RADV_CMD_DIRTY_DYNAMIC_PRIMITIVE_TOPOLOGY)
|
if (states & RADV_CMD_DIRTY_DYNAMIC_PRIMITIVE_TOPOLOGY)
|
||||||
@@ -5747,6 +5761,17 @@ radv_CmdSetVertexInputEXT(VkCommandBuffer commandBuffer, uint32_t vertexBindingD
|
|||||||
RADV_CMD_DIRTY_DYNAMIC_VERTEX_INPUT;
|
RADV_CMD_DIRTY_DYNAMIC_VERTEX_INPUT;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
VKAPI_ATTR void VKAPI_CALL
|
||||||
|
radv_CmdSetPolygonModeEXT(VkCommandBuffer commandBuffer, VkPolygonMode polygonMode)
|
||||||
|
{
|
||||||
|
RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||||
|
struct radv_cmd_state *state = &cmd_buffer->state;
|
||||||
|
|
||||||
|
state->dynamic.polygon_mode = si_translate_fill(polygonMode);
|
||||||
|
|
||||||
|
state->dirty |= RADV_CMD_DIRTY_DYNAMIC_POLYGON_MODE;
|
||||||
|
}
|
||||||
|
|
||||||
VKAPI_ATTR void VKAPI_CALL
|
VKAPI_ATTR void VKAPI_CALL
|
||||||
radv_CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
|
radv_CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
|
||||||
const VkCommandBuffer *pCmdBuffers)
|
const VkCommandBuffer *pCmdBuffers)
|
||||||
|
@@ -879,22 +879,6 @@ radv_pipeline_init_blend_state(struct radv_graphics_pipeline *pipeline,
|
|||||||
return blend;
|
return blend;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint32_t
|
|
||||||
si_translate_fill(VkPolygonMode func)
|
|
||||||
{
|
|
||||||
switch (func) {
|
|
||||||
case VK_POLYGON_MODE_FILL:
|
|
||||||
return V_028814_X_DRAW_TRIANGLES;
|
|
||||||
case VK_POLYGON_MODE_LINE:
|
|
||||||
return V_028814_X_DRAW_LINES;
|
|
||||||
case VK_POLYGON_MODE_POINT:
|
|
||||||
return V_028814_X_DRAW_POINTS;
|
|
||||||
default:
|
|
||||||
assert(0);
|
|
||||||
return V_028814_X_DRAW_POINTS;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned
|
static unsigned
|
||||||
radv_pipeline_color_samples(const struct vk_graphics_pipeline_state *state)
|
radv_pipeline_color_samples(const struct vk_graphics_pipeline_state *state)
|
||||||
{
|
{
|
||||||
@@ -1903,6 +1887,10 @@ radv_pipeline_init_dynamic_state(struct radv_graphics_pipeline *pipeline,
|
|||||||
dynamic->patch_control_points = state->ts->patch_control_points;
|
dynamic->patch_control_points = state->ts->patch_control_points;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (states & RADV_DYNAMIC_POLYGON_MODE) {
|
||||||
|
dynamic->polygon_mode = si_translate_fill(state->rs->polygon_mode);
|
||||||
|
}
|
||||||
|
|
||||||
pipeline->dynamic_state.mask = states;
|
pipeline->dynamic_state.mask = states;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1913,17 +1901,8 @@ radv_pipeline_init_raster_state(struct radv_graphics_pipeline *pipeline,
|
|||||||
const struct radv_device *device = pipeline->base.device;
|
const struct radv_device *device = pipeline->base.device;
|
||||||
|
|
||||||
pipeline->pa_su_sc_mode_cntl =
|
pipeline->pa_su_sc_mode_cntl =
|
||||||
S_028814_POLY_MODE(state->rs->polygon_mode != VK_POLYGON_MODE_FILL) |
|
|
||||||
S_028814_POLYMODE_FRONT_PTYPE(si_translate_fill(state->rs->polygon_mode)) |
|
|
||||||
S_028814_POLYMODE_BACK_PTYPE(si_translate_fill(state->rs->polygon_mode)) |
|
|
||||||
S_028814_PROVOKING_VTX_LAST(state->rs->provoking_vertex == VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT);
|
S_028814_PROVOKING_VTX_LAST(state->rs->provoking_vertex == VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT);
|
||||||
|
|
||||||
if (device->physical_device->rad_info.gfx_level >= GFX10) {
|
|
||||||
/* It should also be set if PERPENDICULAR_ENDCAP_ENA is set. */
|
|
||||||
pipeline->pa_su_sc_mode_cntl |=
|
|
||||||
S_028814_KEEP_TOGETHER_ENABLE(state->rs->polygon_mode != VK_POLYGON_MODE_FILL);
|
|
||||||
}
|
|
||||||
|
|
||||||
pipeline->pa_cl_clip_cntl =
|
pipeline->pa_cl_clip_cntl =
|
||||||
S_028810_DX_CLIP_SPACE_DEF(!pipeline->negative_one_to_one) |
|
S_028810_DX_CLIP_SPACE_DEF(!pipeline->negative_one_to_one) |
|
||||||
S_028810_ZCLIP_NEAR_DISABLE(!state->rs->depth_clip_enable) |
|
S_028810_ZCLIP_NEAR_DISABLE(!state->rs->depth_clip_enable) |
|
||||||
|
@@ -1351,6 +1351,8 @@ struct radv_dynamic_state {
|
|||||||
uint32_t color_write_enable;
|
uint32_t color_write_enable;
|
||||||
|
|
||||||
uint32_t patch_control_points;
|
uint32_t patch_control_points;
|
||||||
|
|
||||||
|
uint32_t polygon_mode;
|
||||||
};
|
};
|
||||||
|
|
||||||
extern const struct radv_dynamic_state default_dynamic_state;
|
extern const struct radv_dynamic_state default_dynamic_state;
|
||||||
@@ -3004,6 +3006,22 @@ radv_get_num_vertices_per_prim(const struct radv_pipeline_key *pipeline_key)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline uint32_t
|
||||||
|
si_translate_fill(VkPolygonMode func)
|
||||||
|
{
|
||||||
|
switch (func) {
|
||||||
|
case VK_POLYGON_MODE_FILL:
|
||||||
|
return V_028814_X_DRAW_TRIANGLES;
|
||||||
|
case VK_POLYGON_MODE_LINE:
|
||||||
|
return V_028814_X_DRAW_LINES;
|
||||||
|
case VK_POLYGON_MODE_POINT:
|
||||||
|
return V_028814_X_DRAW_POINTS;
|
||||||
|
default:
|
||||||
|
assert(0);
|
||||||
|
return V_028814_X_DRAW_POINTS;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static inline uint32_t
|
static inline uint32_t
|
||||||
si_translate_stencil_op(enum VkStencilOp op)
|
si_translate_stencil_op(enum VkStencilOp op)
|
||||||
{
|
{
|
||||||
|
Reference in New Issue
Block a user