anv: handle dynamic viewport count
Emit 3DSTATE_CLIP during cmd_buffer_flush_state so that we can change the max viewport count dynamically. v2: use one common clip state as size is the same for all gens (Lionel) 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/5604>
This commit is contained in:
@@ -62,6 +62,8 @@ void genX(flush_pipeline_select_gpgpu)(struct anv_cmd_buffer *cmd_buffer);
|
|||||||
void genX(cmd_buffer_config_l3)(struct anv_cmd_buffer *cmd_buffer,
|
void genX(cmd_buffer_config_l3)(struct anv_cmd_buffer *cmd_buffer,
|
||||||
const struct gen_l3_config *cfg);
|
const struct gen_l3_config *cfg);
|
||||||
|
|
||||||
|
void genX(cmd_buffer_emit_clip)(struct anv_cmd_buffer *cmd_buffer);
|
||||||
|
|
||||||
void genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer);
|
void genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer);
|
||||||
void genX(cmd_buffer_flush_dynamic_state)(struct anv_cmd_buffer *cmd_buffer);
|
void genX(cmd_buffer_flush_dynamic_state)(struct anv_cmd_buffer *cmd_buffer);
|
||||||
|
|
||||||
|
@@ -3385,6 +3385,7 @@ struct anv_graphics_pipeline {
|
|||||||
struct {
|
struct {
|
||||||
uint32_t sf[7];
|
uint32_t sf[7];
|
||||||
uint32_t depth_stencil_state[3];
|
uint32_t depth_stencil_state[3];
|
||||||
|
uint32_t clip[4];
|
||||||
} gen7;
|
} gen7;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
|
@@ -3263,6 +3263,28 @@ cmd_buffer_flush_push_constants(struct anv_cmd_buffer *cmd_buffer,
|
|||||||
cmd_buffer->state.push_constants_dirty &= ~flushed;
|
cmd_buffer->state.push_constants_dirty &= ~flushed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
genX(cmd_buffer_emit_clip)(struct anv_cmd_buffer *cmd_buffer)
|
||||||
|
{
|
||||||
|
struct anv_graphics_pipeline *pipeline = cmd_buffer->state.gfx.pipeline;
|
||||||
|
|
||||||
|
if (cmd_buffer->state.gfx.dirty & (ANV_CMD_DIRTY_PIPELINE |
|
||||||
|
ANV_CMD_DIRTY_DYNAMIC_VIEWPORT)) {
|
||||||
|
uint32_t dwords[GENX(3DSTATE_CLIP_length)];
|
||||||
|
int32_t count =
|
||||||
|
cmd_buffer->state.gfx.dynamic.viewport.count > 0 ?
|
||||||
|
cmd_buffer->state.gfx.dynamic.viewport.count - 1 : 0;
|
||||||
|
|
||||||
|
struct GENX(3DSTATE_CLIP) clip = {
|
||||||
|
GENX(3DSTATE_CLIP_header),
|
||||||
|
.MaximumVPIndex = count,
|
||||||
|
};
|
||||||
|
GENX(3DSTATE_CLIP_pack)(NULL, dwords, &clip);
|
||||||
|
anv_batch_emit_merge(&cmd_buffer->batch, dwords,
|
||||||
|
pipeline->gen7.clip);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer)
|
genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer)
|
||||||
{
|
{
|
||||||
@@ -3434,8 +3456,10 @@ genX(cmd_buffer_flush_state)(struct anv_cmd_buffer *cmd_buffer)
|
|||||||
if (dirty)
|
if (dirty)
|
||||||
cmd_buffer_emit_descriptor_pointers(cmd_buffer, dirty);
|
cmd_buffer_emit_descriptor_pointers(cmd_buffer, dirty);
|
||||||
|
|
||||||
if (cmd_buffer->state.gfx.dirty & ANV_CMD_DIRTY_DYNAMIC_VIEWPORT)
|
if (cmd_buffer->state.gfx.dirty & ANV_CMD_DIRTY_DYNAMIC_VIEWPORT) {
|
||||||
|
genX(cmd_buffer_emit_clip)(cmd_buffer);
|
||||||
gen8_cmd_buffer_emit_viewport(cmd_buffer);
|
gen8_cmd_buffer_emit_viewport(cmd_buffer);
|
||||||
|
}
|
||||||
|
|
||||||
if (cmd_buffer->state.gfx.dirty & (ANV_CMD_DIRTY_DYNAMIC_VIEWPORT |
|
if (cmd_buffer->state.gfx.dirty & (ANV_CMD_DIRTY_DYNAMIC_VIEWPORT |
|
||||||
ANV_CMD_DIRTY_PIPELINE)) {
|
ANV_CMD_DIRTY_PIPELINE)) {
|
||||||
|
@@ -1277,11 +1277,16 @@ static void
|
|||||||
emit_3dstate_clip(struct anv_graphics_pipeline *pipeline,
|
emit_3dstate_clip(struct anv_graphics_pipeline *pipeline,
|
||||||
const VkPipelineInputAssemblyStateCreateInfo *ia_info,
|
const VkPipelineInputAssemblyStateCreateInfo *ia_info,
|
||||||
const VkPipelineViewportStateCreateInfo *vp_info,
|
const VkPipelineViewportStateCreateInfo *vp_info,
|
||||||
const VkPipelineRasterizationStateCreateInfo *rs_info)
|
const VkPipelineRasterizationStateCreateInfo *rs_info,
|
||||||
|
const uint32_t dynamic_states)
|
||||||
{
|
{
|
||||||
const struct brw_wm_prog_data *wm_prog_data = get_wm_prog_data(pipeline);
|
const struct brw_wm_prog_data *wm_prog_data = get_wm_prog_data(pipeline);
|
||||||
(void) wm_prog_data;
|
(void) wm_prog_data;
|
||||||
anv_batch_emit(&pipeline->base.batch, GENX(3DSTATE_CLIP), clip) {
|
|
||||||
|
struct GENX(3DSTATE_CLIP) clip = {
|
||||||
|
GENX(3DSTATE_CLIP_header),
|
||||||
|
};
|
||||||
|
|
||||||
clip.ClipEnable = true;
|
clip.ClipEnable = true;
|
||||||
clip.StatisticsEnable = true;
|
clip.StatisticsEnable = true;
|
||||||
clip.EarlyCullEnable = true;
|
clip.EarlyCullEnable = true;
|
||||||
@@ -1299,7 +1304,6 @@ emit_3dstate_clip(struct anv_graphics_pipeline *pipeline,
|
|||||||
#if GEN_GEN >= 8
|
#if GEN_GEN >= 8
|
||||||
clip.VertexSubPixelPrecisionSelect = _8Bit;
|
clip.VertexSubPixelPrecisionSelect = _8Bit;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
clip.ClipMode = CLIPMODE_NORMAL;
|
clip.ClipMode = CLIPMODE_NORMAL;
|
||||||
|
|
||||||
clip.TriangleStripListProvokingVertexSelect = 0;
|
clip.TriangleStripListProvokingVertexSelect = 0;
|
||||||
@@ -1319,7 +1323,8 @@ emit_3dstate_clip(struct anv_graphics_pipeline *pipeline,
|
|||||||
* ViewportIndex, then the first viewport is used."
|
* ViewportIndex, then the first viewport is used."
|
||||||
*/
|
*/
|
||||||
if (vp_info && (last->vue_map.slots_valid & VARYING_BIT_VIEWPORT)) {
|
if (vp_info && (last->vue_map.slots_valid & VARYING_BIT_VIEWPORT)) {
|
||||||
clip.MaximumVPIndex = vp_info->viewportCount - 1;
|
clip.MaximumVPIndex = vp_info->viewportCount > 0 ?
|
||||||
|
vp_info->viewportCount - 1 : 0;
|
||||||
} else {
|
} else {
|
||||||
clip.MaximumVPIndex = 0;
|
clip.MaximumVPIndex = 0;
|
||||||
}
|
}
|
||||||
@@ -1344,7 +1349,8 @@ emit_3dstate_clip(struct anv_graphics_pipeline *pipeline,
|
|||||||
(wm_prog_data->barycentric_interp_modes &
|
(wm_prog_data->barycentric_interp_modes &
|
||||||
BRW_BARYCENTRIC_NONPERSPECTIVE_BITS) != 0 : 0;
|
BRW_BARYCENTRIC_NONPERSPECTIVE_BITS) != 0 : 0;
|
||||||
#endif
|
#endif
|
||||||
}
|
|
||||||
|
GENX(3DSTATE_CLIP_pack)(NULL, pipeline->gen7.clip, &clip);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@@ -2260,7 +2266,8 @@ genX(graphics_pipeline_create)(
|
|||||||
emit_3dstate_clip(pipeline,
|
emit_3dstate_clip(pipeline,
|
||||||
pCreateInfo->pInputAssemblyState,
|
pCreateInfo->pInputAssemblyState,
|
||||||
vp_info,
|
vp_info,
|
||||||
pCreateInfo->pRasterizationState);
|
pCreateInfo->pRasterizationState,
|
||||||
|
dynamic_states);
|
||||||
emit_3dstate_streamout(pipeline, pCreateInfo->pRasterizationState);
|
emit_3dstate_streamout(pipeline, pCreateInfo->pRasterizationState);
|
||||||
|
|
||||||
#if GEN_GEN == 12
|
#if GEN_GEN == 12
|
||||||
|
Reference in New Issue
Block a user