VK_FRAGMENT_SHADING_RATE_COMBINER_OP_KEEP_KHR},
},
.depth_bias_enable = 0u,
+ .primitive_restart_enable = 0u,
};
static void
}
}
+ if (copy_mask & RADV_DYNAMIC_PRIMITIVE_RESTART_ENABLE) {
+ if (dest->primitive_restart_enable != src->primitive_restart_enable) {
+ dest->primitive_restart_enable = src->primitive_restart_enable;
+ dest_mask |= RADV_DYNAMIC_PRIMITIVE_RESTART_ENABLE;
+ }
+ }
+
cmd_buffer->state.dirty |= dest_mask;
}
if (!cmd_buffer->state.emitted_pipeline)
cmd_buffer->state.dirty |= RADV_CMD_DIRTY_DYNAMIC_PRIMITIVE_TOPOLOGY |
RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS |
- RADV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS;
+ RADV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS |
+ RADV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE;
if (!cmd_buffer->state.emitted_pipeline ||
cmd_buffer->state.emitted_pipeline->graphics.db_depth_control !=
}
static void
+radv_emit_primitive_restart_enable(struct radv_cmd_buffer *cmd_buffer)
+{
+ struct radv_dynamic_state *d = &cmd_buffer->state.dynamic;
+
+ if (cmd_buffer->device->physical_device->rad_info.chip_class >= GFX9) {
+ radeon_set_uconfig_reg(cmd_buffer->cs, R_03092C_VGT_MULTI_PRIM_IB_RESET_EN,
+ d->primitive_restart_enable);
+ } else {
+ radeon_set_context_reg(cmd_buffer->cs, R_028A94_VGT_MULTI_PRIM_IB_RESET_EN,
+ d->primitive_restart_enable);
+ }
+}
+
+static void
radv_emit_fb_color_state(struct radv_cmd_buffer *cmd_buffer, int index,
struct radv_color_buffer_info *cb, struct radv_image_view *iview,
VkImageLayout layout, bool in_render_loop, bool disable_dcc)
if (states & RADV_CMD_DIRTY_DYNAMIC_FRAGMENT_SHADING_RATE)
radv_emit_fragment_shading_rate(cmd_buffer);
+ if (states & RADV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE)
+ radv_emit_primitive_restart_enable(cmd_buffer);
+
cmd_buffer->state.dirty &= ~states;
}
struct radeon_info *info = &cmd_buffer->device->physical_device->rad_info;
struct radv_cmd_state *state = &cmd_buffer->state;
unsigned topology = state->dynamic.primitive_topology;
+ bool prim_restart_enable = state->dynamic.primitive_restart_enable;
struct radeon_cmdbuf *cs = cmd_buffer->cs;
unsigned ia_multi_vgt_param;
ia_multi_vgt_param =
si_get_ia_multi_vgt_param(cmd_buffer, instanced_draw, indirect_draw, count_from_stream_output,
- draw_vertex_count, topology);
+ draw_vertex_count, topology, prim_restart_enable);
if (state->last_ia_multi_vgt_param != ia_multi_vgt_param) {
if (info->chip_class == GFX9) {
struct radeon_info *info = &cmd_buffer->device->physical_device->rad_info;
struct radv_cmd_state *state = &cmd_buffer->state;
struct radeon_cmdbuf *cs = cmd_buffer->cs;
- int32_t primitive_reset_en;
/* Draw state. */
if (info->chip_class < GFX10) {
draw_info->indirect ? 0 : draw_info->count);
}
- /* Primitive restart. */
- primitive_reset_en = draw_info->indexed && state->pipeline->graphics.prim_restart_enable;
-
- if (primitive_reset_en != state->last_primitive_reset_en) {
- state->last_primitive_reset_en = primitive_reset_en;
- if (info->chip_class >= GFX9) {
- radeon_set_uconfig_reg(cs, R_03092C_VGT_MULTI_PRIM_IB_RESET_EN, primitive_reset_en);
- } else {
- radeon_set_context_reg(cs, R_028A94_VGT_MULTI_PRIM_IB_RESET_EN, primitive_reset_en);
- }
- }
-
- if (primitive_reset_en) {
+ if (state->dynamic.primitive_restart_enable) {
uint32_t primitive_reset_index = radv_get_primitive_reset_index(cmd_buffer);
if (primitive_reset_index != state->last_primitive_reset_index) {
}
void
+radv_CmdSetPrimitiveRestartEnableEXT(VkCommandBuffer commandBuffer, VkBool32 primitiveRestartEnable)
+{
+ RADV_FROM_HANDLE(radv_cmd_buffer, cmd_buffer, commandBuffer);
+ struct radv_cmd_state *state = &cmd_buffer->state;
+
+ if (state->dynamic.primitive_restart_enable == primitiveRestartEnable)
+ return;
+
+ state->dynamic.primitive_restart_enable = primitiveRestartEnable;
+
+ state->dirty |= RADV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE;
+}
+
+void
radv_CmdExecuteCommands(VkCommandBuffer commandBuffer, uint32_t commandBufferCount,
const VkCommandBuffer *pCmdBuffers)
{
uint32_t primitive_reset_index = radv_get_primitive_reset_index(cmd_buffer);
- if (info->indexed && state->pipeline->graphics.prim_restart_enable &&
+ if (info->indexed && state->dynamic.primitive_restart_enable &&
primitive_reset_index != state->last_primitive_reset_index)
return true;
cmd_buffer->state.dynamic.fragment_shading_rate.combiner_ops[1];
state->depth_bias_enable = cmd_buffer->state.dynamic.depth_bias_enable;
+
+ state->primitive_restart_enable = cmd_buffer->state.dynamic.primitive_restart_enable;
}
if (state->flags & RADV_META_SAVE_SAMPLE_LOCATIONS) {
cmd_buffer->state.dynamic.depth_bias_enable = state->depth_bias_enable;
+ cmd_buffer->state.dynamic.primitive_restart_enable = state->primitive_restart_enable;
+
cmd_buffer->state.dirty |=
RADV_CMD_DIRTY_DYNAMIC_VIEWPORT | RADV_CMD_DIRTY_DYNAMIC_SCISSOR |
RADV_CMD_DIRTY_DYNAMIC_CULL_MODE | RADV_CMD_DIRTY_DYNAMIC_FRONT_FACE |
RADV_CMD_DIRTY_DYNAMIC_DEPTH_WRITE_ENABLE | RADV_CMD_DIRTY_DYNAMIC_DEPTH_COMPARE_OP |
RADV_CMD_DIRTY_DYNAMIC_DEPTH_BOUNDS_TEST_ENABLE |
RADV_CMD_DIRTY_DYNAMIC_STENCIL_TEST_ENABLE | RADV_CMD_DIRTY_DYNAMIC_STENCIL_OP |
- RADV_CMD_DIRTY_DYNAMIC_FRAGMENT_SHADING_RATE | RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE;
+ RADV_CMD_DIRTY_DYNAMIC_FRAGMENT_SHADING_RATE | RADV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE |
+ RADV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE;
}
if (state->flags & RADV_META_SAVE_SAMPLE_LOCATIONS) {
/* If rasterization is disabled we do not care about any of the
* dynamic states, since they are all rasterization related only,
- * except primitive topology and vertex binding stride.
+ * except primitive topology, primitive restart enable and vertex
+ * binding stride.
*/
if (pCreateInfo->pRasterizationState->rasterizerDiscardEnable)
- return RADV_DYNAMIC_PRIMITIVE_TOPOLOGY | RADV_DYNAMIC_VERTEX_INPUT_BINDING_STRIDE;
+ return RADV_DYNAMIC_PRIMITIVE_TOPOLOGY | RADV_DYNAMIC_VERTEX_INPUT_BINDING_STRIDE |
+ RADV_DYNAMIC_PRIMITIVE_RESTART_ENABLE;
if (!pCreateInfo->pRasterizationState->depthBiasEnable &&
!radv_is_state_dynamic(pCreateInfo, VK_DYNAMIC_STATE_DEPTH_BIAS_ENABLE_EXT))
struct radv_shader_variant *tes = pipeline->shaders[MESA_SHADER_TESS_EVAL];
struct radv_shader_variant *gs = pipeline->shaders[MESA_SHADER_GEOMETRY];
- pipeline->graphics.prim_restart_enable = !!ia_state->primitiveRestartEnable;
pipeline->graphics.can_use_guardband = radv_prim_can_use_guardband(ia_state->topology);
if (radv_pipeline_has_gs(pipeline)) {
dynamic->depth_bias_enable = pCreateInfo->pRasterizationState->depthBiasEnable;
}
+ if (states & RADV_DYNAMIC_PRIMITIVE_RESTART_ENABLE) {
+ dynamic->primitive_restart_enable =
+ !!pCreateInfo->pInputAssemblyState->primitiveRestartEnable;
+ }
+
pipeline->dynamic_state.mask = states;
}
} fragment_shading_rate;
bool depth_bias_enable;
+ bool primitive_restart_enable;
};
extern const struct radv_dynamic_state default_dynamic_state;
const VkViewport *viewports, bool can_use_guardband);
uint32_t si_get_ia_multi_vgt_param(struct radv_cmd_buffer *cmd_buffer, bool instanced_draw,
bool indirect_draw, bool count_from_stream_output,
- uint32_t draw_vertex_count, unsigned topology);
+ uint32_t draw_vertex_count, unsigned topology,
+ bool prim_restart_enable);
void si_cs_emit_write_event_eop(struct radeon_cmdbuf *cs, enum chip_class chip_class, bool is_mec,
unsigned event, unsigned event_flags, unsigned dst_sel,
unsigned data_sel, uint64_t va, uint32_t new_fence,
struct radv_binning_state binning;
struct radv_vrs_state vrs;
uint32_t spi_baryc_cntl;
- bool prim_restart_enable;
unsigned esgs_ring_size;
unsigned gsvs_ring_size;
uint32_t vtx_base_sgpr;
uint32_t
si_get_ia_multi_vgt_param(struct radv_cmd_buffer *cmd_buffer, bool instanced_draw,
bool indirect_draw, bool count_from_stream_output,
- uint32_t draw_vertex_count, unsigned topology)
+ uint32_t draw_vertex_count, unsigned topology, bool prim_restart_enable)
{
enum chip_class chip_class = cmd_buffer->device->physical_device->rad_info.chip_class;
enum radeon_family family = cmd_buffer->device->physical_device->rad_info.family;
if (cmd_buffer->device->physical_device->rad_info.max_se < 4 ||
topology == V_008958_DI_PT_POLYGON || topology == V_008958_DI_PT_LINELOOP ||
topology == V_008958_DI_PT_TRIFAN || topology == V_008958_DI_PT_TRISTRIP_ADJ ||
- (cmd_buffer->state.pipeline->graphics.prim_restart_enable &&
+ (prim_restart_enable &&
(cmd_buffer->device->physical_device->rad_info.family < CHIP_POLARIS10 ||
(topology != V_008958_DI_PT_POINTLIST && topology != V_008958_DI_PT_LINESTRIP))))
wd_switch_on_eop = true;
/* Workaround for a VGT hang when strip primitive types are used with
* primitive restart.
*/
- if (cmd_buffer->state.pipeline->graphics.prim_restart_enable &&
+ if (prim_restart_enable &&
(topology == V_008958_DI_PT_LINESTRIP || topology == V_008958_DI_PT_TRISTRIP ||
topology == V_008958_DI_PT_LINESTRIP_ADJ || topology == V_008958_DI_PT_TRISTRIP_ADJ)) {
partial_vs_wave = true;