From 84a1a2578dab10ddb7ada831b598db5f7bc6a859 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marek=20Ol=C5=A1=C3=A1k?= Date: Tue, 5 Nov 2019 19:10:09 -0500 Subject: [PATCH] compiler: pack shader_info from 160 bytes to 96 bytes Reviewed-by: Caio Marcelo de Oliveira Filho --- src/compiler/shader_info.h | 132 ++++++++++++++++++------------------- 1 file changed, 66 insertions(+), 66 deletions(-) diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 339aee551eb..8e7b81a13ab 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -90,25 +90,25 @@ typedef struct shader_info { const char *label; /** The shader stage, such as MESA_SHADER_VERTEX. */ - gl_shader_stage stage; + gl_shader_stage stage:8; /** The shader stage in a non SSO linked program that follows this stage, * such as MESA_SHADER_FRAGMENT. */ - gl_shader_stage next_stage; + gl_shader_stage next_stage:8; /* Number of textures used by this shader */ - unsigned num_textures; + uint8_t num_textures; /* Number of uniform buffers used by this shader */ - unsigned num_ubos; + uint8_t num_ubos; /* Number of atomic buffers used by this shader */ - unsigned num_abos; + uint8_t num_abos; /* Number of shader storage buffers used by this shader */ - unsigned num_ssbos; + uint8_t num_ssbos; /* Number of images used by this shader */ - unsigned num_images; + uint8_t num_images; /* Index of the last MSAA image. */ - int last_msaa_image; + int8_t last_msaa_image; /* Which inputs are actually read */ uint64_t inputs_read; @@ -126,47 +126,47 @@ typedef struct shader_info { /* Which patch outputs are read */ uint32_t patch_outputs_read; - /* Whether or not this shader ever uses textureGather() */ - bool uses_texture_gather; - /** Bitfield of which textures are used */ uint32_t textures_used; /** Bitfield of which textures are used by texelFetch() */ uint32_t textures_used_by_txf; + /* SPV_KHR_float_controls: execution mode for floating point ops */ + uint16_t float_controls_execution_mode; + + /* The size of the gl_ClipDistance[] array, if declared. */ + uint8_t clip_distance_array_size:4; + + /* The size of the gl_CullDistance[] array, if declared. */ + uint8_t cull_distance_array_size:4; + + /* Whether or not this shader ever uses textureGather() */ + bool uses_texture_gather:1; + /** * True if this shader uses the fddx/fddy opcodes. * * Note that this does not include the "fine" and "coarse" variants. */ - bool uses_fddx_fddy; + bool uses_fddx_fddy:1; /** * True if this shader uses 64-bit ALU operations */ - bool uses_64bit; - - /* The size of the gl_ClipDistance[] array, if declared. */ - unsigned clip_distance_array_size; - - /* The size of the gl_CullDistance[] array, if declared. */ - unsigned cull_distance_array_size; + bool uses_64bit:1; /* Whether the first UBO is the default uniform buffer, i.e. uniforms. */ - bool first_ubo_is_default_ubo; + bool first_ubo_is_default_ubo:1; /* Whether or not separate shader objects were used */ - bool separate_shader; + bool separate_shader:1; /** Was this shader linked with any transform feedback varyings? */ - bool has_transform_feedback_varyings; + bool has_transform_feedback_varyings:1; /* Whether flrp has been lowered. */ - bool flrp_lowered; - - /* SPV_KHR_float_controls: execution mode for floating point ops */ - unsigned float_controls_execution_mode; + bool flrp_lowered:1; union { struct { @@ -178,37 +178,37 @@ typedef struct shader_info { * * Valid values: SI_VS_BLIT_SGPRS_POS_* */ - unsigned blit_sgprs_amd; + uint8_t blit_sgprs_amd:4; /* True if the shader writes position in window space coordinates pre-transform */ - bool window_space_position; + bool window_space_position:1; } vs; struct { - /** The number of vertices recieves per input primitive */ - unsigned vertices_in; - /** The output primitive type (GL enum value) */ - unsigned output_primitive; + uint16_t output_primitive; /** The input primitive type (GL enum value) */ - unsigned input_primitive; + uint16_t input_primitive; /** The maximum number of vertices the geometry shader might write. */ - unsigned vertices_out; + uint16_t vertices_out; /** 1 .. MAX_GEOMETRY_SHADER_INVOCATIONS */ - unsigned invocations; + uint8_t invocations; + + /** The number of vertices recieves per input primitive (max. 6) */ + uint8_t vertices_in:3; /** Whether or not this shader uses EndPrimitive */ - bool uses_end_primitive; + bool uses_end_primitive:1; /** Whether or not this shader uses non-zero streams */ - bool uses_streams; + bool uses_streams:1; } gs; struct { - bool uses_discard; + bool uses_discard:1; /** * True if this fragment shader requires helper invocations. This @@ -216,38 +216,38 @@ typedef struct shader_info { * instructions which do implicit derivatives, and the use of quad * subgroup operations. */ - bool needs_helper_invocations; + bool needs_helper_invocations:1; /** * Whether any inputs are declared with the "sample" qualifier. */ - bool uses_sample_qualifier; + bool uses_sample_qualifier:1; /** * Whether early fragment tests are enabled as defined by * ARB_shader_image_load_store. */ - bool early_fragment_tests; + bool early_fragment_tests:1; /** * Defined by INTEL_conservative_rasterization. */ - bool inner_coverage; + bool inner_coverage:1; - bool post_depth_coverage; + bool post_depth_coverage:1; /** * \name ARB_fragment_coord_conventions * @{ */ - bool pixel_center_integer; - bool origin_upper_left; + bool pixel_center_integer:1; + bool origin_upper_left:1; /*@}*/ - bool pixel_interlock_ordered; - bool pixel_interlock_unordered; - bool sample_interlock_ordered; - bool sample_interlock_unordered; + bool pixel_interlock_ordered:1; + bool pixel_interlock_unordered:1; + bool sample_interlock_ordered:1; + bool sample_interlock_unordered:1; /** * Flags whether NIR's base types on the FS color outputs should be @@ -266,24 +266,29 @@ typedef struct shader_info { * fixups are necessary to handle effectively untyped data being * output from the FS. */ - bool untyped_color_outputs; + bool untyped_color_outputs:1; /** gl_FragDepth layout for ARB_conservative_depth. */ - enum gl_frag_depth_layout depth_layout; + enum gl_frag_depth_layout depth_layout:3; } fs; struct { - unsigned local_size[3]; + uint16_t local_size[3]; + + bool local_size_variable:1; + uint8_t user_data_components_amd:3; - bool local_size_variable; - char user_data_components_amd; + /* + * Arrangement of invocations used to calculate derivatives in a compute + * shader. From NV_compute_shader_derivatives. + */ + enum gl_derivative_group derivative_group:2; /** * Size of shared variables accessed by the compute shader. */ unsigned shared_size; - /** * pointer size is: * AddressingModelLogical: 0 (default) @@ -291,24 +296,19 @@ typedef struct shader_info { * AddressingModelPhysical64: 64 */ unsigned ptr_size; - - /* - * Arrangement of invocations used to calculate derivatives in a compute - * shader. From NV_compute_shader_derivatives. - */ - enum gl_derivative_group derivative_group; } cs; /* Applies to both TCS and TES. */ struct { + uint16_t primitive_mode; /* GL_TRIANGLES, GL_QUADS or GL_ISOLINES */ + /** The number of vertices in the TCS output patch. */ - unsigned tcs_vertices_out; + uint8_t tcs_vertices_out; + enum gl_tess_spacing spacing:2; - uint32_t primitive_mode; /* GL_TRIANGLES, GL_QUADS or GL_ISOLINES */ - enum gl_tess_spacing spacing; /** Is the vertex order counterclockwise? */ - bool ccw; - bool point_mode; + bool ccw:1; + bool point_mode:1; } tess; }; } shader_info; -- 2.30.2