1
0
forked from rpms/mesa

Add support for Raspberry Pi 2712D0 stepping

This commit is contained in:
Koichiro Iwao 2025-04-09 13:06:44 +09:00
parent a1b615a267
commit 00d43ee865
2 changed files with 749 additions and 2 deletions

View File

@ -0,0 +1,736 @@
From 646544da9e3b50cc72b963fe9693c979dbbbf636 Mon Sep 17 00:00:00 2001
From: Iago Toral Quiroga <itoral@igalia.com>
Date: Tue, 14 May 2024 09:40:16 +0200
Subject: [PATCH 1/3] broadcom/cle: fix up shader record for V3D 7.1.10 /
2712D0
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29189>
(cherry picked from commit 7b807c3e948398da96293c6252c57505e11c74c9)
---
src/broadcom/cle/v3d_packet.xml | 63 +++++++++++++++++++++++++++++++++
1 file changed, 63 insertions(+)
diff --git a/src/broadcom/cle/v3d_packet.xml b/src/broadcom/cle/v3d_packet.xml
index 09dde392fac..4763b891aab 100644
--- a/src/broadcom/cle/v3d_packet.xml
+++ b/src/broadcom/cle/v3d_packet.xml
@@ -1211,6 +1211,69 @@
<field name="Coordinate Shader Uniforms Address" size="32" start="28b" type="address"/>
</struct>
+ <!-- This one is exclusive to 2712D0 (V3D 7.1.10) -->
+ <struct name="GL Shader State Record Draw Index" min_ver="71">
+ <field name="Point size in shaded vertex data" size="1" start="0" type="bool"/>
+ <field name="Enable clipping" size="1" start="1" type="bool"/>
+
+ <field name="Vertex ID read by coordinate shader" size="1" start="2" type="bool"/>
+ <field name="Instance ID read by coordinate shader" size="1" start="3" type="bool"/>
+ <field name="Base Instance ID read by coordinate shader" size="1" start="4" type="bool"/>
+ <field name="cs_basevertex" size="1" start="5" type="bool"/>
+ <field name="cs_drawindex" size="1" start="6" type="bool"/>
+
+ <field name="Vertex ID read by vertex shader" size="1" start="7" type="bool"/>
+ <field name="Instance ID read by vertex shader" size="1" start="8" type="bool"/>
+ <field name="Base Instance ID read by vertex shader" size="1" start="9" type="bool"/>
+ <field name="vs_basevertex" size="1" start="10" type="bool"/>
+ <field name="vs_drawindex" size="1" start="11" type="bool"/>
+
+ <field name="Fragment shader does Z writes" size="1" start="12" type="bool"/>
+ <field name="Turn off early-z test" size="1" start="13" type="bool"/>
+
+ <field name="Fragment shader uses real pixel centre W in addition to centroid W2" size="1" start="15" type="bool"/>
+ <field name="Enable Sample Rate Shading" size="1" start="16" type="bool"/>
+ <field name="Any shader reads hardware-written Primitive ID" size="1" start="17" type="bool"/>
+ <field name="Insert Primitive ID as first varying to fragment shader" size="1" start="18" type="bool"/>
+ <field name="Turn off scoreboard" size="1" start="19" type="bool"/>
+ <field name="Do scoreboard wait on first thread switch" size="1" start="20" type="bool"/>
+ <field name="Disable implicit point/line varyings" size="1" start="21" type="bool"/>
+ <field name="No prim pack" size="1" start="22" type="bool"/>
+ <field name="Never defer FEP depth writes" size="1" start="23" type="bool"/>
+
+ <field name="Number of varyings in Fragment Shader" size="8" start="3b" type="uint"/>
+
+ <field name="Coordinate Shader output VPM segment size" size="4" start="4b" type="uint"/>
+ <field name="Min Coord Shader output segments required in play in addition to VCM cache size" size="4" start="36" type="uint"/>
+
+ <field name="Coordinate Shader input VPM segment size" size="4" start="5b" type="uint"/>
+ <field name="Min Coord Shader input segments required in play" size="4" start="44" type="uint" minus_one="true"/>
+
+ <field name="Vertex Shader output VPM segment size" size="4" start="6b" type="uint"/>
+ <field name="Min Vertex Shader output segments required in play in addition to VCM cache size" size="4" start="52" type="uint"/>
+
+ <field name="Vertex Shader input VPM segment size" size="4" start="7b" type="uint"/>
+ <field name="Min Vertex Shader input segments required in play" size="4" start="60" type="uint" minus_one="true"/>
+
+ <field name="Fragment Shader Code Address" size="29" start="67" type="address"/>
+ <field name="Fragment Shader 4-way threadable" size="1" start="64" type="bool"/>
+ <field name="Fragment Shader start in final thread section" size="1" start="65" type="bool"/>
+ <field name="Fragment Shader Propagate NaNs" size="1" start="66" type="bool"/>
+ <field name="Fragment Shader Uniforms Address" size="32" start="12b" type="address"/>
+
+ <field name="Vertex Shader Code Address" size="29" start="131" type="address"/>
+ <field name="Vertex Shader 4-way threadable" size="1" start="128" type="bool"/>
+ <field name="Vertex Shader start in final thread section" size="1" start="129" type="bool"/>
+ <field name="Vertex Shader Propagate NaNs" size="1" start="130" type="bool"/>
+ <field name="Vertex Shader Uniforms Address" size="32" start="20b" type="address"/>
+
+ <field name="Coordinate Shader Code Address" size="29" start="195" type="address"/>
+ <field name="Coordinate Shader 4-way threadable" size="1" start="192" type="bool"/>
+ <field name="Coordinate Shader start in final thread section" size="1" start="193" type="bool"/>
+ <field name="Coordinate Shader Propagate NaNs" size="1" start="194" type="bool"/>
+ <field name="Coordinate Shader Uniforms Address" size="32" start="28b" type="address"/>
+ </struct>
+
<struct name="Geometry Shader State Record">
<field name="Geometry Bin Mode Shader Code Address" size="29" start="3" type="address"/>
<field name="Geometry Bin Mode Shader 4-way threadable" size="1" start="0" type="bool"/>
--
2.49.0
From 576044e52be2c504ef011029015ecce1b95744b6 Mon Sep 17 00:00:00 2001
From: Iago Toral Quiroga <itoral@igalia.com>
Date: Tue, 14 May 2024 10:24:07 +0200
Subject: [PATCH 2/3] v3d: support 2712D0
2710D0 has V3D 7.1.10 which included draw index and
base vertex in the shader state record packet, shuffling
the locations of most of its fields. Handle this at run
time by emitting the appropriate packet based on the
V3D version since our current versoning framework doesn't
support changes based on revision number alone.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29189>
(cherry picked from commit 1fc846dce396e2e0d1be23568e22ae2510df71bd)
---
src/broadcom/common/v3d_device_info.h | 6 +
src/gallium/drivers/v3d/v3dx_draw.c | 354 +++++++++++++++++---------
2 files changed, 233 insertions(+), 127 deletions(-)
diff --git a/src/broadcom/common/v3d_device_info.h b/src/broadcom/common/v3d_device_info.h
index 8dfc7858727..0df25e8dcce 100644
--- a/src/broadcom/common/v3d_device_info.h
+++ b/src/broadcom/common/v3d_device_info.h
@@ -52,4 +52,10 @@ typedef int (*v3d_ioctl_fun)(int fd, unsigned long request, void *arg);
bool
v3d_get_device_info(int fd, struct v3d_device_info* devinfo, v3d_ioctl_fun fun);
+static inline bool
+v3d_device_has_draw_index(struct v3d_device_info *devinfo)
+{
+ return devinfo->ver > 71 || (devinfo->ver == 71 && devinfo->rev >= 10);
+}
+
#endif
diff --git a/src/gallium/drivers/v3d/v3dx_draw.c b/src/gallium/drivers/v3d/v3dx_draw.c
index 6bcb5818fb4..754bd54f0b0 100644
--- a/src/gallium/drivers/v3d/v3dx_draw.c
+++ b/src/gallium/drivers/v3d/v3dx_draw.c
@@ -471,6 +471,230 @@ v3d_emit_tes_gs_shader_params(struct v3d_job *job,
}
}
+static void
+emit_shader_state_record(struct v3d_context *v3d,
+ struct v3d_job *job,
+ const struct pipe_draw_info *info,
+ struct v3d_vertex_stateobj *vtx,
+ struct v3d_cl_reloc cs_uniforms,
+ struct v3d_cl_reloc vs_uniforms,
+ struct v3d_cl_reloc fs_uniforms,
+ struct vpm_config *vpm_cfg_bin,
+ struct vpm_config *vpm_cfg)
+{
+#if V3D_VERSION >= 71
+ /* 2712D0 (V3D 7.1.10) has included draw index and base vertex,
+ * shuffling all the fields in the packet. Since the versioning
+ * framework doesn't handle revision numbers, the XML has a
+ * different shader state record packet including the new fields
+ * and we decide at run time which packet we need to emit.
+ */
+ if (v3d_device_has_draw_index(&v3d->screen->devinfo)) {
+ cl_emit(&job->indirect, GL_SHADER_STATE_RECORD_DRAW_INDEX, shader) {
+ shader.enable_clipping = true;
+ shader.point_size_in_shaded_vertex_data =
+ (info->mode == MESA_PRIM_POINTS &&
+ v3d->rasterizer->base.point_size_per_vertex);
+ shader.fragment_shader_does_z_writes =
+ v3d->prog.fs->prog_data.fs->writes_z;
+ shader.turn_off_early_z_test =
+ v3d->prog.fs->prog_data.fs->disable_ez;
+ shader.fragment_shader_uses_real_pixel_centre_w_in_addition_to_centroid_w2 =
+ v3d->prog.fs->prog_data.fs->uses_center_w;
+ shader.any_shader_reads_hardware_written_primitive_id =
+ (v3d->prog.gs && v3d->prog.gs->prog_data.gs->uses_pid) ||
+ v3d->prog.fs->prog_data.fs->uses_pid;
+ shader.insert_primitive_id_as_first_varying_to_fragment_shader =
+ !v3d->prog.gs && v3d->prog.fs->prog_data.fs->uses_pid;
+ shader.do_scoreboard_wait_on_first_thread_switch =
+ v3d->prog.fs->prog_data.fs->lock_scoreboard_on_first_thrsw;
+ shader.disable_implicit_point_line_varyings =
+ !v3d->prog.fs->prog_data.fs->uses_implicit_point_line_varyings;
+ shader.number_of_varyings_in_fragment_shader =
+ v3d->prog.fs->prog_data.fs->num_inputs;
+ shader.coordinate_shader_code_address =
+ cl_address(v3d_resource(v3d->prog.cs->resource)->bo,
+ v3d->prog.cs->offset);
+ shader.vertex_shader_code_address =
+ cl_address(v3d_resource(v3d->prog.vs->resource)->bo,
+ v3d->prog.vs->offset);
+ shader.fragment_shader_code_address =
+ cl_address(v3d_resource(v3d->prog.fs->resource)->bo,
+ v3d->prog.fs->offset);
+ shader.coordinate_shader_input_vpm_segment_size =
+ v3d->prog.cs->prog_data.vs->vpm_input_size;
+ shader.vertex_shader_input_vpm_segment_size =
+ v3d->prog.vs->prog_data.vs->vpm_input_size;
+ shader.coordinate_shader_output_vpm_segment_size =
+ v3d->prog.cs->prog_data.vs->vpm_output_size;
+ shader.vertex_shader_output_vpm_segment_size =
+ v3d->prog.vs->prog_data.vs->vpm_output_size;
+ shader.coordinate_shader_uniforms_address = cs_uniforms;
+ shader.vertex_shader_uniforms_address = vs_uniforms;
+ shader.fragment_shader_uniforms_address = fs_uniforms;
+ shader.min_coord_shader_input_segments_required_in_play =
+ vpm_cfg_bin->As;
+ shader.min_vertex_shader_input_segments_required_in_play =
+ vpm_cfg->As;
+ shader.min_coord_shader_output_segments_required_in_play_in_addition_to_vcm_cache_size =
+ vpm_cfg_bin->Ve;
+ shader.min_vertex_shader_output_segments_required_in_play_in_addition_to_vcm_cache_size =
+ vpm_cfg->Ve;
+ shader.coordinate_shader_4_way_threadable =
+ v3d->prog.cs->prog_data.vs->base.threads == 4;
+ shader.vertex_shader_4_way_threadable =
+ v3d->prog.vs->prog_data.vs->base.threads == 4;
+ shader.fragment_shader_4_way_threadable =
+ v3d->prog.fs->prog_data.fs->base.threads == 4;
+ shader.coordinate_shader_start_in_final_thread_section =
+ v3d->prog.cs->prog_data.vs->base.single_seg;
+ shader.vertex_shader_start_in_final_thread_section =
+ v3d->prog.vs->prog_data.vs->base.single_seg;
+ shader.fragment_shader_start_in_final_thread_section =
+ v3d->prog.fs->prog_data.fs->base.single_seg;
+ shader.vertex_id_read_by_coordinate_shader =
+ v3d->prog.cs->prog_data.vs->uses_vid;
+ shader.instance_id_read_by_coordinate_shader =
+ v3d->prog.cs->prog_data.vs->uses_iid;
+ shader.vertex_id_read_by_vertex_shader =
+ v3d->prog.vs->prog_data.vs->uses_vid;
+ shader.instance_id_read_by_vertex_shader =
+ v3d->prog.vs->prog_data.vs->uses_iid;
+ }
+ return;
+ }
+#endif
+
+ assert(!v3d_device_has_draw_index(&v3d->screen->devinfo));
+ cl_emit(&job->indirect, GL_SHADER_STATE_RECORD, shader) {
+ shader.enable_clipping = true;
+ /* V3D_DIRTY_PRIM_MODE | V3D_DIRTY_RASTERIZER */
+ shader.point_size_in_shaded_vertex_data =
+ (info->mode == MESA_PRIM_POINTS &&
+ v3d->rasterizer->base.point_size_per_vertex);
+
+ /* Must be set if the shader modifies Z, discards, or modifies
+ * the sample mask. For any of these cases, the fragment
+ * shader needs to write the Z value (even just discards).
+ */
+ shader.fragment_shader_does_z_writes =
+ v3d->prog.fs->prog_data.fs->writes_z;
+
+ /* Set if the EZ test must be disabled (due to shader side
+ * effects and the early_z flag not being present in the
+ * shader).
+ */
+ shader.turn_off_early_z_test =
+ v3d->prog.fs->prog_data.fs->disable_ez;
+
+ shader.fragment_shader_uses_real_pixel_centre_w_in_addition_to_centroid_w2 =
+ v3d->prog.fs->prog_data.fs->uses_center_w;
+
+ shader.any_shader_reads_hardware_written_primitive_id =
+ (v3d->prog.gs && v3d->prog.gs->prog_data.gs->uses_pid) ||
+ v3d->prog.fs->prog_data.fs->uses_pid;
+ shader.insert_primitive_id_as_first_varying_to_fragment_shader =
+ !v3d->prog.gs && v3d->prog.fs->prog_data.fs->uses_pid;
+
+ shader.do_scoreboard_wait_on_first_thread_switch =
+ v3d->prog.fs->prog_data.fs->lock_scoreboard_on_first_thrsw;
+ shader.disable_implicit_point_line_varyings =
+ !v3d->prog.fs->prog_data.fs->uses_implicit_point_line_varyings;
+
+ shader.number_of_varyings_in_fragment_shader =
+ v3d->prog.fs->prog_data.fs->num_inputs;
+
+ shader.coordinate_shader_code_address =
+ cl_address(v3d_resource(v3d->prog.cs->resource)->bo,
+ v3d->prog.cs->offset);
+ shader.vertex_shader_code_address =
+ cl_address(v3d_resource(v3d->prog.vs->resource)->bo,
+ v3d->prog.vs->offset);
+ shader.fragment_shader_code_address =
+ cl_address(v3d_resource(v3d->prog.fs->resource)->bo,
+ v3d->prog.fs->offset);
+
+#if V3D_VERSION == 42
+ shader.coordinate_shader_propagate_nans = true;
+ shader.vertex_shader_propagate_nans = true;
+ shader.fragment_shader_propagate_nans = true;
+
+ /* XXX: Use combined input/output size flag in the common
+ * case.
+ */
+ shader.coordinate_shader_has_separate_input_and_output_vpm_blocks =
+ v3d->prog.cs->prog_data.vs->separate_segments;
+ shader.vertex_shader_has_separate_input_and_output_vpm_blocks =
+ v3d->prog.vs->prog_data.vs->separate_segments;
+ shader.coordinate_shader_input_vpm_segment_size =
+ v3d->prog.cs->prog_data.vs->separate_segments ?
+ v3d->prog.cs->prog_data.vs->vpm_input_size : 1;
+ shader.vertex_shader_input_vpm_segment_size =
+ v3d->prog.vs->prog_data.vs->separate_segments ?
+ v3d->prog.vs->prog_data.vs->vpm_input_size : 1;
+#endif
+ /* On V3D 7.1 there isn't a specific flag to set if we are using
+ * shared/separate segments or not. We just set the value of
+ * vpm_input_size to 0, and set output to the max needed. That should be
+ * already properly set on prog_data_vs_bin
+ */
+#if V3D_VERSION == 71
+ shader.coordinate_shader_input_vpm_segment_size =
+ v3d->prog.cs->prog_data.vs->vpm_input_size;
+ shader.vertex_shader_input_vpm_segment_size =
+ v3d->prog.vs->prog_data.vs->vpm_input_size;
+#endif
+
+ shader.coordinate_shader_output_vpm_segment_size =
+ v3d->prog.cs->prog_data.vs->vpm_output_size;
+ shader.vertex_shader_output_vpm_segment_size =
+ v3d->prog.vs->prog_data.vs->vpm_output_size;
+
+ shader.coordinate_shader_uniforms_address = cs_uniforms;
+ shader.vertex_shader_uniforms_address = vs_uniforms;
+ shader.fragment_shader_uniforms_address = fs_uniforms;
+
+ shader.min_coord_shader_input_segments_required_in_play =
+ vpm_cfg_bin->As;
+ shader.min_vertex_shader_input_segments_required_in_play =
+ vpm_cfg->As;
+
+ shader.min_coord_shader_output_segments_required_in_play_in_addition_to_vcm_cache_size =
+ vpm_cfg_bin->Ve;
+ shader.min_vertex_shader_output_segments_required_in_play_in_addition_to_vcm_cache_size =
+ vpm_cfg->Ve;
+
+ shader.coordinate_shader_4_way_threadable =
+ v3d->prog.cs->prog_data.vs->base.threads == 4;
+ shader.vertex_shader_4_way_threadable =
+ v3d->prog.vs->prog_data.vs->base.threads == 4;
+ shader.fragment_shader_4_way_threadable =
+ v3d->prog.fs->prog_data.fs->base.threads == 4;
+
+ shader.coordinate_shader_start_in_final_thread_section =
+ v3d->prog.cs->prog_data.vs->base.single_seg;
+ shader.vertex_shader_start_in_final_thread_section =
+ v3d->prog.vs->prog_data.vs->base.single_seg;
+ shader.fragment_shader_start_in_final_thread_section =
+ v3d->prog.fs->prog_data.fs->base.single_seg;
+
+ shader.vertex_id_read_by_coordinate_shader =
+ v3d->prog.cs->prog_data.vs->uses_vid;
+ shader.instance_id_read_by_coordinate_shader =
+ v3d->prog.cs->prog_data.vs->uses_iid;
+ shader.vertex_id_read_by_vertex_shader =
+ v3d->prog.vs->prog_data.vs->uses_vid;
+ shader.instance_id_read_by_vertex_shader =
+ v3d->prog.vs->prog_data.vs->uses_iid;
+
+#if V3D_VERSION == 42
+ shader.address_of_default_attribute_values =
+ cl_address(v3d_resource(vtx->defaults)->bo,
+ vtx->defaults_offset);
+#endif
+ }
+}
+
static void
v3d_emit_gl_shader_state(struct v3d_context *v3d,
const struct pipe_draw_info *info)
@@ -580,133 +804,9 @@ v3d_emit_gl_shader_state(struct v3d_context *v3d,
vpm_cfg.Gv);
}
- cl_emit(&job->indirect, GL_SHADER_STATE_RECORD, shader) {
- shader.enable_clipping = true;
- /* V3D_DIRTY_PRIM_MODE | V3D_DIRTY_RASTERIZER */
- shader.point_size_in_shaded_vertex_data =
- (info->mode == MESA_PRIM_POINTS &&
- v3d->rasterizer->base.point_size_per_vertex);
-
- /* Must be set if the shader modifies Z, discards, or modifies
- * the sample mask. For any of these cases, the fragment
- * shader needs to write the Z value (even just discards).
- */
- shader.fragment_shader_does_z_writes =
- v3d->prog.fs->prog_data.fs->writes_z;
-
- /* Set if the EZ test must be disabled (due to shader side
- * effects and the early_z flag not being present in the
- * shader).
- */
- shader.turn_off_early_z_test =
- v3d->prog.fs->prog_data.fs->disable_ez;
-
- shader.fragment_shader_uses_real_pixel_centre_w_in_addition_to_centroid_w2 =
- v3d->prog.fs->prog_data.fs->uses_center_w;
-
- shader.any_shader_reads_hardware_written_primitive_id =
- (v3d->prog.gs && v3d->prog.gs->prog_data.gs->uses_pid) ||
- v3d->prog.fs->prog_data.fs->uses_pid;
- shader.insert_primitive_id_as_first_varying_to_fragment_shader =
- !v3d->prog.gs && v3d->prog.fs->prog_data.fs->uses_pid;
-
- shader.do_scoreboard_wait_on_first_thread_switch =
- v3d->prog.fs->prog_data.fs->lock_scoreboard_on_first_thrsw;
- shader.disable_implicit_point_line_varyings =
- !v3d->prog.fs->prog_data.fs->uses_implicit_point_line_varyings;
-
- shader.number_of_varyings_in_fragment_shader =
- v3d->prog.fs->prog_data.fs->num_inputs;
-
- shader.coordinate_shader_code_address =
- cl_address(v3d_resource(v3d->prog.cs->resource)->bo,
- v3d->prog.cs->offset);
- shader.vertex_shader_code_address =
- cl_address(v3d_resource(v3d->prog.vs->resource)->bo,
- v3d->prog.vs->offset);
- shader.fragment_shader_code_address =
- cl_address(v3d_resource(v3d->prog.fs->resource)->bo,
- v3d->prog.fs->offset);
-
-#if V3D_VERSION == 42
- shader.coordinate_shader_propagate_nans = true;
- shader.vertex_shader_propagate_nans = true;
- shader.fragment_shader_propagate_nans = true;
-
- /* XXX: Use combined input/output size flag in the common
- * case.
- */
- shader.coordinate_shader_has_separate_input_and_output_vpm_blocks =
- v3d->prog.cs->prog_data.vs->separate_segments;
- shader.vertex_shader_has_separate_input_and_output_vpm_blocks =
- v3d->prog.vs->prog_data.vs->separate_segments;
- shader.coordinate_shader_input_vpm_segment_size =
- v3d->prog.cs->prog_data.vs->separate_segments ?
- v3d->prog.cs->prog_data.vs->vpm_input_size : 1;
- shader.vertex_shader_input_vpm_segment_size =
- v3d->prog.vs->prog_data.vs->separate_segments ?
- v3d->prog.vs->prog_data.vs->vpm_input_size : 1;
-#endif
- /* On V3D 7.1 there isn't a specific flag to set if we are using
- * shared/separate segments or not. We just set the value of
- * vpm_input_size to 0, and set output to the max needed. That should be
- * already properly set on prog_data_vs_bin
- */
-#if V3D_VERSION == 71
- shader.coordinate_shader_input_vpm_segment_size =
- v3d->prog.cs->prog_data.vs->vpm_input_size;
- shader.vertex_shader_input_vpm_segment_size =
- v3d->prog.vs->prog_data.vs->vpm_input_size;
-#endif
-
- shader.coordinate_shader_output_vpm_segment_size =
- v3d->prog.cs->prog_data.vs->vpm_output_size;
- shader.vertex_shader_output_vpm_segment_size =
- v3d->prog.vs->prog_data.vs->vpm_output_size;
-
- shader.coordinate_shader_uniforms_address = cs_uniforms;
- shader.vertex_shader_uniforms_address = vs_uniforms;
- shader.fragment_shader_uniforms_address = fs_uniforms;
-
- shader.min_coord_shader_input_segments_required_in_play =
- vpm_cfg_bin.As;
- shader.min_vertex_shader_input_segments_required_in_play =
- vpm_cfg.As;
-
- shader.min_coord_shader_output_segments_required_in_play_in_addition_to_vcm_cache_size =
- vpm_cfg_bin.Ve;
- shader.min_vertex_shader_output_segments_required_in_play_in_addition_to_vcm_cache_size =
- vpm_cfg.Ve;
-
- shader.coordinate_shader_4_way_threadable =
- v3d->prog.cs->prog_data.vs->base.threads == 4;
- shader.vertex_shader_4_way_threadable =
- v3d->prog.vs->prog_data.vs->base.threads == 4;
- shader.fragment_shader_4_way_threadable =
- v3d->prog.fs->prog_data.fs->base.threads == 4;
-
- shader.coordinate_shader_start_in_final_thread_section =
- v3d->prog.cs->prog_data.vs->base.single_seg;
- shader.vertex_shader_start_in_final_thread_section =
- v3d->prog.vs->prog_data.vs->base.single_seg;
- shader.fragment_shader_start_in_final_thread_section =
- v3d->prog.fs->prog_data.fs->base.single_seg;
-
- shader.vertex_id_read_by_coordinate_shader =
- v3d->prog.cs->prog_data.vs->uses_vid;
- shader.instance_id_read_by_coordinate_shader =
- v3d->prog.cs->prog_data.vs->uses_iid;
- shader.vertex_id_read_by_vertex_shader =
- v3d->prog.vs->prog_data.vs->uses_vid;
- shader.instance_id_read_by_vertex_shader =
- v3d->prog.vs->prog_data.vs->uses_iid;
-
-#if V3D_VERSION == 42
- shader.address_of_default_attribute_values =
- cl_address(v3d_resource(vtx->defaults)->bo,
- vtx->defaults_offset);
-#endif
- }
+ emit_shader_state_record(v3d, job, info, vtx,
+ cs_uniforms, vs_uniforms, fs_uniforms,
+ &vpm_cfg_bin, &vpm_cfg);
bool cs_loaded_any = false;
const bool cs_uses_builtins = v3d->prog.cs->prog_data.vs->uses_iid ||
--
2.49.0
From de2176a6688d036abdfd6d2a13d4aa9834cf870c Mon Sep 17 00:00:00 2001
From: Iago Toral Quiroga <itoral@igalia.com>
Date: Thu, 23 Nov 2023 11:33:57 +0100
Subject: [PATCH 3/3] v3dv: support 2712D0
2712D0 has V3D 7.1.10 which included draw index and
base vertex in the shader state record packet, shuffling
the locations of most of its fields. Handle this at run
time by emitting the appropriate packet based on the
V3D version since our current versioning framework doesn't
support changes based on revision number alone.
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/29189>
(cherry picked from commit b545e78f12b02069fa363a4a7ef749a996ea3c4b)
---
src/broadcom/vulkan/v3dvx_cmd_buffer.c | 94 +++++++++++++++++---------
src/broadcom/vulkan/v3dvx_pipeline.c | 75 +++++++++++++++++---
2 files changed, 129 insertions(+), 40 deletions(-)
diff --git a/src/broadcom/vulkan/v3dvx_cmd_buffer.c b/src/broadcom/vulkan/v3dvx_cmd_buffer.c
index 1b511408bfe..1b9d02e126c 100644
--- a/src/broadcom/vulkan/v3dvx_cmd_buffer.c
+++ b/src/broadcom/vulkan/v3dvx_cmd_buffer.c
@@ -2343,6 +2343,13 @@ v3dX(cmd_buffer_emit_gl_shader_state)(struct v3dv_cmd_buffer *cmd_buffer)
uint32_t shader_state_record_length =
cl_packet_length(GL_SHADER_STATE_RECORD);
+#if V3D_VERSION >= 71
+ if (v3d_device_has_draw_index(&pipeline->device->devinfo)) {
+ shader_state_record_length =
+ cl_packet_length(GL_SHADER_STATE_RECORD_DRAW_INDEX);
+ }
+#endif
+
if (pipeline->has_gs) {
shader_state_record_length +=
cl_packet_length(GEOMETRY_SHADER_STATE_RECORD) +
@@ -2390,39 +2397,64 @@ v3dX(cmd_buffer_emit_gl_shader_state)(struct v3dv_cmd_buffer *cmd_buffer)
pipeline->device->default_attribute_float;
#endif
- cl_emit_with_prepacked(&job->indirect, GL_SHADER_STATE_RECORD,
- pipeline->shader_state_record, shader) {
-
- /* FIXME: we are setting this values here and during the
- * prepacking. This is because both cl_emit_with_prepacked and v3dvx_pack
- * asserts for minimum values of these. It would be good to get
- * v3dvx_pack to assert on the final value if possible
- */
- shader.min_coord_shader_input_segments_required_in_play =
- pipeline->vpm_cfg_bin.As;
- shader.min_vertex_shader_input_segments_required_in_play =
- pipeline->vpm_cfg.As;
-
- shader.coordinate_shader_code_address =
- v3dv_cl_address(assembly_bo, vs_bin_variant->assembly_offset);
- shader.vertex_shader_code_address =
- v3dv_cl_address(assembly_bo, vs_variant->assembly_offset);
- shader.fragment_shader_code_address =
- v3dv_cl_address(assembly_bo, fs_variant->assembly_offset);
-
- shader.coordinate_shader_uniforms_address = cmd_buffer->state.uniforms.vs_bin;
- shader.vertex_shader_uniforms_address = cmd_buffer->state.uniforms.vs;
- shader.fragment_shader_uniforms_address = cmd_buffer->state.uniforms.fs;
-
-#if V3D_VERSION == 42
- shader.address_of_default_attribute_values =
- v3dv_cl_address(default_attribute_values, 0);
+#if V3D_VERSION >= 71
+ if (v3d_device_has_draw_index(&pipeline->device->devinfo)) {
+ cl_emit_with_prepacked(&job->indirect, GL_SHADER_STATE_RECORD_DRAW_INDEX,
+ pipeline->shader_state_record, shader) {
+ shader.min_coord_shader_input_segments_required_in_play =
+ pipeline->vpm_cfg_bin.As;
+ shader.min_vertex_shader_input_segments_required_in_play =
+ pipeline->vpm_cfg.As;
+ shader.coordinate_shader_code_address =
+ v3dv_cl_address(assembly_bo, vs_bin_variant->assembly_offset);
+ shader.vertex_shader_code_address =
+ v3dv_cl_address(assembly_bo, vs_variant->assembly_offset);
+ shader.fragment_shader_code_address =
+ v3dv_cl_address(assembly_bo, fs_variant->assembly_offset);
+ shader.coordinate_shader_uniforms_address = cmd_buffer->state.uniforms.vs_bin;
+ shader.vertex_shader_uniforms_address = cmd_buffer->state.uniforms.vs;
+ shader.fragment_shader_uniforms_address = cmd_buffer->state.uniforms.fs;
+ shader.any_shader_reads_hardware_written_primitive_id =
+ (pipeline->has_gs && prog_data_gs->uses_pid) || prog_data_fs->uses_pid;
+ shader.insert_primitive_id_as_first_varying_to_fragment_shader =
+ !pipeline->has_gs && prog_data_fs->uses_pid;
+ }
+ } else
#endif
+ {
+ cl_emit_with_prepacked(&job->indirect, GL_SHADER_STATE_RECORD,
+ pipeline->shader_state_record, shader) {
+ /* FIXME: we are setting this values here and during the
+ * prepacking. This is because both cl_emit_with_prepacked and v3dvx_pack
+ * asserts for minimum values of these. It would be good to get
+ * v3dvx_pack to assert on the final value if possible
+ */
+ shader.min_coord_shader_input_segments_required_in_play =
+ pipeline->vpm_cfg_bin.As;
+ shader.min_vertex_shader_input_segments_required_in_play =
+ pipeline->vpm_cfg.As;
- shader.any_shader_reads_hardware_written_primitive_id =
- (pipeline->has_gs && prog_data_gs->uses_pid) || prog_data_fs->uses_pid;
- shader.insert_primitive_id_as_first_varying_to_fragment_shader =
- !pipeline->has_gs && prog_data_fs->uses_pid;
+ shader.coordinate_shader_code_address =
+ v3dv_cl_address(assembly_bo, vs_bin_variant->assembly_offset);
+ shader.vertex_shader_code_address =
+ v3dv_cl_address(assembly_bo, vs_variant->assembly_offset);
+ shader.fragment_shader_code_address =
+ v3dv_cl_address(assembly_bo, fs_variant->assembly_offset);
+
+ shader.coordinate_shader_uniforms_address = cmd_buffer->state.uniforms.vs_bin;
+ shader.vertex_shader_uniforms_address = cmd_buffer->state.uniforms.vs;
+ shader.fragment_shader_uniforms_address = cmd_buffer->state.uniforms.fs;
+
+ #if V3D_VERSION == 42
+ shader.address_of_default_attribute_values =
+ v3dv_cl_address(default_attribute_values, 0);
+ #endif
+
+ shader.any_shader_reads_hardware_written_primitive_id =
+ (pipeline->has_gs && prog_data_gs->uses_pid) || prog_data_fs->uses_pid;
+ shader.insert_primitive_id_as_first_varying_to_fragment_shader =
+ !pipeline->has_gs && prog_data_fs->uses_pid;
+ }
}
/* Upload vertex element attributes (SHADER_STATE_ATTRIBUTE_RECORD) */
diff --git a/src/broadcom/vulkan/v3dvx_pipeline.c b/src/broadcom/vulkan/v3dvx_pipeline.c
index 5ae0d2597b0..ad66374289e 100644
--- a/src/broadcom/vulkan/v3dvx_pipeline.c
+++ b/src/broadcom/vulkan/v3dvx_pipeline.c
@@ -394,6 +394,10 @@ v3dX(pipeline_pack_state)(struct v3dv_pipeline *pipeline,
static void
pack_shader_state_record(struct v3dv_pipeline *pipeline)
{
+ /* To siplify the code we ignore here GL_SHADER_STATE_RECORD_DRAW_INDEX
+ * used with 2712D0, since we know that has the same size as the regular
+ * version.
+ */
assert(sizeof(pipeline->shader_state_record) >=
cl_packet_length(GL_SHADER_STATE_RECORD));
@@ -406,6 +410,14 @@ pack_shader_state_record(struct v3dv_pipeline *pipeline)
struct v3d_vs_prog_data *prog_data_vs_bin =
pipeline->shared_data->variants[BROADCOM_SHADER_VERTEX_BIN]->prog_data.vs;
+ bool point_size_in_shaded_vertex_data;
+ if (!pipeline->has_gs) {
+ point_size_in_shaded_vertex_data = pipeline->topology == MESA_PRIM_POINTS;
+ } else {
+ struct v3d_gs_prog_data *prog_data_gs =
+ pipeline->shared_data->variants[BROADCOM_SHADER_GEOMETRY]->prog_data.gs;
+ point_size_in_shaded_vertex_data = prog_data_gs->writes_psiz;
+ }
/* Note: we are not packing addresses, as we need the job (see
* cl_pack_emit_reloc). Additionally uniforms can't be filled up at this
@@ -413,17 +425,62 @@ pack_shader_state_record(struct v3dv_pipeline *pipeline)
* pipeline (like viewport), . Would need to be filled later, so we are
* doing a partial prepacking.
*/
+#if V3D_VERSION >= 71
+ /* 2712D0 (V3D 7.1.10) has included draw index and base vertex, shuffling all
+ * the fields in the packet. Since the versioning framework doesn't handle
+ * revision numbers, the XML has a different shader state record packet
+ * including the new fields and we device at run time which packet we need
+ * to emit.
+ */
+ if (v3d_device_has_draw_index(&pipeline->device->devinfo)) {
+ v3dvx_pack(pipeline->shader_state_record, GL_SHADER_STATE_RECORD_DRAW_INDEX, shader) {
+ shader.enable_clipping = true;
+ shader.point_size_in_shaded_vertex_data = point_size_in_shaded_vertex_data;
+ shader.fragment_shader_does_z_writes = prog_data_fs->writes_z;
+ shader.turn_off_early_z_test = prog_data_fs->disable_ez;
+ shader.fragment_shader_uses_real_pixel_centre_w_in_addition_to_centroid_w2 =
+ prog_data_fs->uses_center_w;
+ shader.enable_sample_rate_shading =
+ pipeline->sample_rate_shading ||
+ (pipeline->msaa && prog_data_fs->force_per_sample_msaa);
+ shader.any_shader_reads_hardware_written_primitive_id = false;
+ shader.do_scoreboard_wait_on_first_thread_switch =
+ prog_data_fs->lock_scoreboard_on_first_thrsw;
+ shader.disable_implicit_point_line_varyings =
+ !prog_data_fs->uses_implicit_point_line_varyings;
+ shader.number_of_varyings_in_fragment_shader = prog_data_fs->num_inputs;
+ shader.coordinate_shader_input_vpm_segment_size = prog_data_vs_bin->vpm_input_size;
+ shader.vertex_shader_input_vpm_segment_size = prog_data_vs->vpm_input_size;
+ shader.coordinate_shader_output_vpm_segment_size = prog_data_vs_bin->vpm_output_size;
+ shader.vertex_shader_output_vpm_segment_size = prog_data_vs->vpm_output_size;
+ shader.min_coord_shader_input_segments_required_in_play =
+ pipeline->vpm_cfg_bin.As;
+ shader.min_vertex_shader_input_segments_required_in_play =
+ pipeline->vpm_cfg.As;
+ shader.min_coord_shader_output_segments_required_in_play_in_addition_to_vcm_cache_size =
+ pipeline->vpm_cfg_bin.Ve;
+ shader.min_vertex_shader_output_segments_required_in_play_in_addition_to_vcm_cache_size =
+ pipeline->vpm_cfg.Ve;
+ shader.coordinate_shader_4_way_threadable = prog_data_vs_bin->base.threads == 4;
+ shader.vertex_shader_4_way_threadable = prog_data_vs->base.threads == 4;
+ shader.fragment_shader_4_way_threadable = prog_data_fs->base.threads == 4;
+ shader.coordinate_shader_start_in_final_thread_section = prog_data_vs_bin->base.single_seg;
+ shader.vertex_shader_start_in_final_thread_section = prog_data_vs->base.single_seg;
+ shader.fragment_shader_start_in_final_thread_section = prog_data_fs->base.single_seg;
+ shader.vertex_id_read_by_coordinate_shader = prog_data_vs_bin->uses_vid;
+ shader.base_instance_id_read_by_coordinate_shader = prog_data_vs_bin->uses_biid;
+ shader.instance_id_read_by_coordinate_shader = prog_data_vs_bin->uses_iid;
+ shader.vertex_id_read_by_vertex_shader = prog_data_vs->uses_vid;
+ shader.base_instance_id_read_by_vertex_shader = prog_data_vs->uses_biid;
+ shader.instance_id_read_by_vertex_shader = prog_data_vs->uses_iid;
+ }
+ return;
+ }
+#endif
+
v3dvx_pack(pipeline->shader_state_record, GL_SHADER_STATE_RECORD, shader) {
shader.enable_clipping = true;
-
- if (!pipeline->has_gs) {
- shader.point_size_in_shaded_vertex_data =
- pipeline->topology == MESA_PRIM_POINTS;
- } else {
- struct v3d_gs_prog_data *prog_data_gs =
- pipeline->shared_data->variants[BROADCOM_SHADER_GEOMETRY]->prog_data.gs;
- shader.point_size_in_shaded_vertex_data = prog_data_gs->writes_psiz;
- }
+ shader.point_size_in_shaded_vertex_data = point_size_in_shaded_vertex_data;
/* Must be set if the shader modifies Z, discards, or modifies
* the sample mask. For any of these cases, the fragment
--
2.49.0

View File

@ -75,7 +75,7 @@ Name: mesa
Summary: Mesa graphics libraries
%global ver 24.1.2
Version: %{lua:ver = string.gsub(rpm.expand("%{ver}"), "-", "~"); print(ver)}
Release: 3%{?dist}.alma.1
Release: 3%{?dist}.alma.2
License: MIT AND BSD-3-Clause AND SGI-B-2.0
URL: http://www.mesa3d.org
@ -123,6 +123,9 @@ Patch12: 0001-Revert-ac-radeonsi-remove-has_syncobj-has_fence_to_h.patch
# s390x only
Patch100: fix-egl-on-s390x.patch
# Add support for Raspberry Pi 2712D0 stepping
Patch1000: raspberrypi-2712D0.patch
# Build our own version but keep the dependency for the RPM macros
BuildRequires: meson
BuildRequires: gcc
@ -441,6 +444,10 @@ The drivers with support for the Vulkan API.
%ifarch s390x
%autopatch -p1 -m 100
%endif
%ifarch aarch64
%autopatch -p1 -m 1000
%endif
cp %{SOURCE1} docs/
# Extract meson
@ -876,7 +883,11 @@ popd
%endif
%changelog
* Thu Oct 03 2024 Eduard Abdullin <eabdullin@almalinux.org> - 23.3.3-1.alma.1
* Wed Apr 09 2025 Koichiro Iwao <meta@almalinux.org> - 24.1.2-3.alma.2
- Add support for Raspberry Pi 2712D0 stepping
Resolves: https://bugs.almalinux.org/view.php?id=497
* Thu Oct 03 2024 Eduard Abdullin <eabdullin@almalinux.org> - 24.1.2-3.alma.1
- Enable vc4 and v3d for Raspberry Pi graphics in AlmaLinux
Resolves: https://github.com/AlmaLinux/raspberry-pi/issues/32