X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fshader_info.h;h=ea6f9a163759dd67369f62b8b9fe4e6d1b2f5726;hb=f5c7df4dc95ca115b1a1c916b0b133692a7ea6d9;hp=7ea5d9cce1f249f9f86204ad5f8c917ee88a3884;hpb=c447ca64c13f386474e518e0e8dd523ee24507fe;p=mesa.git diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index 7ea5d9cce1f..ea6f9a16375 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -26,17 +26,65 @@ #define SHADER_INFO_H #include "shader_enums.h" +#include #ifdef __cplusplus extern "C" { #endif +struct spirv_supported_capabilities { + bool address; + bool atomic_storage; + bool descriptor_array_dynamic_indexing; + bool device_group; + bool draw_parameters; + bool float64; + bool geometry_streams; + bool gcn_shader; + bool image_ms_array; + bool image_read_without_format; + bool image_write_without_format; + bool int8; + bool int16; + bool int64; + bool int64_atomics; + bool kernel; + bool min_lod; + bool multiview; + bool physical_storage_buffer_address; + bool post_depth_coverage; + bool runtime_descriptor_array; + 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 tessellation; + bool transform_feedback; + bool trinary_minmax; + bool variable_pointers; +}; + typedef struct shader_info { const char *name; /* Descriptive name provided by the client; may be NULL */ const char *label; + /** The shader stage, such as MESA_SHADER_VERTEX. */ + gl_shader_stage stage; + + /** The shader stage in a non SSO linked program that follows this stage, + * such as MESA_SHADER_FRAGMENT. + */ + gl_shader_stage next_stage; + /* Number of textures used by this shader */ unsigned num_textures; /* Number of uniform buffers used by this shader */ @@ -50,8 +98,6 @@ typedef struct shader_info { /* Which inputs are actually read */ uint64_t inputs_read; - /* Which inputs are actually read and are double */ - uint64_t double_inputs_read; /* Which outputs are actually written */ uint64_t outputs_written; /* Which outputs are actually read */ @@ -63,10 +109,30 @@ typedef struct shader_info { uint32_t patch_inputs_read; /* Which patch outputs are actually written */ uint32_t patch_outputs_written; + /* 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; + + /** + * True if this shader uses the fddx/fddy opcodes. + * + * Note that this does not include the "fine" and "coarse" variants. + */ + bool uses_fddx_fddy; + + /** + * 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; @@ -80,6 +146,11 @@ typedef struct shader_info { bool has_transform_feedback_varyings; union { + struct { + /* Which inputs are doubles */ + uint64_t double_inputs; + } vs; + struct { /** The number of vertices recieves per input primitive */ unsigned vertices_in; @@ -117,6 +188,39 @@ typedef struct shader_info { */ bool early_fragment_tests; + /** + * Defined by INTEL_conservative_rasterization. + */ + bool inner_coverage; + + bool post_depth_coverage; + + bool pixel_center_integer; + + bool pixel_interlock_ordered; + bool pixel_interlock_unordered; + bool sample_interlock_ordered; + bool sample_interlock_unordered; + + /** + * 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; + /** gl_FragDepth layout for ARB_conservative_depth. */ enum gl_frag_depth_layout depth_layout; } fs; @@ -124,23 +228,25 @@ typedef struct shader_info { struct { unsigned local_size[3]; + bool local_size_variable; + /** * Size of shared variables accessed by the compute shader. */ unsigned shared_size; } cs; + /* Applies to both TCS and TES. */ struct { /** The number of vertices in the TCS output patch. */ - unsigned vertices_out; - } tcs; + unsigned tcs_vertices_out; - struct { uint32_t primitive_mode; /* GL_TRIANGLES, GL_QUADS or GL_ISOLINES */ - uint32_t spacing; /* GL_EQUAL, GL_FRACTIONAL_EVEN, GL_FRACTIONAL_ODD */ - uint32_t vertex_order; /* GL_CW or GL_CCW */ + enum gl_tess_spacing spacing; + /** Is the vertex order counterclockwise? */ + bool ccw; bool point_mode; - } tes; + } tess; }; } shader_info;