Module: Mesa Branch: main Commit: 03d102f576857474daf9532267530b6193149212 URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=03d102f576857474daf9532267530b6193149212
Author: Vitaliy Triang3l Kuzmin <trian...@yandex.ru> Date: Sat Oct 7 20:03:35 2023 +0300 r600: Split r600_shader.h into common and Gallium parts Signed-off-by: Vitaliy Triang3l Kuzmin <trian...@yandex.ru> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/25695> --- src/gallium/drivers/r600/eg_asm.c | 4 +- src/gallium/drivers/r600/meson.build | 1 + src/gallium/drivers/r600/r600_shader.h | 144 ++------------------- src/gallium/drivers/r600/r600_shader_common.h | 179 ++++++++++++++++++++++++++ src/gallium/drivers/r600/sfn/sfn_assembler.h | 4 +- 5 files changed, 193 insertions(+), 139 deletions(-) diff --git a/src/gallium/drivers/r600/eg_asm.c b/src/gallium/drivers/r600/eg_asm.c index a98dfd04639..c2ddb794ae7 100644 --- a/src/gallium/drivers/r600/eg_asm.c +++ b/src/gallium/drivers/r600/eg_asm.c @@ -20,9 +20,9 @@ * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE * USE OR OTHER DEALINGS IN THE SOFTWARE. */ -#include "r600_pipe.h" +#include "r600_asm.h" #include "r600_opcodes.h" -#include "r600_shader.h" +#include "r600_shader_common.h" #include "util/u_memory.h" #include "eg_sq.h" diff --git a/src/gallium/drivers/r600/meson.build b/src/gallium/drivers/r600/meson.build index 6167aaa8346..adf21b6a164 100644 --- a/src/gallium/drivers/r600/meson.build +++ b/src/gallium/drivers/r600/meson.build @@ -47,6 +47,7 @@ files_r600 = files( 'r600_public.h', 'r600_shader.c', 'r600_shader.h', + 'r600_shader_common.h', 'r600_sq.h', 'r600_state.c', 'r600_state_common.c', diff --git a/src/gallium/drivers/r600/r600_shader.h b/src/gallium/drivers/r600/r600_shader.h index 06e4311c703..54093b1399e 100644 --- a/src/gallium/drivers/r600/r600_shader.h +++ b/src/gallium/drivers/r600/r600_shader.h @@ -23,148 +23,22 @@ #ifndef R600_SHADER_H #define R600_SHADER_H -#include "r600_asm.h" #include "r600_pipe.h" +#include "r600_shader_common.h" + +#include <assert.h> #ifdef __cplusplus extern "C" { #endif -/* Valid shader configurations: - * - * API shaders VS | TCS | TES | GS |pass| PS - * are compiled as: | | | |thru| - * | | | | | - * Only VS & PS: VS | -- | -- | -- | -- | PS - * With GS: ES | -- | -- | GS | VS | PS - * With Tessel.: LS | HS | VS | -- | -- | PS - * With both: LS | HS | ES | GS | VS | PS - */ - -struct r600_shader_io { - unsigned name; - unsigned gpr; - unsigned done; - unsigned sid; - int spi_sid; - unsigned interpolate; - unsigned ij_index; - unsigned interpolate_location; // TGSI_INTERPOLATE_LOC_CENTER, CENTROID, SAMPLE - unsigned lds_pos; /* for evergreen */ - unsigned back_color_input; - unsigned write_mask; - int ring_offset; - unsigned uses_interpolate_at_centroid; -}; - -struct r600_shader_atomic { - unsigned start, end; - unsigned buffer_id; - unsigned hw_idx; -}; - -struct r600_shader { - unsigned processor_type; - struct r600_bytecode bc; - unsigned ninput; - unsigned noutput; - unsigned nhwatomic; - unsigned nlds; - unsigned nsys_inputs; - struct r600_shader_io input[PIPE_MAX_SHADER_INPUTS]; - struct r600_shader_io output[PIPE_MAX_SHADER_OUTPUTS]; - struct r600_shader_atomic atomics[8]; - unsigned nhwatomic_ranges; - bool uses_kill; - bool fs_write_all; - bool two_side; - bool needs_scratch_space; - /* Real number of ps color exports compiled in the bytecode */ - unsigned nr_ps_color_exports; - unsigned ps_color_export_mask; - unsigned ps_export_highest; - /* bit n is set if the shader writes gl_ClipDistance[n] */ - unsigned cc_dist_mask; - unsigned clip_dist_write; - unsigned cull_dist_write; - bool vs_position_window_space; - /* flag is set if the shader writes VS_OUT_MISC_VEC (e.g. for PSIZE) */ - bool vs_out_misc_write; - bool vs_out_point_size; - bool vs_out_layer; - bool vs_out_viewport; - bool vs_out_edgeflag; - bool has_txq_cube_array_z_comp; - bool uses_tex_buffers; - bool gs_prim_id_input; - bool gs_tri_strip_adj_fix; - uint8_t ps_conservative_z; - - /* Size in bytes of a data item in the ring(s) (single vertex data). - Stages with only one ring items 123 will be set to 0. */ - unsigned ring_item_sizes[4]; - - unsigned indirect_files; - unsigned max_arrays; - unsigned num_arrays; - unsigned vs_as_es; - unsigned vs_as_ls; - unsigned vs_as_gs_a; - unsigned tes_as_es; - unsigned tcs_prim_mode; - unsigned ps_prim_id_input; - unsigned num_loops; - - struct r600_shader_array * arrays; - - bool uses_doubles; - bool uses_atomics; - bool uses_images; - bool uses_helper_invocation; - bool uses_interpolate_at_sample; - uint8_t atomic_base; - uint8_t rat_base; - uint8_t image_size_const_offset; - bool disable_sb; -}; - -union r600_shader_key { - struct { - unsigned nr_cbufs:4; - unsigned first_atomic_counter:4; - unsigned image_size_const_offset:5; - unsigned color_two_side:1; - unsigned alpha_to_one:1; - unsigned apply_sample_id_mask:1; - unsigned dual_source_blend:1; - } ps; - struct { - unsigned prim_id_out:8; - unsigned first_atomic_counter:4; - unsigned as_es:1; /* export shader */ - unsigned as_ls:1; /* local shader */ - unsigned as_gs_a:1; - } vs; - struct { - unsigned first_atomic_counter:4; - unsigned as_es:1; - } tes; - struct { - unsigned first_atomic_counter:4; - unsigned prim_mode:3; - } tcs; - struct { - unsigned first_atomic_counter:4; - unsigned tri_strip_adj_fix:1; - } gs; -}; - -struct r600_shader_array { - unsigned gpr_start; - unsigned gpr_count; - unsigned comp_mask; -}; +static_assert( + R600_SHADER_MAX_INPUTS >= PIPE_MAX_SHADER_INPUTS, + "Assuming that all Gallium shader inputs can fit into r600_shader inputs"); +static_assert( + R600_SHADER_MAX_OUTPUTS >= PIPE_MAX_SHADER_OUTPUTS, + "Assuming that all Gallium shader outputs can fit into r600_shader outputs"); struct r600_pipe_shader { struct r600_pipe_shader_selector *selector; diff --git a/src/gallium/drivers/r600/r600_shader_common.h b/src/gallium/drivers/r600/r600_shader_common.h new file mode 100644 index 00000000000..c6ea5a3c092 --- /dev/null +++ b/src/gallium/drivers/r600/r600_shader_common.h @@ -0,0 +1,179 @@ +/* + * Copyright 2010 Jerome Glisse <gli...@freedesktop.org> + * + * Permission is hereby granted, free of charge, to any person obtaining a + * copy of this software and associated documentation files (the "Software"), + * to deal in the Software without restriction, including without limitation + * on the rights to use, copy, modify, merge, publish, distribute, sub + * license, and/or sell copies of the Software, and to permit persons to whom + * the Software is furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice (including the next + * paragraph) shall be included in all copies or substantial portions of the + * Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL + * THE AUTHOR(S) AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR + * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE + * USE OR OTHER DEALINGS IN THE SOFTWARE. + */ + +#ifndef R600_SHADER_COMMON_H +#define R600_SHADER_COMMON_H + +#include "r600_asm.h" + +#include "compiler/shader_enums.h" + + +#ifdef __cplusplus +extern "C" { +#endif + +/* Valid shader configurations: + * + * API shaders VS | TCS | TES | GS |pass| PS + * are compiled as: | | | |thru| + * | | | | | + * Only VS & PS: VS | -- | -- | -- | -- | PS + * With GS: ES | -- | -- | GS | VS | PS + * With Tessel.: LS | HS | VS | -- | -- | PS + * With both: LS | HS | ES | GS | VS | PS + */ + +struct r600_shader_io { + unsigned name; + unsigned gpr; + unsigned done; + unsigned sid; + int spi_sid; + unsigned interpolate; + unsigned ij_index; + unsigned interpolate_location; // TGSI_INTERPOLATE_LOC_CENTER, CENTROID, SAMPLE + unsigned lds_pos; /* for evergreen */ + unsigned back_color_input; + unsigned write_mask; + int ring_offset; + unsigned uses_interpolate_at_centroid; +}; + +struct r600_shader_atomic { + unsigned start, end; + unsigned buffer_id; + unsigned hw_idx; +}; + +#define R600_SHADER_MAX_INPUTS (32 /* generic */ + 32 /* patch */ + 16 /* others */) +#define R600_SHADER_MAX_OUTPUTS (32 /* generic */ + 32 /* patch */ + 16 /* others */) + +struct r600_shader { + unsigned processor_type; + struct r600_bytecode bc; + unsigned ninput; + unsigned noutput; + unsigned nhwatomic; + unsigned nlds; + unsigned nsys_inputs; + struct r600_shader_io input[R600_SHADER_MAX_INPUTS]; + struct r600_shader_io output[R600_SHADER_MAX_OUTPUTS]; + struct r600_shader_atomic atomics[8]; + unsigned nhwatomic_ranges; + bool uses_kill; + bool fs_write_all; + bool two_side; + bool needs_scratch_space; + /* Real number of ps color exports compiled in the bytecode */ + unsigned nr_ps_color_exports; + unsigned ps_color_export_mask; + unsigned ps_export_highest; + /* bit n is set if the shader writes gl_ClipDistance[n] */ + unsigned cc_dist_mask; + unsigned clip_dist_write; + unsigned cull_dist_write; + bool vs_position_window_space; + /* flag is set if the shader writes VS_OUT_MISC_VEC (e.g. for PSIZE) */ + bool vs_out_misc_write; + bool vs_out_point_size; + bool vs_out_layer; + bool vs_out_viewport; + bool vs_out_edgeflag; + bool has_txq_cube_array_z_comp; + bool uses_tex_buffers; + bool gs_prim_id_input; + bool gs_tri_strip_adj_fix; + uint8_t ps_conservative_z; + + /* Size in bytes of a data item in the ring(s) (single vertex data). + Stages with only one ring items 123 will be set to 0. */ + unsigned ring_item_sizes[4]; + + unsigned indirect_files; + unsigned max_arrays; + unsigned num_arrays; + unsigned vs_as_es; + unsigned vs_as_ls; + unsigned vs_as_gs_a; + unsigned tes_as_es; + unsigned tcs_prim_mode; + unsigned ps_prim_id_input; + unsigned num_loops; + + struct r600_shader_array * arrays; + + bool uses_doubles; + bool uses_atomics; + bool uses_images; + bool uses_helper_invocation; + bool uses_interpolate_at_sample; + uint8_t atomic_base; + uint8_t rat_base; + uint8_t image_size_const_offset; + bool disable_sb; +}; + +union r600_shader_key { + struct { + unsigned nr_cbufs:4; + unsigned first_atomic_counter:4; + unsigned image_size_const_offset:5; + unsigned color_two_side:1; + unsigned alpha_to_one:1; + unsigned apply_sample_id_mask:1; + unsigned dual_source_blend:1; + } ps; + struct { + unsigned prim_id_out:8; + unsigned first_atomic_counter:4; + unsigned as_es:1; /* export shader */ + unsigned as_ls:1; /* local shader */ + unsigned as_gs_a:1; + } vs; + struct { + unsigned first_atomic_counter:4; + unsigned as_es:1; + } tes; + struct { + unsigned first_atomic_counter:4; + unsigned prim_mode:3; + } tcs; + struct { + unsigned first_atomic_counter:4; + unsigned tri_strip_adj_fix:1; + } gs; +}; + +struct r600_shader_array { + unsigned gpr_start; + unsigned gpr_count; + unsigned comp_mask; +}; + +#ifdef __cplusplus +} // extern "C" +#endif + + +#endif diff --git a/src/gallium/drivers/r600/sfn/sfn_assembler.h b/src/gallium/drivers/r600/sfn/sfn_assembler.h index dd598d4da2a..a83816bfa05 100644 --- a/src/gallium/drivers/r600/sfn/sfn_assembler.h +++ b/src/gallium/drivers/r600/sfn/sfn_assembler.h @@ -27,8 +27,8 @@ #ifndef ASSEMBLER_H #define ASSEMBLER_H -#include "../r600_pipe.h" -#include "../r600_shader.h" +#include "../r600_shader_common.h" + #include "sfn_shader.h" namespace r600 {