#ifndef SHADER_INFO_H
#define SHADER_INFO_H
#include "shader_enums.h"
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
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 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 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;
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 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;
};
typedef struct shader_info {
const char *name;
const char *label;
gl_shader_stage stage:8;
gl_shader_stage next_stage:8;
uint8_t num_textures;
uint8_t num_ubos;
uint8_t num_abos;
uint8_t num_ssbos;
uint8_t num_images;
int8_t last_msaa_image;
uint64_t inputs_read;
uint64_t outputs_written;
uint64_t outputs_read;
uint64_t system_values_read;
uint32_t patch_inputs_read;
uint32_t patch_outputs_written;
uint32_t patch_outputs_read;
uint64_t inputs_read_indirectly;
uint64_t outputs_accessed_indirectly;
uint64_t patch_inputs_read_indirectly;
uint64_t patch_outputs_accessed_indirectly;
uint32_t textures_used;
uint32_t textures_used_by_txf;
uint32_t images_used;
uint16_t float_controls_execution_mode;
uint8_t clip_distance_array_size:4;
uint8_t cull_distance_array_size:4;
bool uses_texture_gather:1;
bool uses_fddx_fddy:1;
bool uses_64bit:1;
bool first_ubo_is_default_ubo:1;
bool separate_shader:1;
bool has_transform_feedback_varyings:1;
bool flrp_lowered:1;
bool writes_memory:1;
bool layer_viewport_relative:1;
union {
struct {
uint64_t double_inputs;
uint8_t blit_sgprs_amd:4;
bool window_space_position:1;
} vs;
struct {
uint16_t output_primitive;
uint16_t input_primitive;
uint16_t vertices_out;
uint8_t invocations;
uint8_t vertices_in:3;
bool uses_end_primitive:1;
bool uses_streams:1;
} gs;
struct {
bool uses_discard:1;
bool uses_demote:1;
bool needs_helper_invocations:1;
bool uses_sample_qualifier:1;
bool early_fragment_tests:1;
bool inner_coverage:1;
bool post_depth_coverage:1;
bool pixel_center_integer:1;
bool origin_upper_left:1;
bool pixel_interlock_ordered:1;
bool pixel_interlock_unordered:1;
bool sample_interlock_ordered:1;
bool sample_interlock_unordered:1;
bool untyped_color_outputs:1;
enum gl_frag_depth_layout depth_layout:3;
} fs;
struct {
uint16_t local_size[3];
uint16_t max_variable_local_size;
bool local_size_variable:1;
uint8_t user_data_components_amd:3;
enum gl_derivative_group derivative_group:2;
unsigned shared_size;
unsigned ptr_size;
} cs;
struct {
uint16_t primitive_mode;
uint8_t tcs_vertices_out;
enum gl_tess_spacing spacing:2;
bool ccw:1;
bool point_mode:1;
uint64_t tcs_cross_invocation_inputs_read;
uint64_t tcs_cross_invocation_outputs_read;
} tess;
};
} shader_info;
#ifdef __cplusplus
}
#endif
#endif