X-Git-Url: https://git.libre-soc.org/?p=mesa.git;a=blobdiff_plain;f=src%2Fcompiler%2Fshader_info.h;h=eeb1cb0a79101271e597a8415a57f655c9768924;hp=0eeb2ca58eab5c0e8d3ccc1aa7b2ec63bd63240d;hb=965b8441fe01645613188bfa463ef6143dd66450;hpb=50767214a790889120975bf0f598996c4f887dfc diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 0eeb2ca58ea..eeb1cb0a791 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -33,25 +33,63 @@ extern "C" { #endif struct spirv_supported_capabilities { - bool float64; - bool image_ms_array; - bool tessellation; + bool address; + bool atomic_storage; + bool demote_to_helper_invocation; + bool derivative_group; + bool descriptor_array_dynamic_indexing; + bool descriptor_array_non_uniform_indexing; + bool descriptor_indexing; bool device_group; bool draw_parameters; + bool float32_atomic_add; + bool float64; + bool float64_atomic_add; + bool fragment_shader_sample_interlock; + bool fragment_shader_pixel_interlock; + bool geometry_streams; + bool image_ms_array; bool image_read_without_format; bool image_write_without_format; + bool int8; + bool int16; bool int64; + bool int64_atomics; + bool integer_functions2; + bool kernel; + bool kernel_image; + bool literal_sampler; + bool min_lod; bool multiview; - bool variable_pointers; - bool storage_16bit; + 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; + bool storage_16bit; + bool storage_image_ms; bool subgroup_arithmetic; bool subgroup_ballot; bool subgroup_basic; bool subgroup_quad; bool subgroup_shuffle; bool subgroup_vote; - bool gcn_shader; + 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 { @@ -61,18 +99,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: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; @@ -90,111 +137,238 @@ 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; /** 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; - /* The size of the gl_ClipDistance[] array, if declared. */ - unsigned clip_distance_array_size; + /** + * True if this shader uses 64-bit ALU operations + */ + bool uses_64bit:1; - /* 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 nir_lower_io has been called to lower derefs. + * nir_variables for inputs and outputs might not be present in the IR. + */ + bool io_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; - /* Which inputs are actually read and are double */ - uint64_t double_inputs_read; + /* 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: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; + /** The streams used in this shaders (max. 4) */ + uint8_t active_stream_mask:4; } gs; struct { - bool uses_discard; + bool uses_discard:1; + bool uses_demote:1; + + /** + * True if this fragment shader requires helper invocations. This + * can be caused by the use of ALU derivative ops, texture + * instructions which do implicit derivatives, and the use of quad + * subgroup operations. + */ + 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; - bool pixel_center_integer; + /** + * \name ARB_fragment_coord_conventions + * @{ + */ + bool pixel_center_integer:1; + bool origin_upper_left:1; + /*@}*/ + + 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 + * ignored. + * + * GLSL requires that fragment shader output base types match the + * render target's base types for the behavior to be defined. From + * the GL 4.6 spec: + * + * "If the values written by the fragment shader do not match the + * format(s) of the corresponding color buffer(s), the result is + * undefined." + * + * However, for NIR shaders translated from TGSI, we don't have the + * output types any more, so the driver will need to do whatever + * fixups are necessary to handle effectively untyped data being + * output from the FS. + */ + 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; + + /** + * Interpolation qualifiers for drivers that lowers color inputs + * to system values. + */ + unsigned color0_interp:3; /* glsl_interp_mode */ + bool color0_sample:1; + bool color0_centroid:1; + unsigned color1_interp:3; /* glsl_interp_mode */ + bool color1_sample:1; + bool color1_centroid:1; } 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) + * AddressingModelPhysical32: 32 + * AddressingModelPhysical64: 64 + */ + unsigned ptr_size; } 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;