X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fshader_info.h;h=57b0eabd79a0fda81b1cc846aa5e88c21e265136;hb=dc8bffe9994eec574064829fde8a65d06b8045dd;hp=115dd01e2b904b9b11bc9a7e6e0e0bb5d4f82ce1;hpb=ae392d73c978efcfbbe7fbfff446cabe2ab79559;p=mesa.git diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 115dd01e2b9..57b0eabd79a 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -53,12 +53,15 @@ struct spirv_supported_capabilities { bool int16; bool int64; bool int64_atomics; + bool integer_functions2; bool kernel; bool min_lod; bool multiview; bool physical_storage_buffer_address; bool post_depth_coverage; bool runtime_descriptor_array; + bool float_controls; + bool shader_clock; bool shader_viewport_index_layer; bool stencil_export; bool storage_8bit; @@ -73,10 +76,16 @@ struct spirv_supported_capabilities { bool tessellation; bool transform_feedback; bool variable_pointers; + bool vk_memory_model; + bool vk_memory_model_device_scope; bool float16; + bool amd_fragment_mask; bool amd_gcn_shader; bool amd_shader_ballot; bool amd_trinary_minmax; + bool amd_image_read_write_lod; + bool amd_shader_explicit_vertex_parameter; + bool amd_image_gather_bias_lod; }; typedef struct shader_info { @@ -86,23 +95,27 @@ 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; - /* Number of shader storage buffers used by this shader */ - unsigned num_ssbos; + uint8_t num_abos; + /* Number of shader storage buffers (max .driver_location + 1) used by this + * shader. In the case of nir_lower_atomics_to_ssbo being used, this will + * be the number of actual SSBOs in gl_program->info, and the lowered SSBOs + * and atomic counters in nir_shader->info. + */ + uint8_t num_ssbos; /* Number of images used by this shader */ - unsigned num_images; + uint8_t num_images; /* Which inputs are actually read */ uint64_t inputs_read; @@ -120,8 +133,14 @@ 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; + /* Which inputs are read indirectly (subset of inputs_read) */ + uint64_t inputs_read_indirectly; + /* Which outputs are read or written indirectly */ + uint64_t outputs_accessed_indirectly; + /* Which patch inputs are read indirectly (subset of patch_inputs_read) */ + uint64_t patch_inputs_read_indirectly; + /* Which patch outputs are read or written indirectly */ + uint64_t patch_outputs_accessed_indirectly; /** Bitfield of which textures are used */ uint32_t textures_used; @@ -129,64 +148,97 @@ typedef struct shader_info { /** Bitfield of which textures are used by texelFetch() */ uint32_t textures_used_by_txf; + /** Bitfield of which images are used */ + uint32_t images_used; + /** Bitfield of which images are buffers. */ + uint32_t image_buffers; + /** Bitfield of which images are MSAA. */ + uint32_t msaa_images; + + /* 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; + bool uses_64bit:1; - /* 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; + /* Whether the first UBO is the default uniform buffer, i.e. uniforms. */ + 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:1; + + /* Whether the shader writes memory, including transform feedback. */ + bool writes_memory:1; + + /* Whether gl_Layer is viewport-relative */ + bool layer_viewport_relative:1; union { struct { /* Which inputs are doubles */ uint64_t double_inputs; + /* For AMD-specific driver-internal shaders. It replaces vertex + * buffer loads with code generating VS inputs from scalar registers. + * + * Valid values: SI_VS_BLIT_SGPRS_POS_* + */ + 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; + bool uses_demote:1; /** * True if this fragment shader requires helper invocations. This @@ -194,38 +246,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 @@ -244,23 +296,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; + bool local_size_variable:1; + uint8_t user_data_components_amd:3; + + /* + * 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) @@ -268,24 +326,29 @@ 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; + + /* Bit mask of TCS per-vertex inputs (VS outputs) that are used + * with a vertex index that is NOT the invocation id + */ + uint64_t tcs_cross_invocation_inputs_read; + + /* Bit mask of TCS per-vertex outputs that are used + * with a vertex index that is NOT the invocation id + */ + uint64_t tcs_cross_invocation_outputs_read; } tess; }; } shader_info;