1*61046927SAndroid Build Coastguard Worker /* 2*61046927SAndroid Build Coastguard Worker * Copyright © 2016 Intel Corporation 3*61046927SAndroid Build Coastguard Worker * 4*61046927SAndroid Build Coastguard Worker * Permission is hereby granted, free of charge, to any person obtaining a 5*61046927SAndroid Build Coastguard Worker * copy of this software and associated documentation files (the "Software"), 6*61046927SAndroid Build Coastguard Worker * to deal in the Software without restriction, including without limitation 7*61046927SAndroid Build Coastguard Worker * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8*61046927SAndroid Build Coastguard Worker * and/or sell copies of the Software, and to permit persons to whom the 9*61046927SAndroid Build Coastguard Worker * Software is furnished to do so, subject to the following conditions: 10*61046927SAndroid Build Coastguard Worker * 11*61046927SAndroid Build Coastguard Worker * The above copyright notice and this permission notice (including the next 12*61046927SAndroid Build Coastguard Worker * paragraph) shall be included in all copies or substantial portions of the 13*61046927SAndroid Build Coastguard Worker * Software. 14*61046927SAndroid Build Coastguard Worker * 15*61046927SAndroid Build Coastguard Worker * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16*61046927SAndroid Build Coastguard Worker * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17*61046927SAndroid Build Coastguard Worker * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18*61046927SAndroid Build Coastguard Worker * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19*61046927SAndroid Build Coastguard Worker * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20*61046927SAndroid Build Coastguard Worker * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21*61046927SAndroid Build Coastguard Worker * IN THE SOFTWARE. 22*61046927SAndroid Build Coastguard Worker * 23*61046927SAndroid Build Coastguard Worker */ 24*61046927SAndroid Build Coastguard Worker 25*61046927SAndroid Build Coastguard Worker #ifndef SHADER_INFO_H 26*61046927SAndroid Build Coastguard Worker #define SHADER_INFO_H 27*61046927SAndroid Build Coastguard Worker 28*61046927SAndroid Build Coastguard Worker #include "util/bitset.h" 29*61046927SAndroid Build Coastguard Worker #include "util/mesa-blake3.h" 30*61046927SAndroid Build Coastguard Worker #include "shader_enums.h" 31*61046927SAndroid Build Coastguard Worker #include <stdint.h> 32*61046927SAndroid Build Coastguard Worker 33*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 34*61046927SAndroid Build Coastguard Worker extern "C" { 35*61046927SAndroid Build Coastguard Worker #endif 36*61046927SAndroid Build Coastguard Worker 37*61046927SAndroid Build Coastguard Worker #define MAX_XFB_BUFFERS 4 38*61046927SAndroid Build Coastguard Worker #define MAX_INLINABLE_UNIFORMS 4 39*61046927SAndroid Build Coastguard Worker 40*61046927SAndroid Build Coastguard Worker typedef struct shader_info { 41*61046927SAndroid Build Coastguard Worker const char *name; 42*61046927SAndroid Build Coastguard Worker 43*61046927SAndroid Build Coastguard Worker /* Descriptive name provided by the client; may be NULL */ 44*61046927SAndroid Build Coastguard Worker const char *label; 45*61046927SAndroid Build Coastguard Worker 46*61046927SAndroid Build Coastguard Worker /* Shader is internal, and should be ignored by things like NIR_DEBUG=print */ 47*61046927SAndroid Build Coastguard Worker bool internal; 48*61046927SAndroid Build Coastguard Worker 49*61046927SAndroid Build Coastguard Worker /* BLAKE3 of the original source, used by shader detection in drivers. */ 50*61046927SAndroid Build Coastguard Worker blake3_hash source_blake3; 51*61046927SAndroid Build Coastguard Worker 52*61046927SAndroid Build Coastguard Worker /** The shader stage, such as MESA_SHADER_VERTEX. */ 53*61046927SAndroid Build Coastguard Worker gl_shader_stage stage:8; 54*61046927SAndroid Build Coastguard Worker 55*61046927SAndroid Build Coastguard Worker /** The shader stage in a non SSO linked program that follows this stage, 56*61046927SAndroid Build Coastguard Worker * such as MESA_SHADER_FRAGMENT. 57*61046927SAndroid Build Coastguard Worker */ 58*61046927SAndroid Build Coastguard Worker gl_shader_stage next_stage:8; 59*61046927SAndroid Build Coastguard Worker 60*61046927SAndroid Build Coastguard Worker /* Number of textures used by this shader */ 61*61046927SAndroid Build Coastguard Worker uint8_t num_textures; 62*61046927SAndroid Build Coastguard Worker /* Number of uniform buffers used by this shader */ 63*61046927SAndroid Build Coastguard Worker uint8_t num_ubos; 64*61046927SAndroid Build Coastguard Worker /* Number of atomic buffers used by this shader */ 65*61046927SAndroid Build Coastguard Worker uint8_t num_abos; 66*61046927SAndroid Build Coastguard Worker /* Number of shader storage buffers (max .driver_location + 1) used by this 67*61046927SAndroid Build Coastguard Worker * shader. In the case of nir_lower_atomics_to_ssbo being used, this will 68*61046927SAndroid Build Coastguard Worker * be the number of actual SSBOs in gl_program->info, and the lowered SSBOs 69*61046927SAndroid Build Coastguard Worker * and atomic counters in nir_shader->info. 70*61046927SAndroid Build Coastguard Worker */ 71*61046927SAndroid Build Coastguard Worker uint8_t num_ssbos; 72*61046927SAndroid Build Coastguard Worker /* Number of images used by this shader */ 73*61046927SAndroid Build Coastguard Worker uint8_t num_images; 74*61046927SAndroid Build Coastguard Worker 75*61046927SAndroid Build Coastguard Worker /* Which inputs are actually read */ 76*61046927SAndroid Build Coastguard Worker uint64_t inputs_read; 77*61046927SAndroid Build Coastguard Worker /* Which inputs occupy 2 slots. */ 78*61046927SAndroid Build Coastguard Worker uint64_t dual_slot_inputs; 79*61046927SAndroid Build Coastguard Worker /* Which outputs are actually written */ 80*61046927SAndroid Build Coastguard Worker uint64_t outputs_written; 81*61046927SAndroid Build Coastguard Worker /* Which outputs are actually read */ 82*61046927SAndroid Build Coastguard Worker uint64_t outputs_read; 83*61046927SAndroid Build Coastguard Worker /* Which system values are actually read */ 84*61046927SAndroid Build Coastguard Worker BITSET_DECLARE(system_values_read, SYSTEM_VALUE_MAX); 85*61046927SAndroid Build Coastguard Worker 86*61046927SAndroid Build Coastguard Worker /* Which I/O is per-primitive, for read/written information combine with 87*61046927SAndroid Build Coastguard Worker * the fields above. 88*61046927SAndroid Build Coastguard Worker */ 89*61046927SAndroid Build Coastguard Worker uint64_t per_primitive_inputs; 90*61046927SAndroid Build Coastguard Worker uint64_t per_primitive_outputs; 91*61046927SAndroid Build Coastguard Worker 92*61046927SAndroid Build Coastguard Worker /* Which I/O is per-view */ 93*61046927SAndroid Build Coastguard Worker uint64_t per_view_outputs; 94*61046927SAndroid Build Coastguard Worker 95*61046927SAndroid Build Coastguard Worker /* Which 16-bit inputs and outputs are used corresponding to 96*61046927SAndroid Build Coastguard Worker * VARYING_SLOT_VARn_16BIT. 97*61046927SAndroid Build Coastguard Worker */ 98*61046927SAndroid Build Coastguard Worker uint16_t inputs_read_16bit; 99*61046927SAndroid Build Coastguard Worker uint16_t outputs_written_16bit; 100*61046927SAndroid Build Coastguard Worker uint16_t outputs_read_16bit; 101*61046927SAndroid Build Coastguard Worker uint16_t inputs_read_indirectly_16bit; 102*61046927SAndroid Build Coastguard Worker uint16_t outputs_accessed_indirectly_16bit; 103*61046927SAndroid Build Coastguard Worker 104*61046927SAndroid Build Coastguard Worker /* Which patch inputs are actually read */ 105*61046927SAndroid Build Coastguard Worker uint32_t patch_inputs_read; 106*61046927SAndroid Build Coastguard Worker /* Which patch outputs are actually written */ 107*61046927SAndroid Build Coastguard Worker uint32_t patch_outputs_written; 108*61046927SAndroid Build Coastguard Worker /* Which patch outputs are read */ 109*61046927SAndroid Build Coastguard Worker uint32_t patch_outputs_read; 110*61046927SAndroid Build Coastguard Worker 111*61046927SAndroid Build Coastguard Worker /* Which inputs are read indirectly (subset of inputs_read) */ 112*61046927SAndroid Build Coastguard Worker uint64_t inputs_read_indirectly; 113*61046927SAndroid Build Coastguard Worker /* Which outputs are read or written indirectly */ 114*61046927SAndroid Build Coastguard Worker uint64_t outputs_accessed_indirectly; 115*61046927SAndroid Build Coastguard Worker /* Which patch inputs are read indirectly (subset of patch_inputs_read) */ 116*61046927SAndroid Build Coastguard Worker uint64_t patch_inputs_read_indirectly; 117*61046927SAndroid Build Coastguard Worker /* Which patch outputs are read or written indirectly */ 118*61046927SAndroid Build Coastguard Worker uint64_t patch_outputs_accessed_indirectly; 119*61046927SAndroid Build Coastguard Worker 120*61046927SAndroid Build Coastguard Worker /** Bitfield of which textures are used */ 121*61046927SAndroid Build Coastguard Worker BITSET_DECLARE(textures_used, 128); 122*61046927SAndroid Build Coastguard Worker 123*61046927SAndroid Build Coastguard Worker /** Bitfield of which textures are used by texelFetch() */ 124*61046927SAndroid Build Coastguard Worker BITSET_DECLARE(textures_used_by_txf, 128); 125*61046927SAndroid Build Coastguard Worker 126*61046927SAndroid Build Coastguard Worker /** Bitfield of which samplers are used */ 127*61046927SAndroid Build Coastguard Worker BITSET_DECLARE(samplers_used, 32); 128*61046927SAndroid Build Coastguard Worker 129*61046927SAndroid Build Coastguard Worker /** Bitfield of which images are used */ 130*61046927SAndroid Build Coastguard Worker BITSET_DECLARE(images_used, 64); 131*61046927SAndroid Build Coastguard Worker /** Bitfield of which images are buffers. */ 132*61046927SAndroid Build Coastguard Worker BITSET_DECLARE(image_buffers, 64); 133*61046927SAndroid Build Coastguard Worker /** Bitfield of which images are MSAA. */ 134*61046927SAndroid Build Coastguard Worker BITSET_DECLARE(msaa_images, 64); 135*61046927SAndroid Build Coastguard Worker 136*61046927SAndroid Build Coastguard Worker /* SPV_KHR_float_controls: execution mode for floating point ops */ 137*61046927SAndroid Build Coastguard Worker uint32_t float_controls_execution_mode; 138*61046927SAndroid Build Coastguard Worker 139*61046927SAndroid Build Coastguard Worker /** 140*61046927SAndroid Build Coastguard Worker * Size of shared variables accessed by compute/task/mesh shaders. 141*61046927SAndroid Build Coastguard Worker */ 142*61046927SAndroid Build Coastguard Worker unsigned shared_size; 143*61046927SAndroid Build Coastguard Worker 144*61046927SAndroid Build Coastguard Worker /** 145*61046927SAndroid Build Coastguard Worker * Size of task payload variables accessed by task/mesh shaders. 146*61046927SAndroid Build Coastguard Worker */ 147*61046927SAndroid Build Coastguard Worker unsigned task_payload_size; 148*61046927SAndroid Build Coastguard Worker 149*61046927SAndroid Build Coastguard Worker /** 150*61046927SAndroid Build Coastguard Worker * Number of ray tracing queries in the shader (counts all elements of all 151*61046927SAndroid Build Coastguard Worker * variables). 152*61046927SAndroid Build Coastguard Worker */ 153*61046927SAndroid Build Coastguard Worker unsigned ray_queries; 154*61046927SAndroid Build Coastguard Worker 155*61046927SAndroid Build Coastguard Worker /** 156*61046927SAndroid Build Coastguard Worker * Local workgroup size used by compute/task/mesh shaders. 157*61046927SAndroid Build Coastguard Worker */ 158*61046927SAndroid Build Coastguard Worker uint16_t workgroup_size[3]; 159*61046927SAndroid Build Coastguard Worker 160*61046927SAndroid Build Coastguard Worker enum gl_subgroup_size subgroup_size; 161*61046927SAndroid Build Coastguard Worker uint8_t num_subgroups; 162*61046927SAndroid Build Coastguard Worker 163*61046927SAndroid Build Coastguard Worker /** 164*61046927SAndroid Build Coastguard Worker * Uses subgroup intrinsics which can communicate across a quad. 165*61046927SAndroid Build Coastguard Worker */ 166*61046927SAndroid Build Coastguard Worker bool uses_wide_subgroup_intrinsics; 167*61046927SAndroid Build Coastguard Worker 168*61046927SAndroid Build Coastguard Worker /* Transform feedback buffer strides in dwords, max. 1K - 4. */ 169*61046927SAndroid Build Coastguard Worker uint8_t xfb_stride[MAX_XFB_BUFFERS]; 170*61046927SAndroid Build Coastguard Worker 171*61046927SAndroid Build Coastguard Worker uint16_t inlinable_uniform_dw_offsets[MAX_INLINABLE_UNIFORMS]; 172*61046927SAndroid Build Coastguard Worker uint8_t num_inlinable_uniforms:4; 173*61046927SAndroid Build Coastguard Worker 174*61046927SAndroid Build Coastguard Worker /* The size of the gl_ClipDistance[] array, if declared. */ 175*61046927SAndroid Build Coastguard Worker uint8_t clip_distance_array_size:4; 176*61046927SAndroid Build Coastguard Worker 177*61046927SAndroid Build Coastguard Worker /* The size of the gl_CullDistance[] array, if declared. */ 178*61046927SAndroid Build Coastguard Worker uint8_t cull_distance_array_size:4; 179*61046927SAndroid Build Coastguard Worker 180*61046927SAndroid Build Coastguard Worker /* Whether or not this shader ever uses textureGather() */ 181*61046927SAndroid Build Coastguard Worker bool uses_texture_gather:1; 182*61046927SAndroid Build Coastguard Worker 183*61046927SAndroid Build Coastguard Worker /* Whether texture size, levels, or samples is queried. */ 184*61046927SAndroid Build Coastguard Worker bool uses_resource_info_query:1; 185*61046927SAndroid Build Coastguard Worker 186*61046927SAndroid Build Coastguard Worker /** 187*61046927SAndroid Build Coastguard Worker * True if this shader uses the fddx/fddy opcodes. 188*61046927SAndroid Build Coastguard Worker * 189*61046927SAndroid Build Coastguard Worker * Note that this does not include the "fine" and "coarse" variants. 190*61046927SAndroid Build Coastguard Worker */ 191*61046927SAndroid Build Coastguard Worker bool uses_fddx_fddy:1; 192*61046927SAndroid Build Coastguard Worker 193*61046927SAndroid Build Coastguard Worker /** Has divergence analysis ever been run? */ 194*61046927SAndroid Build Coastguard Worker bool divergence_analysis_run:1; 195*61046927SAndroid Build Coastguard Worker 196*61046927SAndroid Build Coastguard Worker /* Bitmask of bit-sizes used with ALU instructions. */ 197*61046927SAndroid Build Coastguard Worker uint8_t bit_sizes_float; 198*61046927SAndroid Build Coastguard Worker uint8_t bit_sizes_int; 199*61046927SAndroid Build Coastguard Worker 200*61046927SAndroid Build Coastguard Worker /* Whether the first UBO is the default uniform buffer, i.e. uniforms. */ 201*61046927SAndroid Build Coastguard Worker bool first_ubo_is_default_ubo:1; 202*61046927SAndroid Build Coastguard Worker 203*61046927SAndroid Build Coastguard Worker /* Whether or not separate shader objects were used */ 204*61046927SAndroid Build Coastguard Worker bool separate_shader:1; 205*61046927SAndroid Build Coastguard Worker 206*61046927SAndroid Build Coastguard Worker /** Was this shader linked with any transform feedback varyings? */ 207*61046927SAndroid Build Coastguard Worker bool has_transform_feedback_varyings:1; 208*61046927SAndroid Build Coastguard Worker 209*61046927SAndroid Build Coastguard Worker /* Whether flrp has been lowered. */ 210*61046927SAndroid Build Coastguard Worker bool flrp_lowered:1; 211*61046927SAndroid Build Coastguard Worker 212*61046927SAndroid Build Coastguard Worker /* Whether nir_lower_io has been called to lower derefs. 213*61046927SAndroid Build Coastguard Worker * nir_variables for inputs and outputs might not be present in the IR. 214*61046927SAndroid Build Coastguard Worker */ 215*61046927SAndroid Build Coastguard Worker bool io_lowered:1; 216*61046927SAndroid Build Coastguard Worker 217*61046927SAndroid Build Coastguard Worker /** Has nir_lower_var_copies called. To avoid calling any 218*61046927SAndroid Build Coastguard Worker * lowering/optimization that would introduce any copy_deref later. 219*61046927SAndroid Build Coastguard Worker */ 220*61046927SAndroid Build Coastguard Worker bool var_copies_lowered:1; 221*61046927SAndroid Build Coastguard Worker 222*61046927SAndroid Build Coastguard Worker /* Whether the shader writes memory, including transform feedback. */ 223*61046927SAndroid Build Coastguard Worker bool writes_memory:1; 224*61046927SAndroid Build Coastguard Worker 225*61046927SAndroid Build Coastguard Worker /* Whether gl_Layer is viewport-relative */ 226*61046927SAndroid Build Coastguard Worker bool layer_viewport_relative:1; 227*61046927SAndroid Build Coastguard Worker 228*61046927SAndroid Build Coastguard Worker /* Whether explicit barriers are used */ 229*61046927SAndroid Build Coastguard Worker bool uses_control_barrier : 1; 230*61046927SAndroid Build Coastguard Worker bool uses_memory_barrier : 1; 231*61046927SAndroid Build Coastguard Worker 232*61046927SAndroid Build Coastguard Worker /* Whether ARB_bindless_texture ops or variables are used */ 233*61046927SAndroid Build Coastguard Worker bool uses_bindless : 1; 234*61046927SAndroid Build Coastguard Worker 235*61046927SAndroid Build Coastguard Worker /** 236*61046927SAndroid Build Coastguard Worker * Shared memory types have explicit layout set. Used for 237*61046927SAndroid Build Coastguard Worker * SPV_KHR_workgroup_storage_explicit_layout. 238*61046927SAndroid Build Coastguard Worker */ 239*61046927SAndroid Build Coastguard Worker bool shared_memory_explicit_layout:1; 240*61046927SAndroid Build Coastguard Worker 241*61046927SAndroid Build Coastguard Worker /** 242*61046927SAndroid Build Coastguard Worker * Used for VK_KHR_zero_initialize_workgroup_memory. 243*61046927SAndroid Build Coastguard Worker */ 244*61046927SAndroid Build Coastguard Worker bool zero_initialize_shared_memory:1; 245*61046927SAndroid Build Coastguard Worker 246*61046927SAndroid Build Coastguard Worker /** 247*61046927SAndroid Build Coastguard Worker * Used for ARB_compute_variable_group_size. 248*61046927SAndroid Build Coastguard Worker */ 249*61046927SAndroid Build Coastguard Worker bool workgroup_size_variable:1; 250*61046927SAndroid Build Coastguard Worker 251*61046927SAndroid Build Coastguard Worker /** 252*61046927SAndroid Build Coastguard Worker * Whether the shader uses printf instructions. 253*61046927SAndroid Build Coastguard Worker */ 254*61046927SAndroid Build Coastguard Worker bool uses_printf:1; 255*61046927SAndroid Build Coastguard Worker 256*61046927SAndroid Build Coastguard Worker /** 257*61046927SAndroid Build Coastguard Worker * VK_KHR_shader_maximal_reconvergence 258*61046927SAndroid Build Coastguard Worker */ 259*61046927SAndroid Build Coastguard Worker bool maximally_reconverges:1; 260*61046927SAndroid Build Coastguard Worker 261*61046927SAndroid Build Coastguard Worker /* Use ACO instead of LLVM on AMD. */ 262*61046927SAndroid Build Coastguard Worker bool use_aco_amd:1; 263*61046927SAndroid Build Coastguard Worker 264*61046927SAndroid Build Coastguard Worker /** 265*61046927SAndroid Build Coastguard Worker * Set if this shader uses legacy (DX9 or ARB assembly) math rules. 266*61046927SAndroid Build Coastguard Worker * 267*61046927SAndroid Build Coastguard Worker * From the ARB_fragment_program specification: 268*61046927SAndroid Build Coastguard Worker * 269*61046927SAndroid Build Coastguard Worker * "The following rules apply to multiplication: 270*61046927SAndroid Build Coastguard Worker * 271*61046927SAndroid Build Coastguard Worker * 1. <x> * <y> == <y> * <x>, for all <x> and <y>. 272*61046927SAndroid Build Coastguard Worker * 2. +/-0.0 * <x> = +/-0.0, at least for all <x> that correspond to 273*61046927SAndroid Build Coastguard Worker * *representable numbers (IEEE "not a number" and "infinity" 274*61046927SAndroid Build Coastguard Worker * *encodings may be exceptions). 275*61046927SAndroid Build Coastguard Worker * 3. +1.0 * <x> = <x>, for all <x>."" 276*61046927SAndroid Build Coastguard Worker * 277*61046927SAndroid Build Coastguard Worker * However, in effect this was due to DX9 semantics implying that 0*x=0 even 278*61046927SAndroid Build Coastguard Worker * for inf/nan if the hardware generated them instead of float_min/max. So, 279*61046927SAndroid Build Coastguard Worker * you should not have an exception for inf/nan to rule 2 above. 280*61046927SAndroid Build Coastguard Worker * 281*61046927SAndroid Build Coastguard Worker * One implementation of this behavior would be to flush all generated NaNs 282*61046927SAndroid Build Coastguard Worker * to zero, at which point 0*Inf=Nan=0. Most DX9/ARB-asm hardware did not 283*61046927SAndroid Build Coastguard Worker * generate NaNs, and the only way the GPU saw one was to possibly feed it 284*61046927SAndroid Build Coastguard Worker * in as a uniform. 285*61046927SAndroid Build Coastguard Worker */ 286*61046927SAndroid Build Coastguard Worker bool use_legacy_math_rules; 287*61046927SAndroid Build Coastguard Worker 288*61046927SAndroid Build Coastguard Worker /* 289*61046927SAndroid Build Coastguard Worker * Arrangement of invocations used to calculate derivatives in 290*61046927SAndroid Build Coastguard Worker * compute/task/mesh shaders. From KHR_compute_shader_derivatives. 291*61046927SAndroid Build Coastguard Worker */ 292*61046927SAndroid Build Coastguard Worker enum gl_derivative_group derivative_group:2; 293*61046927SAndroid Build Coastguard Worker 294*61046927SAndroid Build Coastguard Worker union { 295*61046927SAndroid Build Coastguard Worker struct { 296*61046927SAndroid Build Coastguard Worker /* Which inputs are doubles */ 297*61046927SAndroid Build Coastguard Worker uint64_t double_inputs; 298*61046927SAndroid Build Coastguard Worker 299*61046927SAndroid Build Coastguard Worker /* For AMD-specific driver-internal shaders. It replaces vertex 300*61046927SAndroid Build Coastguard Worker * buffer loads with code generating VS inputs from scalar registers. 301*61046927SAndroid Build Coastguard Worker * 302*61046927SAndroid Build Coastguard Worker * Valid values: SI_VS_BLIT_SGPRS_POS_* 303*61046927SAndroid Build Coastguard Worker */ 304*61046927SAndroid Build Coastguard Worker uint8_t blit_sgprs_amd:4; 305*61046927SAndroid Build Coastguard Worker 306*61046927SAndroid Build Coastguard Worker /* Software TES executing as HW VS */ 307*61046927SAndroid Build Coastguard Worker bool tes_agx:1; 308*61046927SAndroid Build Coastguard Worker 309*61046927SAndroid Build Coastguard Worker /* True if the shader writes position in window space coordinates pre-transform */ 310*61046927SAndroid Build Coastguard Worker bool window_space_position:1; 311*61046927SAndroid Build Coastguard Worker 312*61046927SAndroid Build Coastguard Worker /** Is an edge flag input needed? */ 313*61046927SAndroid Build Coastguard Worker bool needs_edge_flag:1; 314*61046927SAndroid Build Coastguard Worker } vs; 315*61046927SAndroid Build Coastguard Worker 316*61046927SAndroid Build Coastguard Worker struct { 317*61046927SAndroid Build Coastguard Worker /** The output primitive type */ 318*61046927SAndroid Build Coastguard Worker enum mesa_prim output_primitive; 319*61046927SAndroid Build Coastguard Worker 320*61046927SAndroid Build Coastguard Worker /** The input primitive type */ 321*61046927SAndroid Build Coastguard Worker enum mesa_prim input_primitive; 322*61046927SAndroid Build Coastguard Worker 323*61046927SAndroid Build Coastguard Worker /** The maximum number of vertices the geometry shader might write. */ 324*61046927SAndroid Build Coastguard Worker uint16_t vertices_out; 325*61046927SAndroid Build Coastguard Worker 326*61046927SAndroid Build Coastguard Worker /** 1 .. MAX_GEOMETRY_SHADER_INVOCATIONS */ 327*61046927SAndroid Build Coastguard Worker uint8_t invocations; 328*61046927SAndroid Build Coastguard Worker 329*61046927SAndroid Build Coastguard Worker /** The number of vertices received per input primitive (max. 6) */ 330*61046927SAndroid Build Coastguard Worker uint8_t vertices_in:3; 331*61046927SAndroid Build Coastguard Worker 332*61046927SAndroid Build Coastguard Worker /** Whether or not this shader uses EndPrimitive */ 333*61046927SAndroid Build Coastguard Worker bool uses_end_primitive:1; 334*61046927SAndroid Build Coastguard Worker 335*61046927SAndroid Build Coastguard Worker /** The streams used in this shaders (max. 4) */ 336*61046927SAndroid Build Coastguard Worker uint8_t active_stream_mask:4; 337*61046927SAndroid Build Coastguard Worker } gs; 338*61046927SAndroid Build Coastguard Worker 339*61046927SAndroid Build Coastguard Worker struct { 340*61046927SAndroid Build Coastguard Worker bool uses_discard:1; 341*61046927SAndroid Build Coastguard Worker bool uses_fbfetch_output:1; 342*61046927SAndroid Build Coastguard Worker bool fbfetch_coherent:1; 343*61046927SAndroid Build Coastguard Worker bool color_is_dual_source:1; 344*61046927SAndroid Build Coastguard Worker 345*61046927SAndroid Build Coastguard Worker /** 346*61046927SAndroid Build Coastguard Worker * True if this fragment shader requires full quad invocations. 347*61046927SAndroid Build Coastguard Worker */ 348*61046927SAndroid Build Coastguard Worker bool require_full_quads:1; 349*61046927SAndroid Build Coastguard Worker 350*61046927SAndroid Build Coastguard Worker /** 351*61046927SAndroid Build Coastguard Worker * Whether the derivative group must be equivalent to the quad group. 352*61046927SAndroid Build Coastguard Worker */ 353*61046927SAndroid Build Coastguard Worker bool quad_derivatives:1; 354*61046927SAndroid Build Coastguard Worker 355*61046927SAndroid Build Coastguard Worker /** 356*61046927SAndroid Build Coastguard Worker * True if this fragment shader requires helper invocations. This 357*61046927SAndroid Build Coastguard Worker * can be caused by the use of ALU derivative ops, texture 358*61046927SAndroid Build Coastguard Worker * instructions which do implicit derivatives, the use of quad 359*61046927SAndroid Build Coastguard Worker * subgroup operations or if the shader requires full quads. 360*61046927SAndroid Build Coastguard Worker */ 361*61046927SAndroid Build Coastguard Worker bool needs_quad_helper_invocations:1; 362*61046927SAndroid Build Coastguard Worker 363*61046927SAndroid Build Coastguard Worker /** 364*61046927SAndroid Build Coastguard Worker * Whether any inputs are declared with the "sample" qualifier. 365*61046927SAndroid Build Coastguard Worker */ 366*61046927SAndroid Build Coastguard Worker bool uses_sample_qualifier:1; 367*61046927SAndroid Build Coastguard Worker 368*61046927SAndroid Build Coastguard Worker /** 369*61046927SAndroid Build Coastguard Worker * Whether sample shading is used. 370*61046927SAndroid Build Coastguard Worker */ 371*61046927SAndroid Build Coastguard Worker bool uses_sample_shading:1; 372*61046927SAndroid Build Coastguard Worker 373*61046927SAndroid Build Coastguard Worker /** 374*61046927SAndroid Build Coastguard Worker * Whether early fragment tests are enabled as defined by 375*61046927SAndroid Build Coastguard Worker * ARB_shader_image_load_store. 376*61046927SAndroid Build Coastguard Worker */ 377*61046927SAndroid Build Coastguard Worker bool early_fragment_tests:1; 378*61046927SAndroid Build Coastguard Worker 379*61046927SAndroid Build Coastguard Worker /** 380*61046927SAndroid Build Coastguard Worker * Defined by INTEL_conservative_rasterization. 381*61046927SAndroid Build Coastguard Worker */ 382*61046927SAndroid Build Coastguard Worker bool inner_coverage:1; 383*61046927SAndroid Build Coastguard Worker 384*61046927SAndroid Build Coastguard Worker bool post_depth_coverage:1; 385*61046927SAndroid Build Coastguard Worker 386*61046927SAndroid Build Coastguard Worker /** 387*61046927SAndroid Build Coastguard Worker * \name ARB_fragment_coord_conventions 388*61046927SAndroid Build Coastguard Worker * @{ 389*61046927SAndroid Build Coastguard Worker */ 390*61046927SAndroid Build Coastguard Worker bool pixel_center_integer:1; 391*61046927SAndroid Build Coastguard Worker bool origin_upper_left:1; 392*61046927SAndroid Build Coastguard Worker /*@}*/ 393*61046927SAndroid Build Coastguard Worker 394*61046927SAndroid Build Coastguard Worker bool pixel_interlock_ordered:1; 395*61046927SAndroid Build Coastguard Worker bool pixel_interlock_unordered:1; 396*61046927SAndroid Build Coastguard Worker bool sample_interlock_ordered:1; 397*61046927SAndroid Build Coastguard Worker bool sample_interlock_unordered:1; 398*61046927SAndroid Build Coastguard Worker 399*61046927SAndroid Build Coastguard Worker /** 400*61046927SAndroid Build Coastguard Worker * Flags whether NIR's base types on the FS color outputs should be 401*61046927SAndroid Build Coastguard Worker * ignored. 402*61046927SAndroid Build Coastguard Worker * 403*61046927SAndroid Build Coastguard Worker * GLSL requires that fragment shader output base types match the 404*61046927SAndroid Build Coastguard Worker * render target's base types for the behavior to be defined. From 405*61046927SAndroid Build Coastguard Worker * the GL 4.6 spec: 406*61046927SAndroid Build Coastguard Worker * 407*61046927SAndroid Build Coastguard Worker * "If the values written by the fragment shader do not match the 408*61046927SAndroid Build Coastguard Worker * format(s) of the corresponding color buffer(s), the result is 409*61046927SAndroid Build Coastguard Worker * undefined." 410*61046927SAndroid Build Coastguard Worker * 411*61046927SAndroid Build Coastguard Worker * However, for NIR shaders translated from TGSI, we don't have the 412*61046927SAndroid Build Coastguard Worker * output types any more, so the driver will need to do whatever 413*61046927SAndroid Build Coastguard Worker * fixups are necessary to handle effectively untyped data being 414*61046927SAndroid Build Coastguard Worker * output from the FS. 415*61046927SAndroid Build Coastguard Worker */ 416*61046927SAndroid Build Coastguard Worker bool untyped_color_outputs:1; 417*61046927SAndroid Build Coastguard Worker 418*61046927SAndroid Build Coastguard Worker /** gl_FragDepth layout for ARB_conservative_depth. */ 419*61046927SAndroid Build Coastguard Worker enum gl_frag_depth_layout depth_layout:3; 420*61046927SAndroid Build Coastguard Worker 421*61046927SAndroid Build Coastguard Worker /** 422*61046927SAndroid Build Coastguard Worker * Interpolation qualifiers for drivers that lowers color inputs 423*61046927SAndroid Build Coastguard Worker * to system values. 424*61046927SAndroid Build Coastguard Worker */ 425*61046927SAndroid Build Coastguard Worker unsigned color0_interp:3; /* glsl_interp_mode */ 426*61046927SAndroid Build Coastguard Worker bool color0_sample:1; 427*61046927SAndroid Build Coastguard Worker bool color0_centroid:1; 428*61046927SAndroid Build Coastguard Worker unsigned color1_interp:3; /* glsl_interp_mode */ 429*61046927SAndroid Build Coastguard Worker bool color1_sample:1; 430*61046927SAndroid Build Coastguard Worker bool color1_centroid:1; 431*61046927SAndroid Build Coastguard Worker 432*61046927SAndroid Build Coastguard Worker /* Bitmask of gl_advanced_blend_mode values that may be used with this 433*61046927SAndroid Build Coastguard Worker * shader. 434*61046927SAndroid Build Coastguard Worker */ 435*61046927SAndroid Build Coastguard Worker unsigned advanced_blend_modes; 436*61046927SAndroid Build Coastguard Worker 437*61046927SAndroid Build Coastguard Worker /** 438*61046927SAndroid Build Coastguard Worker * Defined by AMD_shader_early_and_late_fragment_tests. 439*61046927SAndroid Build Coastguard Worker */ 440*61046927SAndroid Build Coastguard Worker bool early_and_late_fragment_tests:1; 441*61046927SAndroid Build Coastguard Worker enum gl_frag_stencil_layout stencil_front_layout:3; 442*61046927SAndroid Build Coastguard Worker enum gl_frag_stencil_layout stencil_back_layout:3; 443*61046927SAndroid Build Coastguard Worker } fs; 444*61046927SAndroid Build Coastguard Worker 445*61046927SAndroid Build Coastguard Worker struct { 446*61046927SAndroid Build Coastguard Worker uint16_t workgroup_size_hint[3]; 447*61046927SAndroid Build Coastguard Worker 448*61046927SAndroid Build Coastguard Worker uint8_t user_data_components_amd:4; 449*61046927SAndroid Build Coastguard Worker 450*61046927SAndroid Build Coastguard Worker /* 451*61046927SAndroid Build Coastguard Worker * If the shader might run with shared mem on top of `shared_size`. 452*61046927SAndroid Build Coastguard Worker */ 453*61046927SAndroid Build Coastguard Worker bool has_variable_shared_mem:1; 454*61046927SAndroid Build Coastguard Worker 455*61046927SAndroid Build Coastguard Worker /** 456*61046927SAndroid Build Coastguard Worker * If the shader has any use of a cooperative matrix. From 457*61046927SAndroid Build Coastguard Worker * SPV_KHR_cooperative_matrix. 458*61046927SAndroid Build Coastguard Worker */ 459*61046927SAndroid Build Coastguard Worker bool has_cooperative_matrix:1; 460*61046927SAndroid Build Coastguard Worker 461*61046927SAndroid Build Coastguard Worker /** 462*61046927SAndroid Build Coastguard Worker * Number of bytes of shared imageblock memory per thread. Currently, 463*61046927SAndroid Build Coastguard Worker * this requires that the workgroup size is 32x32x1 and that 464*61046927SAndroid Build Coastguard Worker * shared_size = 0. These requirements could be lifted in the future. 465*61046927SAndroid Build Coastguard Worker * However, there is no current OpenGL/Vulkan API support for 466*61046927SAndroid Build Coastguard Worker * imageblocks. This is only used internally to accelerate blit/copy. 467*61046927SAndroid Build Coastguard Worker */ 468*61046927SAndroid Build Coastguard Worker uint8_t image_block_size_per_thread_agx; 469*61046927SAndroid Build Coastguard Worker 470*61046927SAndroid Build Coastguard Worker /** 471*61046927SAndroid Build Coastguard Worker * pointer size is: 472*61046927SAndroid Build Coastguard Worker * AddressingModelLogical: 0 (default) 473*61046927SAndroid Build Coastguard Worker * AddressingModelPhysical32: 32 474*61046927SAndroid Build Coastguard Worker * AddressingModelPhysical64: 64 475*61046927SAndroid Build Coastguard Worker */ 476*61046927SAndroid Build Coastguard Worker unsigned ptr_size; 477*61046927SAndroid Build Coastguard Worker 478*61046927SAndroid Build Coastguard Worker /** Index provided by VkPipelineShaderStageNodeCreateInfoAMDX or ShaderIndexAMDX */ 479*61046927SAndroid Build Coastguard Worker uint32_t shader_index; 480*61046927SAndroid Build Coastguard Worker 481*61046927SAndroid Build Coastguard Worker /** Maximum size required by any output node payload array */ 482*61046927SAndroid Build Coastguard Worker uint32_t node_payloads_size; 483*61046927SAndroid Build Coastguard Worker 484*61046927SAndroid Build Coastguard Worker /** Static workgroup count for overwriting the enqueued workgroup count. (0 if dynamic) */ 485*61046927SAndroid Build Coastguard Worker uint32_t workgroup_count[3]; 486*61046927SAndroid Build Coastguard Worker } cs; 487*61046927SAndroid Build Coastguard Worker 488*61046927SAndroid Build Coastguard Worker /* Applies to both TCS and TES. */ 489*61046927SAndroid Build Coastguard Worker struct { 490*61046927SAndroid Build Coastguard Worker enum tess_primitive_mode _primitive_mode; 491*61046927SAndroid Build Coastguard Worker 492*61046927SAndroid Build Coastguard Worker /** The number of vertices in the TCS output patch. */ 493*61046927SAndroid Build Coastguard Worker uint8_t tcs_vertices_out; 494*61046927SAndroid Build Coastguard Worker unsigned spacing:2; /*gl_tess_spacing*/ 495*61046927SAndroid Build Coastguard Worker 496*61046927SAndroid Build Coastguard Worker /** Is the vertex order counterclockwise? */ 497*61046927SAndroid Build Coastguard Worker bool ccw:1; 498*61046927SAndroid Build Coastguard Worker bool point_mode:1; 499*61046927SAndroid Build Coastguard Worker 500*61046927SAndroid Build Coastguard Worker /* Bit mask of TCS per-vertex inputs (VS outputs) that are used 501*61046927SAndroid Build Coastguard Worker * with a vertex index that is NOT the invocation id 502*61046927SAndroid Build Coastguard Worker */ 503*61046927SAndroid Build Coastguard Worker uint64_t tcs_cross_invocation_inputs_read; 504*61046927SAndroid Build Coastguard Worker 505*61046927SAndroid Build Coastguard Worker /* Bit mask of TCS per-vertex outputs that are used 506*61046927SAndroid Build Coastguard Worker * with a vertex index that is NOT the invocation id 507*61046927SAndroid Build Coastguard Worker */ 508*61046927SAndroid Build Coastguard Worker uint64_t tcs_cross_invocation_outputs_read; 509*61046927SAndroid Build Coastguard Worker } tess; 510*61046927SAndroid Build Coastguard Worker 511*61046927SAndroid Build Coastguard Worker /* Applies to MESH and TASK. */ 512*61046927SAndroid Build Coastguard Worker struct { 513*61046927SAndroid Build Coastguard Worker /* Bit mask of MS outputs that are used 514*61046927SAndroid Build Coastguard Worker * with an index that is NOT the local invocation index. 515*61046927SAndroid Build Coastguard Worker */ 516*61046927SAndroid Build Coastguard Worker uint64_t ms_cross_invocation_output_access; 517*61046927SAndroid Build Coastguard Worker 518*61046927SAndroid Build Coastguard Worker /* Dimensions of task->mesh dispatch (EmitMeshTasksEXT) 519*61046927SAndroid Build Coastguard Worker * when they are known compile-time constants. 520*61046927SAndroid Build Coastguard Worker * 0 means they are not known. 521*61046927SAndroid Build Coastguard Worker */ 522*61046927SAndroid Build Coastguard Worker uint32_t ts_mesh_dispatch_dimensions[3]; 523*61046927SAndroid Build Coastguard Worker 524*61046927SAndroid Build Coastguard Worker uint16_t max_vertices_out; 525*61046927SAndroid Build Coastguard Worker uint16_t max_primitives_out; 526*61046927SAndroid Build Coastguard Worker enum mesa_prim primitive_type; /* POINTS, LINES or TRIANGLES. */ 527*61046927SAndroid Build Coastguard Worker 528*61046927SAndroid Build Coastguard Worker /* TODO: remove this when we stop supporting NV_mesh_shader. */ 529*61046927SAndroid Build Coastguard Worker bool nv; 530*61046927SAndroid Build Coastguard Worker } mesh; 531*61046927SAndroid Build Coastguard Worker }; 532*61046927SAndroid Build Coastguard Worker } shader_info; 533*61046927SAndroid Build Coastguard Worker 534*61046927SAndroid Build Coastguard Worker #ifdef __cplusplus 535*61046927SAndroid Build Coastguard Worker } 536*61046927SAndroid Build Coastguard Worker #endif 537*61046927SAndroid Build Coastguard Worker 538*61046927SAndroid Build Coastguard Worker #endif /* SHADER_INFO_H */ 539