Added few more stubs so that control reaches to DestroyDevice().
[mesa.git] / src / compiler / shader_info.h
index 8b0176f0438ca91883e548e10b4bc5a172d3624f..eeb1cb0a79101271e597a8415a57f655c9768924 100644 (file)
@@ -42,7 +42,9 @@ struct spirv_supported_capabilities {
    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;
@@ -53,13 +55,17 @@ struct spirv_supported_capabilities {
    bool int16;
    bool int64;
    bool int64_atomics;
+   bool integer_functions2;
    bool kernel;
+   bool kernel_image;
+   bool literal_sampler;
    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;
@@ -74,10 +80,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 {
@@ -87,23 +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;
+   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;
@@ -121,8 +137,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;
@@ -130,32 +152,59 @@ 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;
 
-   /* SPV_KHR_float_controls: execution mode for floating point ops */
-   unsigned float_controls_execution_mode;
+   /* 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 {
@@ -167,37 +216,38 @@ 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;
+         /** 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
@@ -205,38 +255,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
@@ -255,24 +305,40 @@ 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;
+
+         /**
+          * 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;
-         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)
@@ -280,24 +346,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;