X-Git-Url: https://git.libre-soc.org/?a=blobdiff_plain;f=src%2Fmesa%2Fmain%2Fshaderobj.h;h=97b8ce7ac233f55c22561374ce4679cfbfd943f6;hb=167f6a33fa7be914f4b5171eeeb82bc5e01255f9;hp=d72919c1f09c45fdab683f609ba8ec7b785df98f;hpb=e5162defc8169a1d0a06e16c65c5f63b98923426;p=mesa.git diff --git a/src/mesa/main/shaderobj.h b/src/mesa/main/shaderobj.h index d72919c1f09..97b8ce7ac23 100644 --- a/src/mesa/main/shaderobj.h +++ b/src/mesa/main/shaderobj.h @@ -62,17 +62,33 @@ _mesa_lookup_shader_err(struct gl_context *ctx, GLuint name, const char *caller) extern void -_mesa_reference_shader_program(struct gl_context *ctx, +_mesa_reference_shader_program_(struct gl_context *ctx, struct gl_shader_program **ptr, struct gl_shader_program *shProg); -extern void -_mesa_init_shader(struct gl_context *ctx, struct gl_shader *shader); + +void +_mesa_reference_shader_program_data(struct gl_context *ctx, + struct gl_shader_program_data **ptr, + struct gl_shader_program_data *data); + +static inline void +_mesa_reference_shader_program(struct gl_context *ctx, + struct gl_shader_program **ptr, + struct gl_shader_program *shProg) +{ + if (*ptr != shProg) + _mesa_reference_shader_program_(ctx, ptr, shProg); +} extern struct gl_shader * -_mesa_new_shader(struct gl_context *ctx, GLuint name, GLenum type); +_mesa_new_shader(GLuint name, gl_shader_stage type); extern void -_mesa_init_shader_program(struct gl_context *ctx, struct gl_shader_program *prog); +_mesa_delete_shader(struct gl_context *ctx, struct gl_shader *sh); + +extern void +_mesa_delete_linked_shader(struct gl_context *ctx, + struct gl_linked_shader *sh); extern struct gl_shader_program * _mesa_lookup_shader_program(struct gl_context *ctx, GLuint name); @@ -81,6 +97,9 @@ extern struct gl_shader_program * _mesa_lookup_shader_program_err(struct gl_context *ctx, GLuint name, const char *caller); +extern struct gl_shader_program * +_mesa_new_shader_program(GLuint name); + extern void _mesa_clear_shader_program_data(struct gl_context *ctx, struct gl_shader_program *shProg); @@ -89,6 +108,9 @@ extern void _mesa_free_shader_program_data(struct gl_context *ctx, struct gl_shader_program *shProg); +extern void +_mesa_delete_shader_program(struct gl_context *ctx, + struct gl_shader_program *shProg); extern void @@ -104,14 +126,126 @@ _mesa_shader_enum_to_shader_stage(GLenum v) return MESA_SHADER_FRAGMENT; case GL_GEOMETRY_SHADER: return MESA_SHADER_GEOMETRY; + case GL_TESS_CONTROL_SHADER: + return MESA_SHADER_TESS_CTRL; + case GL_TESS_EVALUATION_SHADER: + return MESA_SHADER_TESS_EVAL; case GL_COMPUTE_SHADER: return MESA_SHADER_COMPUTE; default: - ASSERT(0 && "bad value in _mesa_shader_enum_to_shader_stage()"); + unreachable("bad value in _mesa_shader_enum_to_shader_stage()"); + } +} + +/* 8 bytes + another underscore */ +#define MESA_SUBROUTINE_PREFIX_LEN 9 +static inline const char * +_mesa_shader_stage_to_subroutine_prefix(gl_shader_stage stage) +{ + switch (stage) { + case MESA_SHADER_VERTEX: + return "__subu_v"; + case MESA_SHADER_GEOMETRY: + return "__subu_g"; + case MESA_SHADER_FRAGMENT: + return "__subu_f"; + case MESA_SHADER_COMPUTE: + return "__subu_c"; + case MESA_SHADER_TESS_CTRL: + return "__subu_t"; + case MESA_SHADER_TESS_EVAL: + return "__subu_e"; + default: + return NULL; + } +} + +static inline gl_shader_stage +_mesa_shader_stage_from_subroutine_uniform(GLenum subuniform) +{ + switch (subuniform) { + case GL_VERTEX_SUBROUTINE_UNIFORM: return MESA_SHADER_VERTEX; + case GL_GEOMETRY_SUBROUTINE_UNIFORM: + return MESA_SHADER_GEOMETRY; + case GL_FRAGMENT_SUBROUTINE_UNIFORM: + return MESA_SHADER_FRAGMENT; + case GL_COMPUTE_SUBROUTINE_UNIFORM: + return MESA_SHADER_COMPUTE; + case GL_TESS_CONTROL_SUBROUTINE_UNIFORM: + return MESA_SHADER_TESS_CTRL; + case GL_TESS_EVALUATION_SUBROUTINE_UNIFORM: + return MESA_SHADER_TESS_EVAL; + } + unreachable("not reached"); +} + +static inline gl_shader_stage +_mesa_shader_stage_from_subroutine(GLenum subroutine) +{ + switch (subroutine) { + case GL_VERTEX_SUBROUTINE: + return MESA_SHADER_VERTEX; + case GL_GEOMETRY_SUBROUTINE: + return MESA_SHADER_GEOMETRY; + case GL_FRAGMENT_SUBROUTINE: + return MESA_SHADER_FRAGMENT; + case GL_COMPUTE_SUBROUTINE: + return MESA_SHADER_COMPUTE; + case GL_TESS_CONTROL_SUBROUTINE: + return MESA_SHADER_TESS_CTRL; + case GL_TESS_EVALUATION_SUBROUTINE: + return MESA_SHADER_TESS_EVAL; + } + unreachable("not reached"); +} + +static inline GLenum +_mesa_shader_stage_to_subroutine(gl_shader_stage stage) +{ + switch (stage) { + case MESA_SHADER_VERTEX: + return GL_VERTEX_SUBROUTINE; + case MESA_SHADER_GEOMETRY: + return GL_GEOMETRY_SUBROUTINE; + case MESA_SHADER_FRAGMENT: + return GL_FRAGMENT_SUBROUTINE; + case MESA_SHADER_COMPUTE: + return GL_COMPUTE_SUBROUTINE; + case MESA_SHADER_TESS_CTRL: + return GL_TESS_CONTROL_SUBROUTINE; + case MESA_SHADER_TESS_EVAL: + return GL_TESS_EVALUATION_SUBROUTINE; + case MESA_SHADER_NONE: + break; + } + unreachable("not reached"); +} + +static inline GLenum +_mesa_shader_stage_to_subroutine_uniform(gl_shader_stage stage) +{ + switch (stage) { + case MESA_SHADER_VERTEX: + return GL_VERTEX_SUBROUTINE_UNIFORM; + case MESA_SHADER_GEOMETRY: + return GL_GEOMETRY_SUBROUTINE_UNIFORM; + case MESA_SHADER_FRAGMENT: + return GL_FRAGMENT_SUBROUTINE_UNIFORM; + case MESA_SHADER_COMPUTE: + return GL_COMPUTE_SUBROUTINE_UNIFORM; + case MESA_SHADER_TESS_CTRL: + return GL_TESS_CONTROL_SUBROUTINE_UNIFORM; + case MESA_SHADER_TESS_EVAL: + return GL_TESS_EVALUATION_SUBROUTINE_UNIFORM; + case MESA_SHADER_NONE: + break; } + unreachable("not reached"); } +extern bool +_mesa_validate_pipeline_io(struct gl_pipeline_object *); #ifdef __cplusplus }