nir: add interpolation qualifiers for color sysvals into shader_info
[mesa.git] / src / compiler / shader_info.h
index 7af36a66d1338bb7d4552561f13fb8c66a00441a..760bc5556cbee826e257bfbbb78e84b868665c20 100644 (file)
@@ -35,12 +35,19 @@ extern "C" {
 struct spirv_supported_capabilities {
    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 gcn_shader;
    bool image_ms_array;
    bool image_read_without_format;
    bool image_write_without_format;
@@ -48,11 +55,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;
@@ -66,8 +77,17 @@ struct spirv_supported_capabilities {
    bool subgroup_vote;
    bool tessellation;
    bool transform_feedback;
-   bool trinary_minmax;
    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 {
@@ -77,23 +97,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;
@@ -111,118 +135,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;
 
    /**
     * 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 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;
+
+         /* 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;
-         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
+          * 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:1;
+         uint8_t user_data_components_amd:3;
 
-         bool local_size_variable;
+         /*
+          * 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;