anv: support primitive restart enable dynamic state
Signed-off-by: Tapani Pälli <tapani.palli@intel.com> Reviewed-by: Lionel Landwerlin <lionel.g.landwerlin@intel.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/10366>
This commit is contained in:
@@ -103,6 +103,7 @@ const struct anv_dynamic_state default_dynamic_state = {
|
|||||||
.color_writes = 0xff,
|
.color_writes = 0xff,
|
||||||
.raster_discard = 0,
|
.raster_discard = 0,
|
||||||
.depth_bias_enable = 0,
|
.depth_bias_enable = 0,
|
||||||
|
.primitive_restart_enable = 0,
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -193,6 +194,7 @@ anv_dynamic_state_copy(struct anv_dynamic_state *dest,
|
|||||||
|
|
||||||
ANV_CMP_COPY(raster_discard, ANV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE);
|
ANV_CMP_COPY(raster_discard, ANV_CMD_DIRTY_DYNAMIC_RASTERIZER_DISCARD_ENABLE);
|
||||||
ANV_CMP_COPY(depth_bias_enable, ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE);
|
ANV_CMP_COPY(depth_bias_enable, ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE);
|
||||||
|
ANV_CMP_COPY(primitive_restart_enable, ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE);
|
||||||
|
|
||||||
if (copy_mask & ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS) {
|
if (copy_mask & ANV_CMD_DIRTY_DYNAMIC_SAMPLE_LOCATIONS) {
|
||||||
dest->sample_locations.samples = src->sample_locations.samples;
|
dest->sample_locations.samples = src->sample_locations.samples;
|
||||||
@@ -531,6 +533,17 @@ void anv_CmdSetDepthBiasEnableEXT(
|
|||||||
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE;
|
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_DEPTH_BIAS_ENABLE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void anv_CmdSetPrimitiveRestartEnableEXT(
|
||||||
|
VkCommandBuffer commandBuffer,
|
||||||
|
VkBool32 primitiveRestartEnable)
|
||||||
|
{
|
||||||
|
ANV_FROM_HANDLE(anv_cmd_buffer, cmd_buffer, commandBuffer);
|
||||||
|
|
||||||
|
cmd_buffer->state.gfx.dynamic.primitive_restart_enable = primitiveRestartEnable;
|
||||||
|
|
||||||
|
cmd_buffer->state.gfx.dirty |= ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE;
|
||||||
|
}
|
||||||
|
|
||||||
void anv_CmdSetViewport(
|
void anv_CmdSetViewport(
|
||||||
VkCommandBuffer commandBuffer,
|
VkCommandBuffer commandBuffer,
|
||||||
uint32_t firstViewport,
|
uint32_t firstViewport,
|
||||||
|
@@ -2002,6 +2002,12 @@ copy_non_dynamic_state(struct anv_graphics_pipeline *pipeline,
|
|||||||
pCreateInfo->pRasterizationState->depthBiasEnable;
|
pCreateInfo->pRasterizationState->depthBiasEnable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (states & ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE) {
|
||||||
|
assert(pCreateInfo->pInputAssemblyState);
|
||||||
|
dynamic->primitive_restart_enable =
|
||||||
|
pCreateInfo->pInputAssemblyState->primitiveRestartEnable;
|
||||||
|
}
|
||||||
|
|
||||||
/* Section 9.2 of the Vulkan 1.0.15 spec says:
|
/* Section 9.2 of the Vulkan 1.0.15 spec says:
|
||||||
*
|
*
|
||||||
* pColorBlendState is [...] NULL if the pipeline has rasterization
|
* pColorBlendState is [...] NULL if the pipeline has rasterization
|
||||||
@@ -2387,7 +2393,6 @@ anv_graphics_pipeline_init(struct anv_graphics_pipeline *pipeline,
|
|||||||
pCreateInfo->pInputAssemblyState;
|
pCreateInfo->pInputAssemblyState;
|
||||||
const VkPipelineTessellationStateCreateInfo *tess_info =
|
const VkPipelineTessellationStateCreateInfo *tess_info =
|
||||||
pCreateInfo->pTessellationState;
|
pCreateInfo->pTessellationState;
|
||||||
pipeline->primitive_restart = ia_info->primitiveRestartEnable;
|
|
||||||
|
|
||||||
if (anv_pipeline_has_stage(pipeline, MESA_SHADER_TESS_EVAL))
|
if (anv_pipeline_has_stage(pipeline, MESA_SHADER_TESS_EVAL))
|
||||||
pipeline->topology = _3DPRIM_PATCHLIST(tess_info->patchControlPoints);
|
pipeline->topology = _3DPRIM_PATCHLIST(tess_info->patchControlPoints);
|
||||||
|
@@ -2678,6 +2678,7 @@ struct anv_dynamic_state {
|
|||||||
bool stencil_test_enable;
|
bool stencil_test_enable;
|
||||||
bool raster_discard;
|
bool raster_discard;
|
||||||
bool depth_bias_enable;
|
bool depth_bias_enable;
|
||||||
|
bool primitive_restart_enable;
|
||||||
bool dyn_vbo_stride;
|
bool dyn_vbo_stride;
|
||||||
bool dyn_vbo_size;
|
bool dyn_vbo_size;
|
||||||
|
|
||||||
@@ -3393,7 +3394,6 @@ struct anv_graphics_pipeline {
|
|||||||
|
|
||||||
VkShaderStageFlags active_stages;
|
VkShaderStageFlags active_stages;
|
||||||
|
|
||||||
bool primitive_restart;
|
|
||||||
bool writes_depth;
|
bool writes_depth;
|
||||||
bool depth_test_enable;
|
bool depth_test_enable;
|
||||||
bool writes_stencil;
|
bool writes_stencil;
|
||||||
|
@@ -312,20 +312,21 @@ genX(cmd_buffer_flush_dynamic_state)(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
|
|
||||||
if (cmd_buffer->state.gfx.gfx7.index_buffer &&
|
if (cmd_buffer->state.gfx.gfx7.index_buffer &&
|
||||||
cmd_buffer->state.gfx.dirty & (ANV_CMD_DIRTY_PIPELINE |
|
cmd_buffer->state.gfx.dirty & (ANV_CMD_DIRTY_PIPELINE |
|
||||||
ANV_CMD_DIRTY_INDEX_BUFFER)) {
|
ANV_CMD_DIRTY_INDEX_BUFFER |
|
||||||
|
ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE)) {
|
||||||
struct anv_buffer *buffer = cmd_buffer->state.gfx.gfx7.index_buffer;
|
struct anv_buffer *buffer = cmd_buffer->state.gfx.gfx7.index_buffer;
|
||||||
uint32_t offset = cmd_buffer->state.gfx.gfx7.index_offset;
|
uint32_t offset = cmd_buffer->state.gfx.gfx7.index_offset;
|
||||||
|
|
||||||
#if GFX_VERx10 == 75
|
#if GFX_VERx10 == 75
|
||||||
anv_batch_emit(&cmd_buffer->batch, GFX75_3DSTATE_VF, vf) {
|
anv_batch_emit(&cmd_buffer->batch, GFX75_3DSTATE_VF, vf) {
|
||||||
vf.IndexedDrawCutIndexEnable = pipeline->primitive_restart;
|
vf.IndexedDrawCutIndexEnable = d->primitive_restart_enable;
|
||||||
vf.CutIndex = cmd_buffer->state.restart_index;
|
vf.CutIndex = cmd_buffer->state.restart_index;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_INDEX_BUFFER), ib) {
|
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_INDEX_BUFFER), ib) {
|
||||||
#if GFX_VERx10 != 75
|
#if GFX_VERx10 != 75
|
||||||
ib.CutIndexEnable = pipeline->primitive_restart;
|
ib.CutIndexEnable = d->primitive_restart_enable;
|
||||||
#endif
|
#endif
|
||||||
ib.IndexFormat = cmd_buffer->state.gfx.gfx7.index_type;
|
ib.IndexFormat = cmd_buffer->state.gfx.gfx7.index_type;
|
||||||
ib.MOCS = anv_mocs(cmd_buffer->device,
|
ib.MOCS = anv_mocs(cmd_buffer->device,
|
||||||
|
@@ -630,9 +630,10 @@ genX(cmd_buffer_flush_dynamic_state)(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (cmd_buffer->state.gfx.dirty & (ANV_CMD_DIRTY_PIPELINE |
|
if (cmd_buffer->state.gfx.dirty & (ANV_CMD_DIRTY_PIPELINE |
|
||||||
ANV_CMD_DIRTY_INDEX_BUFFER)) {
|
ANV_CMD_DIRTY_INDEX_BUFFER |
|
||||||
|
ANV_CMD_DIRTY_DYNAMIC_PRIMITIVE_RESTART_ENABLE)) {
|
||||||
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_VF), vf) {
|
anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_VF), vf) {
|
||||||
vf.IndexedDrawCutIndexEnable = pipeline->primitive_restart;
|
vf.IndexedDrawCutIndexEnable = d->primitive_restart_enable;
|
||||||
vf.CutIndex = cmd_buffer->state.restart_index;
|
vf.CutIndex = cmd_buffer->state.restart_index;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user