}
ALWAYS_INLINE static void
-genX(emit_gs)(struct anv_cmd_buffer *cmd_buffer)
-{
- struct anv_graphics_pipeline *pipeline = cmd_buffer->state.gfx.pipeline;
- if (!anv_pipeline_has_stage(pipeline, MESA_SHADER_GEOMETRY))
- return;
-
- uint32_t dwords[GENX(3DSTATE_GS_length)];
- const struct vk_dynamic_graphics_state *dyn =
- &cmd_buffer->vk.dynamic_graphics_state;
-
- struct GENX(3DSTATE_GS) gs = {
- GENX(3DSTATE_GS_header),
- };
-
- switch (dyn->rs.provoking_vertex) {
- case VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT:
- gs.ReorderMode = LEADING;
- break;
-
- case VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT:
- gs.ReorderMode = TRAILING;
- break;
-
- default:
- unreachable("Invalid provoking vertex mode");
- }
-
- GENX(3DSTATE_GS_pack)(NULL, dwords, &gs);
- anv_batch_emit_merge(&cmd_buffer->batch, dwords, pipeline->gfx8.gs);
-}
-
-ALWAYS_INLINE static void
genX(cmd_buffer_flush_gfx_state)(struct anv_cmd_buffer *cmd_buffer)
{
struct anv_graphics_pipeline *pipeline = cmd_buffer->state.gfx.pipeline;
genX(emit_hs)(cmd_buffer);
}
- if (cmd_buffer->state.gfx.dirty & ANV_CMD_DIRTY_PIPELINE ||
- BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_PROVOKING_VERTEX)) {
- genX(emit_gs)(cmd_buffer);
- }
-
if (!cmd_buffer->state.gfx.dirty && !descriptors_dirty &&
!any_dynamic_state_dirty &&
((cmd_buffer->state.push_constants_dirty &
static void
emit_3dstate_gs(struct anv_graphics_pipeline *pipeline)
{
- struct anv_batch *batch = &pipeline->base.base.batch;
const struct intel_device_info *devinfo = pipeline->base.base.device->info;
const struct anv_shader_bin *gs_bin =
pipeline->base.shaders[MESA_SHADER_GEOMETRY];
- if (!anv_pipeline_has_stage(pipeline, MESA_SHADER_GEOMETRY)) {
- anv_batch_emit(batch, GENX(3DSTATE_GS), gs);
- return;
- }
-
- const struct brw_gs_prog_data *gs_prog_data = get_gs_prog_data(pipeline);
-
struct GENX(3DSTATE_GS) gs = {
GENX(3DSTATE_GS_header),
};
- gs.Enable = true;
- gs.StatisticsEnable = true;
- gs.KernelStartPointer = gs_bin->kernel.offset;
- gs.DispatchMode = gs_prog_data->base.dispatch_mode;
+ if (anv_pipeline_has_stage(pipeline, MESA_SHADER_GEOMETRY)) {
+ const struct brw_gs_prog_data *gs_prog_data = get_gs_prog_data(pipeline);
- gs.SingleProgramFlow = false;
- gs.VectorMaskEnable = false;
- /* Wa_1606682166 */
- gs.SamplerCount = GFX_VER == 11 ? 0 : get_sampler_count(gs_bin);
- gs.BindingTableEntryCount = gs_bin->bind_map.surface_count;
- gs.IncludeVertexHandles = gs_prog_data->base.include_vue_handles;
- gs.IncludePrimitiveID = gs_prog_data->include_primitive_id;
-
- gs.MaximumNumberofThreads = devinfo->max_gs_threads - 1;
-
- gs.OutputVertexSize = gs_prog_data->output_vertex_size_hwords * 2 - 1;
- gs.OutputTopology = gs_prog_data->output_topology;
- gs.ControlDataFormat = gs_prog_data->control_data_format;
- gs.ControlDataHeaderSize = gs_prog_data->control_data_header_size_hwords;
- gs.InstanceControl = MAX2(gs_prog_data->invocations, 1) - 1;
- gs.ReorderMode = LEADING;
-
- gs.ExpectedVertexCount = gs_prog_data->vertices_in;
- gs.StaticOutput = gs_prog_data->static_vertex_count >= 0;
- gs.StaticOutputVertexCount = gs_prog_data->static_vertex_count >= 0 ?
- gs_prog_data->static_vertex_count : 0;
-
- gs.VertexURBEntryReadOffset = 0;
- gs.VertexURBEntryReadLength = gs_prog_data->base.urb_read_length;
- gs.DispatchGRFStartRegisterForURBData =
- gs_prog_data->base.base.dispatch_grf_start_reg;
-
- gs.UserClipDistanceClipTestEnableBitmask =
- gs_prog_data->base.clip_distance_mask;
- gs.UserClipDistanceCullTestEnableBitmask =
- gs_prog_data->base.cull_distance_mask;
+ gs.Enable = true;
+ gs.StatisticsEnable = true;
+ gs.KernelStartPointer = gs_bin->kernel.offset;
+ gs.DispatchMode = gs_prog_data->base.dispatch_mode;
+
+ gs.SingleProgramFlow = false;
+ gs.VectorMaskEnable = false;
+ /* Wa_1606682166 */
+ gs.SamplerCount = GFX_VER == 11 ? 0 : get_sampler_count(gs_bin);
+ gs.BindingTableEntryCount = gs_bin->bind_map.surface_count;
+ gs.IncludeVertexHandles = gs_prog_data->base.include_vue_handles;
+ gs.IncludePrimitiveID = gs_prog_data->include_primitive_id;
+
+ gs.MaximumNumberofThreads = devinfo->max_gs_threads - 1;
+
+ gs.OutputVertexSize = gs_prog_data->output_vertex_size_hwords * 2 - 1;
+ gs.OutputTopology = gs_prog_data->output_topology;
+ gs.ControlDataFormat = gs_prog_data->control_data_format;
+ gs.ControlDataHeaderSize = gs_prog_data->control_data_header_size_hwords;
+ gs.InstanceControl = MAX2(gs_prog_data->invocations, 1) - 1;
+ gs.ReorderMode = LEADING;
+
+ gs.ExpectedVertexCount = gs_prog_data->vertices_in;
+ gs.StaticOutput = gs_prog_data->static_vertex_count >= 0;
+ gs.StaticOutputVertexCount = gs_prog_data->static_vertex_count >= 0 ?
+ gs_prog_data->static_vertex_count : 0;
+
+ gs.VertexURBEntryReadOffset = 0;
+ gs.VertexURBEntryReadLength = gs_prog_data->base.urb_read_length;
+ gs.DispatchGRFStartRegisterForURBData =
+ gs_prog_data->base.base.dispatch_grf_start_reg;
+
+ gs.UserClipDistanceClipTestEnableBitmask =
+ gs_prog_data->base.clip_distance_mask;
+ gs.UserClipDistanceCullTestEnableBitmask =
+ gs_prog_data->base.cull_distance_mask;
#if GFX_VERx10 >= 125
- gs.ScratchSpaceBuffer =
- get_scratch_surf(&pipeline->base.base, MESA_SHADER_GEOMETRY, gs_bin);
+ gs.ScratchSpaceBuffer =
+ get_scratch_surf(&pipeline->base.base, MESA_SHADER_GEOMETRY, gs_bin);
#else
- gs.PerThreadScratchSpace = get_scratch_space(gs_bin);
- gs.ScratchSpaceBasePointer =
- get_scratch_address(&pipeline->base.base, MESA_SHADER_GEOMETRY, gs_bin);
+ gs.PerThreadScratchSpace = get_scratch_space(gs_bin);
+ gs.ScratchSpaceBasePointer =
+ get_scratch_address(&pipeline->base.base, MESA_SHADER_GEOMETRY, gs_bin);
#endif
+ }
GENX(3DSTATE_GS_pack)(&pipeline->base.base.batch, pipeline->gfx8.gs, &gs);
}
}
static void
+genX(emit_gs)(struct anv_cmd_buffer *cmd_buffer)
+{
+ struct anv_graphics_pipeline *pipeline = cmd_buffer->state.gfx.pipeline;
+ if (!anv_pipeline_has_stage(pipeline, MESA_SHADER_GEOMETRY)) {
+ anv_batch_emit(&cmd_buffer->batch, GENX(3DSTATE_GS), gs);
+ return;
+ }
+
+ uint32_t dwords[GENX(3DSTATE_GS_length)];
+ const struct vk_dynamic_graphics_state *dyn =
+ &cmd_buffer->vk.dynamic_graphics_state;
+
+ struct GENX(3DSTATE_GS) gs = {
+ GENX(3DSTATE_GS_header),
+ };
+
+ switch (dyn->rs.provoking_vertex) {
+ case VK_PROVOKING_VERTEX_MODE_FIRST_VERTEX_EXT:
+ gs.ReorderMode = LEADING;
+ break;
+
+ case VK_PROVOKING_VERTEX_MODE_LAST_VERTEX_EXT:
+ gs.ReorderMode = TRAILING;
+ break;
+
+ default:
+ unreachable("Invalid provoking vertex mode");
+ }
+
+ GENX(3DSTATE_GS_pack)(NULL, dwords, &gs);
+ anv_batch_emit_merge(&cmd_buffer->batch, dwords, pipeline->gfx8.gs);
+}
+
+static void
genX(cmd_emit_sample_mask)(struct anv_cmd_buffer *cmd_buffer)
{
const struct vk_dynamic_graphics_state *dyn =
genX(cmd_emit_te)(cmd_buffer);
}
+ if ((cmd_buffer->state.gfx.dirty & ANV_CMD_DIRTY_PIPELINE) ||
+ BITSET_TEST(dyn->dirty, MESA_VK_DYNAMIC_RS_PROVOKING_VERTEX)) {
+ genX(emit_gs)(cmd_buffer);
+ }
+
#if GFX_VER >= 11
if (cmd_buffer->device->vk.enabled_extensions.KHR_fragment_shading_rate &&
(cmd_buffer->state.gfx.dirty & ANV_CMD_DIRTY_PIPELINE ||