X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fcompiler%2Fshader_info.h;h=bd5d2fa0b6ca75d34e230f356a42ac41df9ea549;hb=6167a63839338ffb5f972366f4194e86c5f62a81;hp=c8ac0b90b33fe8da23525b7094cb5ea61a72406c;hpb=d792f3d4cd49a5022dbdc00770a3144907640dfd;p=mesa.git diff --git a/src/compiler/shader_info.h b/src/compiler/shader_info.h index c8ac0b90b33..bd5d2fa0b6c 100644 --- a/src/compiler/shader_info.h +++ b/src/compiler/shader_info.h @@ -33,21 +33,50 @@ 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 float64; + 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 kernel; + 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 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 variable_pointers; + bool float16; + bool amd_gcn_shader; + bool amd_shader_ballot; + bool amd_trinary_minmax; }; typedef struct shader_info { @@ -59,6 +88,11 @@ typedef struct shader_info { /** 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 */ @@ -89,6 +123,9 @@ typedef struct shader_info { /* 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; @@ -99,6 +136,11 @@ typedef struct shader_info { */ 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; @@ -116,8 +158,15 @@ typedef struct shader_info { /* 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_* + */ + unsigned blit_sgprs_amd; + + /* True if the shader writes position in window space coordinates pre-transform */ + bool window_space_position; } vs; struct { @@ -146,6 +195,14 @@ typedef struct shader_info { struct { bool uses_discard; + /** + * 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; + /** * Whether any inputs are declared with the "sample" qualifier. */ @@ -164,7 +221,37 @@ typedef struct shader_info { bool post_depth_coverage; + /** + * \name ARB_fragment_coord_conventions + * @{ + */ bool pixel_center_integer; + bool origin_upper_left; + /*@}*/ + + 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; @@ -174,11 +261,27 @@ typedef struct shader_info { unsigned local_size[3]; bool local_size_variable; + char user_data_components_amd; /** * 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; + + /* + * 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. */