1 /* 2 * Copyright 2014 Connor Abbott 3 * 4 * Permission is hereby granted, free of charge, to any person obtaining a 5 * copy of this software and associated documentation files (the "Software"), 6 * to deal in the Software without restriction, including without limitation 7 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8 * and/or sell copies of the Software, and to permit persons to whom the 9 * Software is furnished to do so, subject to the following conditions: 10 * 11 * The above copyright notice and this permission notice (including the next 12 * paragraph) shall be included in all copies or substantial portions of the 13 * Software. 14 * 15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 21 * IN THE SOFTWARE. 22 * 23 * Authors: 24 * Connor Abbott (cwabbott0 (at) gmail.com) 25 * 26 */ 27 28 #pragma once 29 30 #include <stdio.h> 31 #include <stdbool.h> 32 33 /* C wrapper around compiler/glsl_types.h */ 34 35 #include "glsl_types.h" 36 37 #ifdef __cplusplus 38 extern "C" { 39 #else 40 struct glsl_type; 41 #endif 42 43 const char *glsl_get_type_name(const struct glsl_type *type); 44 45 const struct glsl_type *glsl_get_struct_field(const struct glsl_type *type, 46 unsigned index); 47 48 const struct glsl_type *glsl_get_array_element(const struct glsl_type *type); 49 const struct glsl_type *glsl_without_array(const struct glsl_type *type); 50 51 const struct glsl_type *glsl_get_column_type(const struct glsl_type *type); 52 53 const struct glsl_type * 54 glsl_get_function_return_type(const struct glsl_type *type); 55 56 const struct glsl_function_param * 57 glsl_get_function_param(const struct glsl_type *type, unsigned index); 58 59 enum glsl_base_type glsl_get_base_type(const struct glsl_type *type); 60 61 unsigned glsl_get_vector_elements(const struct glsl_type *type); 62 63 unsigned glsl_get_components(const struct glsl_type *type); 64 65 unsigned glsl_get_matrix_columns(const struct glsl_type *type); 66 67 unsigned glsl_get_length(const struct glsl_type *type); 68 69 unsigned glsl_get_aoa_size(const struct glsl_type *type); 70 71 unsigned glsl_count_attribute_slots(const struct glsl_type *type, 72 bool is_vertex_input); 73 74 const char *glsl_get_struct_elem_name(const struct glsl_type *type, 75 unsigned index); 76 77 enum glsl_sampler_dim glsl_get_sampler_dim(const struct glsl_type *type); 78 enum glsl_base_type glsl_get_sampler_result_type(const struct glsl_type *type); 79 80 unsigned glsl_get_record_location_offset(const struct glsl_type *type, 81 unsigned length); 82 83 static inline unsigned 84 glsl_get_bit_size(const struct glsl_type *type) 85 { 86 switch (glsl_get_base_type(type)) { 87 case GLSL_TYPE_INT: 88 case GLSL_TYPE_UINT: 89 case GLSL_TYPE_BOOL: 90 case GLSL_TYPE_FLOAT: /* TODO handle mediump */ 91 case GLSL_TYPE_SUBROUTINE: 92 return 32; 93 94 case GLSL_TYPE_DOUBLE: 95 return 64; 96 97 default: 98 unreachable("unknown base type"); 99 } 100 101 return 0; 102 } 103 104 bool glsl_type_is_void(const struct glsl_type *type); 105 bool glsl_type_is_error(const struct glsl_type *type); 106 bool glsl_type_is_vector(const struct glsl_type *type); 107 bool glsl_type_is_scalar(const struct glsl_type *type); 108 bool glsl_type_is_vector_or_scalar(const struct glsl_type *type); 109 bool glsl_type_is_matrix(const struct glsl_type *type); 110 bool glsl_type_is_array(const struct glsl_type *type); 111 bool glsl_type_is_array_of_arrays(const struct glsl_type *type); 112 bool glsl_type_is_struct(const struct glsl_type *type); 113 bool glsl_type_is_sampler(const struct glsl_type *type); 114 bool glsl_type_is_image(const struct glsl_type *type); 115 bool glsl_type_is_dual_slot(const struct glsl_type *type); 116 bool glsl_type_is_numeric(const struct glsl_type *type); 117 bool glsl_type_is_boolean(const struct glsl_type *type); 118 bool glsl_sampler_type_is_shadow(const struct glsl_type *type); 119 bool glsl_sampler_type_is_array(const struct glsl_type *type); 120 121 const struct glsl_type *glsl_void_type(void); 122 const struct glsl_type *glsl_float_type(void); 123 const struct glsl_type *glsl_double_type(void); 124 const struct glsl_type *glsl_vec_type(unsigned n); 125 const struct glsl_type *glsl_dvec_type(unsigned n); 126 const struct glsl_type *glsl_vec4_type(void); 127 const struct glsl_type *glsl_int_type(void); 128 const struct glsl_type *glsl_uint_type(void); 129 const struct glsl_type *glsl_bool_type(void); 130 131 const struct glsl_type *glsl_scalar_type(enum glsl_base_type base_type); 132 const struct glsl_type *glsl_vector_type(enum glsl_base_type base_type, 133 unsigned components); 134 const struct glsl_type *glsl_matrix_type(enum glsl_base_type base_type, 135 unsigned rows, unsigned columns); 136 const struct glsl_type *glsl_array_type(const struct glsl_type *base, 137 unsigned elements); 138 const struct glsl_type *glsl_struct_type(const struct glsl_struct_field *fields, 139 unsigned num_fields, const char *name); 140 const struct glsl_type *glsl_sampler_type(enum glsl_sampler_dim dim, 141 bool is_shadow, bool is_array, 142 enum glsl_base_type base_type); 143 const struct glsl_type *glsl_bare_sampler_type(); 144 const struct glsl_type *glsl_image_type(enum glsl_sampler_dim dim, 145 bool is_array, 146 enum glsl_base_type base_type); 147 const struct glsl_type * glsl_function_type(const struct glsl_type *return_type, 148 const struct glsl_function_param *params, 149 unsigned num_params); 150 151 const struct glsl_type *glsl_transposed_type(const struct glsl_type *type); 152 153 #ifdef __cplusplus 154 } 155 #endif 156