1/* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 2004-2007 Brian Paul All Rights Reserved. 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice shall be included 14 * in all copies or substantial portions of the Software. 15 * 16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 17 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 20 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 21 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 22 * OTHER DEALINGS IN THE SOFTWARE. 23 */ 24 25 26#ifndef SHADEROBJ_H 27#define SHADEROBJ_H 28 29 30#include "main/compiler.h" 31#include "main/glheader.h" 32#include "main/mtypes.h" 33#include "program/ir_to_mesa.h" 34 35 36#ifdef __cplusplus 37extern "C" { 38#endif 39 40 41/** 42 * Internal functions 43 */ 44 45extern void 46_mesa_init_shader_state(struct gl_context * ctx); 47 48extern void 49_mesa_free_shader_state(struct gl_context *ctx); 50 51 52extern void 53_mesa_reference_shader(struct gl_context *ctx, struct gl_shader **ptr, 54 struct gl_shader *sh); 55 56extern struct gl_shader * 57_mesa_lookup_shader(struct gl_context *ctx, GLuint name); 58 59extern struct gl_shader * 60_mesa_lookup_shader_err(struct gl_context *ctx, GLuint name, const char *caller); 61 62 63 64extern void 65_mesa_reference_shader_program_(struct gl_context *ctx, 66 struct gl_shader_program **ptr, 67 struct gl_shader_program *shProg); 68 69void 70_mesa_reference_shader_program_data(struct gl_context *ctx, 71 struct gl_shader_program_data **ptr, 72 struct gl_shader_program_data *data); 73 74static inline void 75_mesa_reference_shader_program(struct gl_context *ctx, 76 struct gl_shader_program **ptr, 77 struct gl_shader_program *shProg) 78{ 79 if (*ptr != shProg) 80 _mesa_reference_shader_program_(ctx, ptr, shProg); 81} 82 83extern struct gl_shader * 84_mesa_new_shader(GLuint name, gl_shader_stage type); 85 86extern void 87_mesa_delete_shader(struct gl_context *ctx, struct gl_shader *sh); 88 89extern void 90_mesa_delete_linked_shader(struct gl_context *ctx, 91 struct gl_linked_shader *sh); 92 93extern struct gl_shader_program * 94_mesa_lookup_shader_program(struct gl_context *ctx, GLuint name); 95 96extern struct gl_shader_program * 97_mesa_lookup_shader_program_err(struct gl_context *ctx, GLuint name, 98 const char *caller); 99 100extern struct gl_shader_program * 101_mesa_new_shader_program(GLuint name); 102 103extern void 104_mesa_clear_shader_program_data(struct gl_context *ctx, 105 struct gl_shader_program *shProg); 106 107extern void 108_mesa_free_shader_program_data(struct gl_context *ctx, 109 struct gl_shader_program *shProg); 110 111extern void 112_mesa_delete_shader_program(struct gl_context *ctx, 113 struct gl_shader_program *shProg); 114 115 116extern void 117_mesa_init_shader_object_functions(struct dd_function_table *driver); 118 119static inline gl_shader_stage 120_mesa_shader_enum_to_shader_stage(GLenum v) 121{ 122 switch (v) { 123 case GL_VERTEX_SHADER: 124 return MESA_SHADER_VERTEX; 125 case GL_FRAGMENT_SHADER: 126 return MESA_SHADER_FRAGMENT; 127 case GL_GEOMETRY_SHADER: 128 return MESA_SHADER_GEOMETRY; 129 case GL_TESS_CONTROL_SHADER: 130 return MESA_SHADER_TESS_CTRL; 131 case GL_TESS_EVALUATION_SHADER: 132 return MESA_SHADER_TESS_EVAL; 133 case GL_COMPUTE_SHADER: 134 return MESA_SHADER_COMPUTE; 135 default: 136 unreachable("bad value in _mesa_shader_enum_to_shader_stage()"); 137 } 138} 139 140/* 8 bytes + another underscore */ 141#define MESA_SUBROUTINE_PREFIX_LEN 9 142static inline const char * 143_mesa_shader_stage_to_subroutine_prefix(gl_shader_stage stage) 144{ 145 switch (stage) { 146 case MESA_SHADER_VERTEX: 147 return "__subu_v"; 148 case MESA_SHADER_GEOMETRY: 149 return "__subu_g"; 150 case MESA_SHADER_FRAGMENT: 151 return "__subu_f"; 152 case MESA_SHADER_COMPUTE: 153 return "__subu_c"; 154 case MESA_SHADER_TESS_CTRL: 155 return "__subu_t"; 156 case MESA_SHADER_TESS_EVAL: 157 return "__subu_e"; 158 default: 159 return NULL; 160 } 161} 162 163static inline gl_shader_stage 164_mesa_shader_stage_from_subroutine_uniform(GLenum subuniform) 165{ 166 switch (subuniform) { 167 case GL_VERTEX_SUBROUTINE_UNIFORM: 168 return MESA_SHADER_VERTEX; 169 case GL_GEOMETRY_SUBROUTINE_UNIFORM: 170 return MESA_SHADER_GEOMETRY; 171 case GL_FRAGMENT_SUBROUTINE_UNIFORM: 172 return MESA_SHADER_FRAGMENT; 173 case GL_COMPUTE_SUBROUTINE_UNIFORM: 174 return MESA_SHADER_COMPUTE; 175 case GL_TESS_CONTROL_SUBROUTINE_UNIFORM: 176 return MESA_SHADER_TESS_CTRL; 177 case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM: 178 return MESA_SHADER_TESS_EVAL; 179 } 180 unreachable("not reached"); 181} 182 183static inline gl_shader_stage 184_mesa_shader_stage_from_subroutine(GLenum subroutine) 185{ 186 switch (subroutine) { 187 case GL_VERTEX_SUBROUTINE: 188 return MESA_SHADER_VERTEX; 189 case GL_GEOMETRY_SUBROUTINE: 190 return MESA_SHADER_GEOMETRY; 191 case GL_FRAGMENT_SUBROUTINE: 192 return MESA_SHADER_FRAGMENT; 193 case GL_COMPUTE_SUBROUTINE: 194 return MESA_SHADER_COMPUTE; 195 case GL_TESS_CONTROL_SUBROUTINE: 196 return MESA_SHADER_TESS_CTRL; 197 case GL_TESS_EVALUATION_SUBROUTINE: 198 return MESA_SHADER_TESS_EVAL; 199 } 200 unreachable("not reached"); 201} 202 203static inline GLenum 204_mesa_shader_stage_to_subroutine(gl_shader_stage stage) 205{ 206 switch (stage) { 207 case MESA_SHADER_VERTEX: 208 return GL_VERTEX_SUBROUTINE; 209 case MESA_SHADER_GEOMETRY: 210 return GL_GEOMETRY_SUBROUTINE; 211 case MESA_SHADER_FRAGMENT: 212 return GL_FRAGMENT_SUBROUTINE; 213 case MESA_SHADER_COMPUTE: 214 return GL_COMPUTE_SUBROUTINE; 215 case MESA_SHADER_TESS_CTRL: 216 return GL_TESS_CONTROL_SUBROUTINE; 217 case MESA_SHADER_TESS_EVAL: 218 return GL_TESS_EVALUATION_SUBROUTINE; 219 } 220 unreachable("not reached"); 221} 222 223static inline GLenum 224_mesa_shader_stage_to_subroutine_uniform(gl_shader_stage stage) 225{ 226 switch (stage) { 227 case MESA_SHADER_VERTEX: 228 return GL_VERTEX_SUBROUTINE_UNIFORM; 229 case MESA_SHADER_GEOMETRY: 230 return GL_GEOMETRY_SUBROUTINE_UNIFORM; 231 case MESA_SHADER_FRAGMENT: 232 return GL_FRAGMENT_SUBROUTINE_UNIFORM; 233 case MESA_SHADER_COMPUTE: 234 return GL_COMPUTE_SUBROUTINE_UNIFORM; 235 case MESA_SHADER_TESS_CTRL: 236 return GL_TESS_CONTROL_SUBROUTINE_UNIFORM; 237 case MESA_SHADER_TESS_EVAL: 238 return GL_TESS_EVALUATION_SUBROUTINE_UNIFORM; 239 } 240 unreachable("not reached"); 241} 242 243extern bool 244_mesa_validate_pipeline_io(struct gl_pipeline_object *); 245 246#ifdef __cplusplus 247} 248#endif 249 250#endif /* SHADEROBJ_H */ 251