shaderapi.c revision b9abf16e
1/* 2 * Mesa 3-D graphics library 3 * 4 * Copyright (C) 2004-2008 Brian Paul All Rights Reserved. 5 * Copyright (C) 2009-2010 VMware, Inc. All Rights Reserved. 6 * 7 * Permission is hereby granted, free of charge, to any person obtaining a 8 * copy of this software and associated documentation files (the "Software"), 9 * to deal in the Software without restriction, including without limitation 10 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11 * and/or sell copies of the Software, and to permit persons to whom the 12 * Software is furnished to do so, subject to the following conditions: 13 * 14 * The above copyright notice and this permission notice shall be included 15 * in all copies or substantial portions of the Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR 21 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 22 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 23 * OTHER DEALINGS IN THE SOFTWARE. 24 */ 25 26/** 27 * \file shaderapi.c 28 * \author Brian Paul 29 * 30 * Implementation of GLSL-related API functions. 31 * The glUniform* functions are in uniforms.c 32 * 33 * 34 * XXX things to do: 35 * 1. Check that the right error code is generated for all _mesa_error() calls. 36 * 2. Insert FLUSH_VERTICES calls in various places 37 */ 38 39 40#include <stdbool.h> 41#include <c99_alloca.h> 42#include "main/glheader.h" 43#include "main/context.h" 44#include "main/enums.h" 45#include "main/glspirv.h" 46#include "main/hash.h" 47#include "main/mtypes.h" 48#include "main/pipelineobj.h" 49#include "main/program_binary.h" 50#include "main/shaderapi.h" 51#include "main/shaderobj.h" 52#include "main/state.h" 53#include "main/transformfeedback.h" 54#include "main/uniforms.h" 55#include "compiler/glsl/glsl_parser_extras.h" 56#include "compiler/glsl/ir.h" 57#include "compiler/glsl/ir_uniform.h" 58#include "compiler/glsl/program.h" 59#include "program/program.h" 60#include "program/prog_print.h" 61#include "program/prog_parameter.h" 62#include "util/ralloc.h" 63#include "util/hash_table.h" 64#include "util/mesa-sha1.h" 65#include "util/crc32.h" 66 67/** 68 * Return mask of GLSL_x flags by examining the MESA_GLSL env var. 69 */ 70GLbitfield 71_mesa_get_shader_flags(void) 72{ 73 GLbitfield flags = 0x0; 74 const char *env = getenv("MESA_GLSL"); 75 76 if (env) { 77 if (strstr(env, "dump_on_error")) 78 flags |= GLSL_DUMP_ON_ERROR; 79 else if (strstr(env, "dump")) 80 flags |= GLSL_DUMP; 81 if (strstr(env, "log")) 82 flags |= GLSL_LOG; 83 if (strstr(env, "cache_fb")) 84 flags |= GLSL_CACHE_FALLBACK; 85 if (strstr(env, "cache_info")) 86 flags |= GLSL_CACHE_INFO; 87 if (strstr(env, "nopvert")) 88 flags |= GLSL_NOP_VERT; 89 if (strstr(env, "nopfrag")) 90 flags |= GLSL_NOP_FRAG; 91 if (strstr(env, "uniform")) 92 flags |= GLSL_UNIFORMS; 93 if (strstr(env, "useprog")) 94 flags |= GLSL_USE_PROG; 95 if (strstr(env, "errors")) 96 flags |= GLSL_REPORT_ERRORS; 97 } 98 99 return flags; 100} 101 102/** 103 * Memoized version of getenv("MESA_SHADER_CAPTURE_PATH"). 104 */ 105const char * 106_mesa_get_shader_capture_path(void) 107{ 108 static bool read_env_var = false; 109 static const char *path = NULL; 110 111 if (!read_env_var) { 112 path = getenv("MESA_SHADER_CAPTURE_PATH"); 113 read_env_var = true; 114 } 115 116 return path; 117} 118 119/** 120 * Initialize context's shader state. 121 */ 122void 123_mesa_init_shader_state(struct gl_context *ctx) 124{ 125 /* Device drivers may override these to control what kind of instructions 126 * are generated by the GLSL compiler. 127 */ 128 struct gl_shader_compiler_options options; 129 gl_shader_stage sh; 130 int i; 131 132 memset(&options, 0, sizeof(options)); 133 options.MaxUnrollIterations = 32; 134 options.MaxIfDepth = UINT_MAX; 135 136 for (sh = 0; sh < MESA_SHADER_STAGES; ++sh) 137 memcpy(&ctx->Const.ShaderCompilerOptions[sh], &options, sizeof(options)); 138 139 ctx->Shader.Flags = _mesa_get_shader_flags(); 140 141 if (ctx->Shader.Flags != 0) 142 ctx->Const.GenerateTemporaryNames = true; 143 144 /* Extended for ARB_separate_shader_objects */ 145 ctx->Shader.RefCount = 1; 146 ctx->TessCtrlProgram.patch_vertices = 3; 147 for (i = 0; i < 4; ++i) 148 ctx->TessCtrlProgram.patch_default_outer_level[i] = 1.0; 149 for (i = 0; i < 2; ++i) 150 ctx->TessCtrlProgram.patch_default_inner_level[i] = 1.0; 151} 152 153 154/** 155 * Free the per-context shader-related state. 156 */ 157void 158_mesa_free_shader_state(struct gl_context *ctx) 159{ 160 for (int i = 0; i < MESA_SHADER_STAGES; i++) { 161 _mesa_reference_program(ctx, &ctx->Shader.CurrentProgram[i], NULL); 162 _mesa_reference_shader_program(ctx, 163 &ctx->Shader.ReferencedPrograms[i], 164 NULL); 165 free(ctx->SubroutineIndex[i].IndexPtr); 166 ctx->SubroutineIndex[i].IndexPtr = NULL; 167 } 168 _mesa_reference_shader_program(ctx, &ctx->Shader.ActiveProgram, NULL); 169 170 /* Extended for ARB_separate_shader_objects */ 171 _mesa_reference_pipeline_object(ctx, &ctx->_Shader, NULL); 172 173 assert(ctx->Shader.RefCount == 1); 174} 175 176 177/** 178 * Copy string from <src> to <dst>, up to maxLength characters, returning 179 * length of <dst> in <length>. 180 * \param src the strings source 181 * \param maxLength max chars to copy 182 * \param length returns number of chars copied 183 * \param dst the string destination 184 */ 185void 186_mesa_copy_string(GLchar *dst, GLsizei maxLength, 187 GLsizei *length, const GLchar *src) 188{ 189 GLsizei len; 190 for (len = 0; len < maxLength - 1 && src && src[len]; len++) 191 dst[len] = src[len]; 192 if (maxLength > 0) 193 dst[len] = 0; 194 if (length) 195 *length = len; 196} 197 198 199 200/** 201 * Confirm that the a shader type is valid and supported by the implementation 202 * 203 * \param ctx Current GL context 204 * \param type Shader target 205 * 206 */ 207bool 208_mesa_validate_shader_target(const struct gl_context *ctx, GLenum type) 209{ 210 /* Note: when building built-in GLSL functions, this function may be 211 * invoked with ctx == NULL. In that case, we can only validate that it's 212 * a shader target we recognize, not that it's supported in the current 213 * context. But that's fine--we don't need any further validation than 214 * that when building built-in GLSL functions. 215 */ 216 217 switch (type) { 218 case GL_FRAGMENT_SHADER: 219 return ctx == NULL || ctx->Extensions.ARB_fragment_shader; 220 case GL_VERTEX_SHADER: 221 return ctx == NULL || ctx->Extensions.ARB_vertex_shader; 222 case GL_GEOMETRY_SHADER_ARB: 223 return ctx == NULL || _mesa_has_geometry_shaders(ctx); 224 case GL_TESS_CONTROL_SHADER: 225 case GL_TESS_EVALUATION_SHADER: 226 return ctx == NULL || _mesa_has_tessellation(ctx); 227 case GL_COMPUTE_SHADER: 228 return ctx == NULL || _mesa_has_compute_shaders(ctx); 229 default: 230 return false; 231 } 232} 233 234 235static GLboolean 236is_program(struct gl_context *ctx, GLuint name) 237{ 238 struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, name); 239 return shProg ? GL_TRUE : GL_FALSE; 240} 241 242 243static GLboolean 244is_shader(struct gl_context *ctx, GLuint name) 245{ 246 struct gl_shader *shader = _mesa_lookup_shader(ctx, name); 247 return shader ? GL_TRUE : GL_FALSE; 248} 249 250 251/** 252 * Attach shader to a shader program. 253 */ 254static void 255attach_shader(struct gl_context *ctx, struct gl_shader_program *shProg, 256 struct gl_shader *sh) 257{ 258 GLuint n = shProg->NumShaders; 259 260 shProg->Shaders = realloc(shProg->Shaders, 261 (n + 1) * sizeof(struct gl_shader *)); 262 if (!shProg->Shaders) { 263 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glAttachShader"); 264 return; 265 } 266 267 /* append */ 268 shProg->Shaders[n] = NULL; /* since realloc() didn't zero the new space */ 269 _mesa_reference_shader(ctx, &shProg->Shaders[n], sh); 270 shProg->NumShaders++; 271} 272 273static void 274attach_shader_err(struct gl_context *ctx, GLuint program, GLuint shader, 275 const char *caller) 276{ 277 struct gl_shader_program *shProg; 278 struct gl_shader *sh; 279 GLuint i, n; 280 281 const bool same_type_disallowed = _mesa_is_gles(ctx); 282 283 shProg = _mesa_lookup_shader_program_err(ctx, program, caller); 284 if (!shProg) 285 return; 286 287 sh = _mesa_lookup_shader_err(ctx, shader, caller); 288 if (!sh) { 289 return; 290 } 291 292 n = shProg->NumShaders; 293 for (i = 0; i < n; i++) { 294 if (shProg->Shaders[i] == sh) { 295 /* The shader is already attched to this program. The 296 * GL_ARB_shader_objects spec says: 297 * 298 * "The error INVALID_OPERATION is generated by AttachObjectARB 299 * if <obj> is already attached to <containerObj>." 300 */ 301 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", caller); 302 return; 303 } else if (same_type_disallowed && 304 shProg->Shaders[i]->Stage == sh->Stage) { 305 /* Shader with the same type is already attached to this program, 306 * OpenGL ES 2.0 and 3.0 specs say: 307 * 308 * "Multiple shader objects of the same type may not be attached 309 * to a single program object. [...] The error INVALID_OPERATION 310 * is generated if [...] another shader object of the same type 311 * as shader is already attached to program." 312 */ 313 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", caller); 314 return; 315 } 316 } 317 318 attach_shader(ctx, shProg, sh); 319} 320 321static void 322attach_shader_no_error(struct gl_context *ctx, GLuint program, GLuint shader) 323{ 324 struct gl_shader_program *shProg; 325 struct gl_shader *sh; 326 327 shProg = _mesa_lookup_shader_program(ctx, program); 328 sh = _mesa_lookup_shader(ctx, shader); 329 330 attach_shader(ctx, shProg, sh); 331} 332 333static GLuint 334create_shader(struct gl_context *ctx, GLenum type) 335{ 336 struct gl_shader *sh; 337 GLuint name; 338 339 _mesa_HashLockMutex(ctx->Shared->ShaderObjects); 340 name = _mesa_HashFindFreeKeyBlock(ctx->Shared->ShaderObjects, 1); 341 sh = _mesa_new_shader(name, _mesa_shader_enum_to_shader_stage(type)); 342 sh->Type = type; 343 _mesa_HashInsertLocked(ctx->Shared->ShaderObjects, name, sh); 344 _mesa_HashUnlockMutex(ctx->Shared->ShaderObjects); 345 346 return name; 347} 348 349 350static GLuint 351create_shader_err(struct gl_context *ctx, GLenum type, const char *caller) 352{ 353 if (!_mesa_validate_shader_target(ctx, type)) { 354 _mesa_error(ctx, GL_INVALID_ENUM, "%s(%s)", 355 caller, _mesa_enum_to_string(type)); 356 return 0; 357 } 358 359 return create_shader(ctx, type); 360} 361 362 363static GLuint 364create_shader_program(struct gl_context *ctx) 365{ 366 GLuint name; 367 struct gl_shader_program *shProg; 368 369 _mesa_HashLockMutex(ctx->Shared->ShaderObjects); 370 371 name = _mesa_HashFindFreeKeyBlock(ctx->Shared->ShaderObjects, 1); 372 373 shProg = _mesa_new_shader_program(name); 374 375 _mesa_HashInsertLocked(ctx->Shared->ShaderObjects, name, shProg); 376 377 assert(shProg->RefCount == 1); 378 379 _mesa_HashUnlockMutex(ctx->Shared->ShaderObjects); 380 381 return name; 382} 383 384 385/** 386 * Delete a shader program. Actually, just decrement the program's 387 * reference count and mark it as DeletePending. 388 * Used to implement glDeleteProgram() and glDeleteObjectARB(). 389 */ 390static void 391delete_shader_program(struct gl_context *ctx, GLuint name) 392{ 393 /* 394 * NOTE: deleting shaders/programs works a bit differently than 395 * texture objects (and buffer objects, etc). Shader/program 396 * handles/IDs exist in the hash table until the object is really 397 * deleted (refcount==0). With texture objects, the handle/ID is 398 * removed from the hash table in glDeleteTextures() while the tex 399 * object itself might linger until its refcount goes to zero. 400 */ 401 struct gl_shader_program *shProg; 402 403 shProg = _mesa_lookup_shader_program_err(ctx, name, "glDeleteProgram"); 404 if (!shProg) 405 return; 406 407 if (!shProg->DeletePending) { 408 shProg->DeletePending = GL_TRUE; 409 410 /* effectively, decr shProg's refcount */ 411 _mesa_reference_shader_program(ctx, &shProg, NULL); 412 } 413} 414 415 416static void 417delete_shader(struct gl_context *ctx, GLuint shader) 418{ 419 struct gl_shader *sh; 420 421 sh = _mesa_lookup_shader_err(ctx, shader, "glDeleteShader"); 422 if (!sh) 423 return; 424 425 if (!sh->DeletePending) { 426 sh->DeletePending = GL_TRUE; 427 428 /* effectively, decr sh's refcount */ 429 _mesa_reference_shader(ctx, &sh, NULL); 430 } 431} 432 433 434static ALWAYS_INLINE void 435detach_shader(struct gl_context *ctx, GLuint program, GLuint shader, 436 bool no_error) 437{ 438 struct gl_shader_program *shProg; 439 GLuint n; 440 GLuint i, j; 441 442 if (!no_error) { 443 shProg = _mesa_lookup_shader_program_err(ctx, program, "glDetachShader"); 444 if (!shProg) 445 return; 446 } else { 447 shProg = _mesa_lookup_shader_program(ctx, program); 448 } 449 450 n = shProg->NumShaders; 451 452 for (i = 0; i < n; i++) { 453 if (shProg->Shaders[i]->Name == shader) { 454 /* found it */ 455 struct gl_shader **newList; 456 457 /* release */ 458 _mesa_reference_shader(ctx, &shProg->Shaders[i], NULL); 459 460 /* alloc new, smaller array */ 461 newList = malloc((n - 1) * sizeof(struct gl_shader *)); 462 if (!newList) { 463 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glDetachShader"); 464 return; 465 } 466 /* Copy old list entries to new list, skipping removed entry at [i] */ 467 for (j = 0; j < i; j++) { 468 newList[j] = shProg->Shaders[j]; 469 } 470 while (++i < n) { 471 newList[j++] = shProg->Shaders[i]; 472 } 473 474 /* Free old list and install new one */ 475 free(shProg->Shaders); 476 shProg->Shaders = newList; 477 shProg->NumShaders = n - 1; 478 479#ifdef DEBUG 480 /* sanity check - make sure the new list's entries are sensible */ 481 for (j = 0; j < shProg->NumShaders; j++) { 482 assert(shProg->Shaders[j]->Stage == MESA_SHADER_VERTEX || 483 shProg->Shaders[j]->Stage == MESA_SHADER_TESS_CTRL || 484 shProg->Shaders[j]->Stage == MESA_SHADER_TESS_EVAL || 485 shProg->Shaders[j]->Stage == MESA_SHADER_GEOMETRY || 486 shProg->Shaders[j]->Stage == MESA_SHADER_FRAGMENT); 487 assert(shProg->Shaders[j]->RefCount > 0); 488 } 489#endif 490 491 return; 492 } 493 } 494 495 /* not found */ 496 if (!no_error) { 497 GLenum err; 498 if (is_shader(ctx, shader) || is_program(ctx, shader)) 499 err = GL_INVALID_OPERATION; 500 else 501 err = GL_INVALID_VALUE; 502 _mesa_error(ctx, err, "glDetachShader(shader)"); 503 return; 504 } 505} 506 507 508static void 509detach_shader_error(struct gl_context *ctx, GLuint program, GLuint shader) 510{ 511 detach_shader(ctx, program, shader, false); 512} 513 514 515static void 516detach_shader_no_error(struct gl_context *ctx, GLuint program, GLuint shader) 517{ 518 detach_shader(ctx, program, shader, true); 519} 520 521 522/** 523 * Return list of shaders attached to shader program. 524 * \param objOut returns GLuint ids 525 * \param handleOut returns GLhandleARB handles 526 */ 527static void 528get_attached_shaders(struct gl_context *ctx, GLuint program, GLsizei maxCount, 529 GLsizei *countOut, GLuint *objOut, GLhandleARB *handleOut) 530{ 531 struct gl_shader_program *shProg; 532 533 if (maxCount < 0) { 534 _mesa_error(ctx, GL_INVALID_VALUE, "glGetAttachedShaders(maxCount < 0)"); 535 return; 536 } 537 538 shProg = 539 _mesa_lookup_shader_program_err(ctx, program, "glGetAttachedShaders"); 540 541 if (shProg) { 542 GLuint i; 543 for (i = 0; i < (GLuint) maxCount && i < shProg->NumShaders; i++) { 544 if (objOut) { 545 objOut[i] = shProg->Shaders[i]->Name; 546 } 547 548 if (handleOut) { 549 handleOut[i] = (GLhandleARB) shProg->Shaders[i]->Name; 550 } 551 } 552 if (countOut) { 553 *countOut = i; 554 } 555 } 556} 557 558/** 559 * glGetHandleARB() - return ID/name of currently bound shader program. 560 */ 561static GLuint 562get_handle(struct gl_context *ctx, GLenum pname) 563{ 564 if (pname == GL_PROGRAM_OBJECT_ARB) { 565 if (ctx->_Shader->ActiveProgram) 566 return ctx->_Shader->ActiveProgram->Name; 567 else 568 return 0; 569 } 570 else { 571 _mesa_error(ctx, GL_INVALID_ENUM, "glGetHandleARB"); 572 return 0; 573 } 574} 575 576 577/** 578 * Check if a geometry shader query is valid at this time. If not, report an 579 * error and return false. 580 * 581 * From GL 3.2 section 6.1.16 (Shader and Program Queries): 582 * 583 * "If GEOMETRY_VERTICES_OUT, GEOMETRY_INPUT_TYPE, or GEOMETRY_OUTPUT_TYPE 584 * are queried for a program which has not been linked successfully, or 585 * which does not contain objects to form a geometry shader, then an 586 * INVALID_OPERATION error is generated." 587 */ 588static bool 589check_gs_query(struct gl_context *ctx, const struct gl_shader_program *shProg) 590{ 591 if (shProg->data->LinkStatus && 592 shProg->_LinkedShaders[MESA_SHADER_GEOMETRY] != NULL) { 593 return true; 594 } 595 596 _mesa_error(ctx, GL_INVALID_OPERATION, 597 "glGetProgramv(linked geometry shader required)"); 598 return false; 599} 600 601 602/** 603 * Check if a tessellation control shader query is valid at this time. 604 * If not, report an error and return false. 605 * 606 * From GL 4.0 section 6.1.12 (Shader and Program Queries): 607 * 608 * "If TESS_CONTROL_OUTPUT_VERTICES is queried for a program which has 609 * not been linked successfully, or which does not contain objects to 610 * form a tessellation control shader, then an INVALID_OPERATION error is 611 * generated." 612 */ 613static bool 614check_tcs_query(struct gl_context *ctx, const struct gl_shader_program *shProg) 615{ 616 if (shProg->data->LinkStatus && 617 shProg->_LinkedShaders[MESA_SHADER_TESS_CTRL] != NULL) { 618 return true; 619 } 620 621 _mesa_error(ctx, GL_INVALID_OPERATION, 622 "glGetProgramv(linked tessellation control shader required)"); 623 return false; 624} 625 626 627/** 628 * Check if a tessellation evaluation shader query is valid at this time. 629 * If not, report an error and return false. 630 * 631 * From GL 4.0 section 6.1.12 (Shader and Program Queries): 632 * 633 * "If any of the pname values in this paragraph are queried for a program 634 * which has not been linked successfully, or which does not contain 635 * objects to form a tessellation evaluation shader, then an 636 * INVALID_OPERATION error is generated." 637 * 638 */ 639static bool 640check_tes_query(struct gl_context *ctx, const struct gl_shader_program *shProg) 641{ 642 if (shProg->data->LinkStatus && 643 shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL] != NULL) { 644 return true; 645 } 646 647 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramv(linked tessellation " 648 "evaluation shader required)"); 649 return false; 650} 651 652 653/** 654 * glGetProgramiv() - get shader program state. 655 * Note that this is for GLSL shader programs, not ARB vertex/fragment 656 * programs (see glGetProgramivARB). 657 */ 658static void 659get_programiv(struct gl_context *ctx, GLuint program, GLenum pname, 660 GLint *params) 661{ 662 struct gl_shader_program *shProg 663 = _mesa_lookup_shader_program_err(ctx, program, "glGetProgramiv(program)"); 664 665 /* Is transform feedback available in this context? 666 */ 667 const bool has_xfb = 668 (ctx->API == API_OPENGL_COMPAT && ctx->Extensions.EXT_transform_feedback) 669 || ctx->API == API_OPENGL_CORE 670 || _mesa_is_gles3(ctx); 671 672 /* True if geometry shaders (of the form that was adopted into GLSL 1.50 673 * and GL 3.2) are available in this context 674 */ 675 const bool has_gs = _mesa_has_geometry_shaders(ctx); 676 const bool has_tess = _mesa_has_tessellation(ctx); 677 678 /* Are uniform buffer objects available in this context? 679 */ 680 const bool has_ubo = 681 (ctx->API == API_OPENGL_COMPAT && 682 ctx->Extensions.ARB_uniform_buffer_object) 683 || ctx->API == API_OPENGL_CORE 684 || _mesa_is_gles3(ctx); 685 686 if (!shProg) { 687 return; 688 } 689 690 switch (pname) { 691 case GL_DELETE_STATUS: 692 *params = shProg->DeletePending; 693 return; 694 case GL_COMPLETION_STATUS_ARB: 695 if (ctx->Driver.GetShaderProgramCompletionStatus) 696 *params = ctx->Driver.GetShaderProgramCompletionStatus(ctx, shProg); 697 else 698 *params = GL_TRUE; 699 return; 700 case GL_LINK_STATUS: 701 *params = shProg->data->LinkStatus ? GL_TRUE : GL_FALSE; 702 return; 703 case GL_VALIDATE_STATUS: 704 *params = shProg->data->Validated; 705 return; 706 case GL_INFO_LOG_LENGTH: 707 *params = (shProg->data->InfoLog && shProg->data->InfoLog[0] != '\0') ? 708 strlen(shProg->data->InfoLog) + 1 : 0; 709 return; 710 case GL_ATTACHED_SHADERS: 711 *params = shProg->NumShaders; 712 return; 713 case GL_ACTIVE_ATTRIBUTES: 714 *params = _mesa_count_active_attribs(shProg); 715 return; 716 case GL_ACTIVE_ATTRIBUTE_MAX_LENGTH: 717 *params = _mesa_longest_attribute_name_length(shProg); 718 return; 719 case GL_ACTIVE_UNIFORMS: { 720 unsigned i; 721 const unsigned num_uniforms = 722 shProg->data->NumUniformStorage - shProg->data->NumHiddenUniforms; 723 for (*params = 0, i = 0; i < num_uniforms; i++) { 724 if (!shProg->data->UniformStorage[i].is_shader_storage) 725 (*params)++; 726 } 727 return; 728 } 729 case GL_ACTIVE_UNIFORM_MAX_LENGTH: { 730 unsigned i; 731 GLint max_len = 0; 732 const unsigned num_uniforms = 733 shProg->data->NumUniformStorage - shProg->data->NumHiddenUniforms; 734 735 for (i = 0; i < num_uniforms; i++) { 736 if (shProg->data->UniformStorage[i].is_shader_storage) 737 continue; 738 739 /* Add one for the terminating NUL character for a non-array, and 740 * 4 for the "[0]" and the NUL for an array. 741 */ 742 const GLint len = strlen(shProg->data->UniformStorage[i].name) + 1 + 743 ((shProg->data->UniformStorage[i].array_elements != 0) ? 3 : 0); 744 745 if (len > max_len) 746 max_len = len; 747 } 748 749 *params = max_len; 750 return; 751 } 752 case GL_TRANSFORM_FEEDBACK_VARYINGS: 753 if (!has_xfb) 754 break; 755 *params = shProg->TransformFeedback.NumVarying; 756 return; 757 case GL_TRANSFORM_FEEDBACK_VARYING_MAX_LENGTH: { 758 unsigned i; 759 GLint max_len = 0; 760 if (!has_xfb) 761 break; 762 763 for (i = 0; i < shProg->TransformFeedback.NumVarying; i++) { 764 /* Add one for the terminating NUL character. 765 */ 766 const GLint len = 767 strlen(shProg->TransformFeedback.VaryingNames[i]) + 1; 768 769 if (len > max_len) 770 max_len = len; 771 } 772 773 *params = max_len; 774 return; 775 } 776 case GL_TRANSFORM_FEEDBACK_BUFFER_MODE: 777 if (!has_xfb) 778 break; 779 *params = shProg->TransformFeedback.BufferMode; 780 return; 781 case GL_GEOMETRY_VERTICES_OUT: 782 if (!has_gs) 783 break; 784 if (check_gs_query(ctx, shProg)) { 785 *params = shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]-> 786 Program->info.gs.vertices_out; 787 } 788 return; 789 case GL_GEOMETRY_SHADER_INVOCATIONS: 790 if (!has_gs || !ctx->Extensions.ARB_gpu_shader5) 791 break; 792 if (check_gs_query(ctx, shProg)) { 793 *params = shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]-> 794 Program->info.gs.invocations; 795 } 796 return; 797 case GL_GEOMETRY_INPUT_TYPE: 798 if (!has_gs) 799 break; 800 if (check_gs_query(ctx, shProg)) { 801 *params = shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]-> 802 Program->info.gs.input_primitive; 803 } 804 return; 805 case GL_GEOMETRY_OUTPUT_TYPE: 806 if (!has_gs) 807 break; 808 if (check_gs_query(ctx, shProg)) { 809 *params = shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]-> 810 Program->info.gs.output_primitive; 811 } 812 return; 813 case GL_ACTIVE_UNIFORM_BLOCK_MAX_NAME_LENGTH: { 814 unsigned i; 815 GLint max_len = 0; 816 817 if (!has_ubo) 818 break; 819 820 for (i = 0; i < shProg->data->NumUniformBlocks; i++) { 821 /* Add one for the terminating NUL character. 822 */ 823 const GLint len = strlen(shProg->data->UniformBlocks[i].Name) + 1; 824 825 if (len > max_len) 826 max_len = len; 827 } 828 829 *params = max_len; 830 return; 831 } 832 case GL_ACTIVE_UNIFORM_BLOCKS: 833 if (!has_ubo) 834 break; 835 836 *params = shProg->data->NumUniformBlocks; 837 return; 838 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT: 839 /* This enum isn't part of the OES extension for OpenGL ES 2.0. It is 840 * only available with desktop OpenGL 3.0+ with the 841 * GL_ARB_get_program_binary extension or OpenGL ES 3.0. 842 * 843 * On desktop, we ignore the 3.0+ requirement because it is silly. 844 */ 845 if (!_mesa_is_desktop_gl(ctx) && !_mesa_is_gles3(ctx)) 846 break; 847 848 *params = shProg->BinaryRetreivableHint; 849 return; 850 case GL_PROGRAM_BINARY_LENGTH: 851 if (ctx->Const.NumProgramBinaryFormats == 0 || !shProg->data->LinkStatus) { 852 *params = 0; 853 } else { 854 _mesa_get_program_binary_length(ctx, shProg, params); 855 } 856 return; 857 case GL_ACTIVE_ATOMIC_COUNTER_BUFFERS: 858 if (!ctx->Extensions.ARB_shader_atomic_counters) 859 break; 860 861 *params = shProg->data->NumAtomicBuffers; 862 return; 863 case GL_COMPUTE_WORK_GROUP_SIZE: { 864 int i; 865 if (!_mesa_has_compute_shaders(ctx)) 866 break; 867 if (!shProg->data->LinkStatus) { 868 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramiv(program not " 869 "linked)"); 870 return; 871 } 872 if (shProg->_LinkedShaders[MESA_SHADER_COMPUTE] == NULL) { 873 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramiv(no compute " 874 "shaders)"); 875 return; 876 } 877 for (i = 0; i < 3; i++) 878 params[i] = shProg->_LinkedShaders[MESA_SHADER_COMPUTE]-> 879 Program->info.cs.local_size[i]; 880 return; 881 } 882 case GL_PROGRAM_SEPARABLE: 883 /* If the program has not been linked, return initial value 0. */ 884 *params = (shProg->data->LinkStatus == LINKING_FAILURE) ? 0 : shProg->SeparateShader; 885 return; 886 887 /* ARB_tessellation_shader */ 888 case GL_TESS_CONTROL_OUTPUT_VERTICES: 889 if (!has_tess) 890 break; 891 if (check_tcs_query(ctx, shProg)) { 892 *params = shProg->_LinkedShaders[MESA_SHADER_TESS_CTRL]-> 893 Program->info.tess.tcs_vertices_out; 894 } 895 return; 896 case GL_TESS_GEN_MODE: 897 if (!has_tess) 898 break; 899 if (check_tes_query(ctx, shProg)) { 900 *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]-> 901 Program->info.tess.primitive_mode; 902 } 903 return; 904 case GL_TESS_GEN_SPACING: 905 if (!has_tess) 906 break; 907 if (check_tes_query(ctx, shProg)) { 908 const struct gl_linked_shader *tes = 909 shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]; 910 switch (tes->Program->info.tess.spacing) { 911 case TESS_SPACING_EQUAL: 912 *params = GL_EQUAL; 913 break; 914 case TESS_SPACING_FRACTIONAL_ODD: 915 *params = GL_FRACTIONAL_ODD; 916 break; 917 case TESS_SPACING_FRACTIONAL_EVEN: 918 *params = GL_FRACTIONAL_EVEN; 919 break; 920 case TESS_SPACING_UNSPECIFIED: 921 *params = 0; 922 break; 923 } 924 } 925 return; 926 case GL_TESS_GEN_VERTEX_ORDER: 927 if (!has_tess) 928 break; 929 if (check_tes_query(ctx, shProg)) { 930 *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]-> 931 Program->info.tess.ccw ? GL_CCW : GL_CW; 932 } 933 return; 934 case GL_TESS_GEN_POINT_MODE: 935 if (!has_tess) 936 break; 937 if (check_tes_query(ctx, shProg)) { 938 *params = shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]-> 939 Program->info.tess.point_mode ? GL_TRUE : GL_FALSE; 940 } 941 return; 942 default: 943 break; 944 } 945 946 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramiv(pname=%s)", 947 _mesa_enum_to_string(pname)); 948} 949 950 951/** 952 * glGetShaderiv() - get GLSL shader state 953 */ 954static void 955get_shaderiv(struct gl_context *ctx, GLuint name, GLenum pname, GLint *params) 956{ 957 struct gl_shader *shader = 958 _mesa_lookup_shader_err(ctx, name, "glGetShaderiv"); 959 960 if (!shader) { 961 return; 962 } 963 964 switch (pname) { 965 case GL_SHADER_TYPE: 966 *params = shader->Type; 967 break; 968 case GL_DELETE_STATUS: 969 *params = shader->DeletePending; 970 break; 971 case GL_COMPLETION_STATUS_ARB: 972 /* _mesa_glsl_compile_shader is not offloaded to other threads. */ 973 *params = GL_TRUE; 974 return; 975 case GL_COMPILE_STATUS: 976 *params = shader->CompileStatus ? GL_TRUE : GL_FALSE; 977 break; 978 case GL_INFO_LOG_LENGTH: 979 *params = (shader->InfoLog && shader->InfoLog[0] != '\0') ? 980 strlen(shader->InfoLog) + 1 : 0; 981 break; 982 case GL_SHADER_SOURCE_LENGTH: 983 *params = shader->Source ? strlen((char *) shader->Source) + 1 : 0; 984 break; 985 case GL_SPIR_V_BINARY_ARB: 986 *params = (shader->spirv_data != NULL); 987 break; 988 default: 989 _mesa_error(ctx, GL_INVALID_ENUM, "glGetShaderiv(pname)"); 990 return; 991 } 992} 993 994 995static void 996get_program_info_log(struct gl_context *ctx, GLuint program, GLsizei bufSize, 997 GLsizei *length, GLchar *infoLog) 998{ 999 struct gl_shader_program *shProg; 1000 1001 /* Section 2.5 GL Errors (page 18) of the OpenGL ES 3.0.4 spec and 1002 * section 2.3.1 (Errors) of the OpenGL 4.5 spec say: 1003 * 1004 * "If a negative number is provided where an argument of type sizei or 1005 * sizeiptr is specified, an INVALID_VALUE error is generated." 1006 */ 1007 if (bufSize < 0) { 1008 _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramInfoLog(bufSize < 0)"); 1009 return; 1010 } 1011 1012 shProg = _mesa_lookup_shader_program_err(ctx, program, 1013 "glGetProgramInfoLog(program)"); 1014 if (!shProg) { 1015 return; 1016 } 1017 1018 _mesa_copy_string(infoLog, bufSize, length, shProg->data->InfoLog); 1019} 1020 1021 1022static void 1023get_shader_info_log(struct gl_context *ctx, GLuint shader, GLsizei bufSize, 1024 GLsizei *length, GLchar *infoLog) 1025{ 1026 struct gl_shader *sh; 1027 1028 /* Section 2.5 GL Errors (page 18) of the OpenGL ES 3.0.4 spec and 1029 * section 2.3.1 (Errors) of the OpenGL 4.5 spec say: 1030 * 1031 * "If a negative number is provided where an argument of type sizei or 1032 * sizeiptr is specified, an INVALID_VALUE error is generated." 1033 */ 1034 if (bufSize < 0) { 1035 _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderInfoLog(bufSize < 0)"); 1036 return; 1037 } 1038 1039 sh = _mesa_lookup_shader_err(ctx, shader, "glGetShaderInfoLog(shader)"); 1040 if (!sh) { 1041 return; 1042 } 1043 1044 _mesa_copy_string(infoLog, bufSize, length, sh->InfoLog); 1045} 1046 1047 1048/** 1049 * Return shader source code. 1050 */ 1051static void 1052get_shader_source(struct gl_context *ctx, GLuint shader, GLsizei maxLength, 1053 GLsizei *length, GLchar *sourceOut) 1054{ 1055 struct gl_shader *sh; 1056 1057 if (maxLength < 0) { 1058 _mesa_error(ctx, GL_INVALID_VALUE, "glGetShaderSource(bufSize < 0)"); 1059 return; 1060 } 1061 1062 sh = _mesa_lookup_shader_err(ctx, shader, "glGetShaderSource"); 1063 if (!sh) { 1064 return; 1065 } 1066 _mesa_copy_string(sourceOut, maxLength, length, sh->Source); 1067} 1068 1069 1070/** 1071 * Set/replace shader source code. A helper function used by 1072 * glShaderSource[ARB]. 1073 */ 1074static void 1075set_shader_source(struct gl_shader *sh, const GLchar *source) 1076{ 1077 assert(sh); 1078 1079 /* The GL_ARB_gl_spirv spec adds the following to the end of the description 1080 * of ShaderSource: 1081 * 1082 * "If <shader> was previously associated with a SPIR-V module (via the 1083 * ShaderBinary command), that association is broken. Upon successful 1084 * completion of this command the SPIR_V_BINARY_ARB state of <shader> 1085 * is set to FALSE." 1086 */ 1087 _mesa_shader_spirv_data_reference(&sh->spirv_data, NULL); 1088 1089 if (sh->CompileStatus == COMPILE_SKIPPED && !sh->FallbackSource) { 1090 /* If shader was previously compiled back-up the source in case of cache 1091 * fallback. 1092 */ 1093 sh->FallbackSource = sh->Source; 1094 sh->Source = source; 1095 } else { 1096 /* free old shader source string and install new one */ 1097 free((void *)sh->Source); 1098 sh->Source = source; 1099 } 1100 1101#ifdef DEBUG 1102 sh->SourceChecksum = util_hash_crc32(sh->Source, strlen(sh->Source)); 1103#endif 1104} 1105 1106 1107/** 1108 * Compile a shader. 1109 */ 1110void 1111_mesa_compile_shader(struct gl_context *ctx, struct gl_shader *sh) 1112{ 1113 if (!sh) 1114 return; 1115 1116 /* The GL_ARB_gl_spirv spec says: 1117 * 1118 * "Add a new error for the CompileShader command: 1119 * 1120 * An INVALID_OPERATION error is generated if the SPIR_V_BINARY_ARB 1121 * state of <shader> is TRUE." 1122 */ 1123 if (sh->spirv_data) { 1124 _mesa_error(ctx, GL_INVALID_OPERATION, "glCompileShader(SPIR-V)"); 1125 return; 1126 } 1127 1128 if (!sh->Source) { 1129 /* If the user called glCompileShader without first calling 1130 * glShaderSource, we should fail to compile, but not raise a GL_ERROR. 1131 */ 1132 sh->CompileStatus = COMPILE_FAILURE; 1133 } else { 1134 if (ctx->_Shader->Flags & GLSL_DUMP) { 1135 _mesa_log("GLSL source for %s shader %d:\n", 1136 _mesa_shader_stage_to_string(sh->Stage), sh->Name); 1137 _mesa_log("%s\n", sh->Source); 1138 } 1139 1140 /* this call will set the shader->CompileStatus field to indicate if 1141 * compilation was successful. 1142 */ 1143 _mesa_glsl_compile_shader(ctx, sh, false, false, false); 1144 1145 if (ctx->_Shader->Flags & GLSL_LOG) { 1146 _mesa_write_shader_to_file(sh); 1147 } 1148 1149 if (ctx->_Shader->Flags & GLSL_DUMP) { 1150 if (sh->CompileStatus) { 1151 if (sh->ir) { 1152 _mesa_log("GLSL IR for shader %d:\n", sh->Name); 1153 _mesa_print_ir(_mesa_get_log_file(), sh->ir, NULL); 1154 } else { 1155 _mesa_log("No GLSL IR for shader %d (shader may be from " 1156 "cache)\n", sh->Name); 1157 } 1158 _mesa_log("\n\n"); 1159 } else { 1160 _mesa_log("GLSL shader %d failed to compile.\n", sh->Name); 1161 } 1162 if (sh->InfoLog && sh->InfoLog[0] != 0) { 1163 _mesa_log("GLSL shader %d info log:\n", sh->Name); 1164 _mesa_log("%s\n", sh->InfoLog); 1165 } 1166 } 1167 } 1168 1169 if (!sh->CompileStatus) { 1170 if (ctx->_Shader->Flags & GLSL_DUMP_ON_ERROR) { 1171 _mesa_log("GLSL source for %s shader %d:\n", 1172 _mesa_shader_stage_to_string(sh->Stage), sh->Name); 1173 _mesa_log("%s\n", sh->Source); 1174 _mesa_log("Info Log:\n%s\n", sh->InfoLog); 1175 } 1176 1177 if (ctx->_Shader->Flags & GLSL_REPORT_ERRORS) { 1178 _mesa_debug(ctx, "Error compiling shader %u:\n%s\n", 1179 sh->Name, sh->InfoLog); 1180 } 1181 } 1182} 1183 1184 1185/** 1186 * Link a program's shaders. 1187 */ 1188static ALWAYS_INLINE void 1189link_program(struct gl_context *ctx, struct gl_shader_program *shProg, 1190 bool no_error) 1191{ 1192 if (!shProg) 1193 return; 1194 1195 if (!no_error) { 1196 /* From the ARB_transform_feedback2 specification: 1197 * "The error INVALID_OPERATION is generated by LinkProgram if <program> 1198 * is the name of a program being used by one or more transform feedback 1199 * objects, even if the objects are not currently bound or are paused." 1200 */ 1201 if (_mesa_transform_feedback_is_using_program(ctx, shProg)) { 1202 _mesa_error(ctx, GL_INVALID_OPERATION, 1203 "glLinkProgram(transform feedback is using the program)"); 1204 return; 1205 } 1206 } 1207 1208 unsigned programs_in_use = 0; 1209 if (ctx->_Shader) 1210 for (unsigned stage = 0; stage < MESA_SHADER_STAGES; stage++) { 1211 if (ctx->_Shader->CurrentProgram[stage] && 1212 ctx->_Shader->CurrentProgram[stage]->Id == shProg->Name) { 1213 programs_in_use |= 1 << stage; 1214 } 1215 } 1216 1217 FLUSH_VERTICES(ctx, 0); 1218 _mesa_glsl_link_shader(ctx, shProg); 1219 1220 /* From section 7.3 (Program Objects) of the OpenGL 4.5 spec: 1221 * 1222 * "If LinkProgram or ProgramBinary successfully re-links a program 1223 * object that is active for any shader stage, then the newly generated 1224 * executable code will be installed as part of the current rendering 1225 * state for all shader stages where the program is active. 1226 * Additionally, the newly generated executable code is made part of 1227 * the state of any program pipeline for all stages where the program 1228 * is attached." 1229 */ 1230 if (shProg->data->LinkStatus && programs_in_use) { 1231 while (programs_in_use) { 1232 const int stage = u_bit_scan(&programs_in_use); 1233 1234 struct gl_program *prog = NULL; 1235 if (shProg->_LinkedShaders[stage]) 1236 prog = shProg->_LinkedShaders[stage]->Program; 1237 1238 _mesa_use_program(ctx, stage, shProg, prog, ctx->_Shader); 1239 } 1240 } 1241 1242 /* Capture .shader_test files. */ 1243 const char *capture_path = _mesa_get_shader_capture_path(); 1244 if (shProg->Name != 0 && shProg->Name != ~0 && capture_path != NULL) { 1245 /* Find an unused filename. */ 1246 char *filename = NULL; 1247 for (unsigned i = 0;; i++) { 1248 if (i) { 1249 filename = ralloc_asprintf(NULL, "%s/%u-%u.shader_test", 1250 capture_path, shProg->Name, i); 1251 } else { 1252 filename = ralloc_asprintf(NULL, "%s/%u.shader_test", 1253 capture_path, shProg->Name); 1254 } 1255 FILE *file = fopen(filename, "r"); 1256 if (!file) 1257 break; 1258 fclose(file); 1259 ralloc_free(filename); 1260 } 1261 1262 FILE *file = fopen(filename, "w"); 1263 if (file) { 1264 fprintf(file, "[require]\nGLSL%s >= %u.%02u\n", 1265 shProg->IsES ? " ES" : "", 1266 shProg->data->Version / 100, shProg->data->Version % 100); 1267 if (shProg->SeparateShader) 1268 fprintf(file, "GL_ARB_separate_shader_objects\nSSO ENABLED\n"); 1269 fprintf(file, "\n"); 1270 1271 for (unsigned i = 0; i < shProg->NumShaders; i++) { 1272 fprintf(file, "[%s shader]\n%s\n", 1273 _mesa_shader_stage_to_string(shProg->Shaders[i]->Stage), 1274 shProg->Shaders[i]->Source); 1275 } 1276 fclose(file); 1277 } else { 1278 _mesa_warning(ctx, "Failed to open %s", filename); 1279 } 1280 1281 ralloc_free(filename); 1282 } 1283 1284 if (shProg->data->LinkStatus == LINKING_FAILURE && 1285 (ctx->_Shader->Flags & GLSL_REPORT_ERRORS)) { 1286 _mesa_debug(ctx, "Error linking program %u:\n%s\n", 1287 shProg->Name, shProg->data->InfoLog); 1288 } 1289 1290 _mesa_update_vertex_processing_mode(ctx); 1291 1292 /* debug code */ 1293 if (0) { 1294 GLuint i; 1295 1296 printf("Link %u shaders in program %u: %s\n", 1297 shProg->NumShaders, shProg->Name, 1298 shProg->data->LinkStatus ? "Success" : "Failed"); 1299 1300 for (i = 0; i < shProg->NumShaders; i++) { 1301 printf(" shader %u, stage %u\n", 1302 shProg->Shaders[i]->Name, 1303 shProg->Shaders[i]->Stage); 1304 } 1305 } 1306} 1307 1308 1309static void 1310link_program_error(struct gl_context *ctx, struct gl_shader_program *shProg) 1311{ 1312 link_program(ctx, shProg, false); 1313} 1314 1315 1316static void 1317link_program_no_error(struct gl_context *ctx, struct gl_shader_program *shProg) 1318{ 1319 link_program(ctx, shProg, true); 1320} 1321 1322 1323void 1324_mesa_link_program(struct gl_context *ctx, struct gl_shader_program *shProg) 1325{ 1326 link_program_error(ctx, shProg); 1327} 1328 1329 1330/** 1331 * Print basic shader info (for debug). 1332 */ 1333static void 1334print_shader_info(const struct gl_shader_program *shProg) 1335{ 1336 GLuint i; 1337 1338 printf("Mesa: glUseProgram(%u)\n", shProg->Name); 1339 for (i = 0; i < shProg->NumShaders; i++) { 1340#ifdef DEBUG 1341 printf(" %s shader %u, checksum %u\n", 1342 _mesa_shader_stage_to_string(shProg->Shaders[i]->Stage), 1343 shProg->Shaders[i]->Name, 1344 shProg->Shaders[i]->SourceChecksum); 1345#else 1346 printf(" %s shader %u\n", 1347 _mesa_shader_stage_to_string(shProg->Shaders[i]->Stage), 1348 shProg->Shaders[i]->Name); 1349#endif 1350 } 1351 if (shProg->_LinkedShaders[MESA_SHADER_VERTEX]) 1352 printf(" vert prog %u\n", 1353 shProg->_LinkedShaders[MESA_SHADER_VERTEX]->Program->Id); 1354 if (shProg->_LinkedShaders[MESA_SHADER_FRAGMENT]) 1355 printf(" frag prog %u\n", 1356 shProg->_LinkedShaders[MESA_SHADER_FRAGMENT]->Program->Id); 1357 if (shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]) 1358 printf(" geom prog %u\n", 1359 shProg->_LinkedShaders[MESA_SHADER_GEOMETRY]->Program->Id); 1360 if (shProg->_LinkedShaders[MESA_SHADER_TESS_CTRL]) 1361 printf(" tesc prog %u\n", 1362 shProg->_LinkedShaders[MESA_SHADER_TESS_CTRL]->Program->Id); 1363 if (shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]) 1364 printf(" tese prog %u\n", 1365 shProg->_LinkedShaders[MESA_SHADER_TESS_EVAL]->Program->Id); 1366} 1367 1368 1369/** 1370 * Use the named shader program for subsequent glUniform calls 1371 */ 1372void 1373_mesa_active_program(struct gl_context *ctx, struct gl_shader_program *shProg, 1374 const char *caller) 1375{ 1376 if ((shProg != NULL) && !shProg->data->LinkStatus) { 1377 _mesa_error(ctx, GL_INVALID_OPERATION, 1378 "%s(program %u not linked)", caller, shProg->Name); 1379 return; 1380 } 1381 1382 if (ctx->Shader.ActiveProgram != shProg) { 1383 _mesa_reference_shader_program(ctx, &ctx->Shader.ActiveProgram, shProg); 1384 } 1385} 1386 1387 1388/** 1389 * Use the named shader program for subsequent rendering. 1390 */ 1391void 1392_mesa_use_shader_program(struct gl_context *ctx, 1393 struct gl_shader_program *shProg) 1394{ 1395 for (int i = 0; i < MESA_SHADER_STAGES; i++) { 1396 struct gl_program *new_prog = NULL; 1397 if (shProg && shProg->_LinkedShaders[i]) 1398 new_prog = shProg->_LinkedShaders[i]->Program; 1399 _mesa_use_program(ctx, i, shProg, new_prog, &ctx->Shader); 1400 } 1401 _mesa_active_program(ctx, shProg, "glUseProgram"); 1402} 1403 1404 1405/** 1406 * Do validation of the given shader program. 1407 * \param errMsg returns error message if validation fails. 1408 * \return GL_TRUE if valid, GL_FALSE if invalid (and set errMsg) 1409 */ 1410static GLboolean 1411validate_shader_program(const struct gl_shader_program *shProg, 1412 char *errMsg) 1413{ 1414 if (!shProg->data->LinkStatus) { 1415 return GL_FALSE; 1416 } 1417 1418 /* From the GL spec, a program is invalid if any of these are true: 1419 1420 any two active samplers in the current program object are of 1421 different types, but refer to the same texture image unit, 1422 1423 any active sampler in the current program object refers to a texture 1424 image unit where fixed-function fragment processing accesses a 1425 texture target that does not match the sampler type, or 1426 1427 the sum of the number of active samplers in the program and the 1428 number of texture image units enabled for fixed-function fragment 1429 processing exceeds the combined limit on the total number of texture 1430 image units allowed. 1431 */ 1432 1433 /* 1434 * Check: any two active samplers in the current program object are of 1435 * different types, but refer to the same texture image unit, 1436 */ 1437 if (!_mesa_sampler_uniforms_are_valid(shProg, errMsg, 100)) 1438 return GL_FALSE; 1439 1440 return GL_TRUE; 1441} 1442 1443 1444/** 1445 * Called via glValidateProgram() 1446 */ 1447static void 1448validate_program(struct gl_context *ctx, GLuint program) 1449{ 1450 struct gl_shader_program *shProg; 1451 char errMsg[100] = ""; 1452 1453 shProg = _mesa_lookup_shader_program_err(ctx, program, "glValidateProgram"); 1454 if (!shProg) { 1455 return; 1456 } 1457 1458 shProg->data->Validated = validate_shader_program(shProg, errMsg); 1459 if (!shProg->data->Validated) { 1460 /* update info log */ 1461 if (shProg->data->InfoLog) { 1462 ralloc_free(shProg->data->InfoLog); 1463 } 1464 shProg->data->InfoLog = ralloc_strdup(shProg->data, errMsg); 1465 } 1466} 1467 1468 1469void GLAPIENTRY 1470_mesa_AttachObjectARB_no_error(GLhandleARB program, GLhandleARB shader) 1471{ 1472 GET_CURRENT_CONTEXT(ctx); 1473 attach_shader_no_error(ctx, program, shader); 1474} 1475 1476 1477void GLAPIENTRY 1478_mesa_AttachObjectARB(GLhandleARB program, GLhandleARB shader) 1479{ 1480 GET_CURRENT_CONTEXT(ctx); 1481 attach_shader_err(ctx, program, shader, "glAttachObjectARB"); 1482} 1483 1484 1485void GLAPIENTRY 1486_mesa_AttachShader_no_error(GLuint program, GLuint shader) 1487{ 1488 GET_CURRENT_CONTEXT(ctx); 1489 attach_shader_no_error(ctx, program, shader); 1490} 1491 1492 1493void GLAPIENTRY 1494_mesa_AttachShader(GLuint program, GLuint shader) 1495{ 1496 GET_CURRENT_CONTEXT(ctx); 1497 attach_shader_err(ctx, program, shader, "glAttachShader"); 1498} 1499 1500 1501void GLAPIENTRY 1502_mesa_CompileShader(GLuint shaderObj) 1503{ 1504 GET_CURRENT_CONTEXT(ctx); 1505 if (MESA_VERBOSE & VERBOSE_API) 1506 _mesa_debug(ctx, "glCompileShader %u\n", shaderObj); 1507 _mesa_compile_shader(ctx, _mesa_lookup_shader_err(ctx, shaderObj, 1508 "glCompileShader")); 1509} 1510 1511 1512GLuint GLAPIENTRY 1513_mesa_CreateShader_no_error(GLenum type) 1514{ 1515 GET_CURRENT_CONTEXT(ctx); 1516 return create_shader(ctx, type); 1517} 1518 1519 1520GLuint GLAPIENTRY 1521_mesa_CreateShader(GLenum type) 1522{ 1523 GET_CURRENT_CONTEXT(ctx); 1524 1525 if (MESA_VERBOSE & VERBOSE_API) 1526 _mesa_debug(ctx, "glCreateShader %s\n", _mesa_enum_to_string(type)); 1527 1528 return create_shader_err(ctx, type, "glCreateShader"); 1529} 1530 1531 1532GLhandleARB GLAPIENTRY 1533_mesa_CreateShaderObjectARB_no_error(GLenum type) 1534{ 1535 GET_CURRENT_CONTEXT(ctx); 1536 return create_shader(ctx, type); 1537} 1538 1539 1540GLhandleARB GLAPIENTRY 1541_mesa_CreateShaderObjectARB(GLenum type) 1542{ 1543 GET_CURRENT_CONTEXT(ctx); 1544 return create_shader_err(ctx, type, "glCreateShaderObjectARB"); 1545} 1546 1547 1548GLuint GLAPIENTRY 1549_mesa_CreateProgram(void) 1550{ 1551 GET_CURRENT_CONTEXT(ctx); 1552 if (MESA_VERBOSE & VERBOSE_API) 1553 _mesa_debug(ctx, "glCreateProgram\n"); 1554 return create_shader_program(ctx); 1555} 1556 1557 1558GLhandleARB GLAPIENTRY 1559_mesa_CreateProgramObjectARB(void) 1560{ 1561 GET_CURRENT_CONTEXT(ctx); 1562 return create_shader_program(ctx); 1563} 1564 1565 1566void GLAPIENTRY 1567_mesa_DeleteObjectARB(GLhandleARB obj) 1568{ 1569 if (MESA_VERBOSE & VERBOSE_API) { 1570 GET_CURRENT_CONTEXT(ctx); 1571 _mesa_debug(ctx, "glDeleteObjectARB(%lu)\n", (unsigned long)obj); 1572 } 1573 1574 if (obj) { 1575 GET_CURRENT_CONTEXT(ctx); 1576 FLUSH_VERTICES(ctx, 0); 1577 if (is_program(ctx, obj)) { 1578 delete_shader_program(ctx, obj); 1579 } 1580 else if (is_shader(ctx, obj)) { 1581 delete_shader(ctx, obj); 1582 } 1583 else { 1584 /* error? */ 1585 } 1586 } 1587} 1588 1589 1590void GLAPIENTRY 1591_mesa_DeleteProgram(GLuint name) 1592{ 1593 if (name) { 1594 GET_CURRENT_CONTEXT(ctx); 1595 FLUSH_VERTICES(ctx, 0); 1596 delete_shader_program(ctx, name); 1597 } 1598} 1599 1600 1601void GLAPIENTRY 1602_mesa_DeleteShader(GLuint name) 1603{ 1604 if (name) { 1605 GET_CURRENT_CONTEXT(ctx); 1606 FLUSH_VERTICES(ctx, 0); 1607 delete_shader(ctx, name); 1608 } 1609} 1610 1611 1612void GLAPIENTRY 1613_mesa_DetachObjectARB_no_error(GLhandleARB program, GLhandleARB shader) 1614{ 1615 GET_CURRENT_CONTEXT(ctx); 1616 detach_shader_no_error(ctx, program, shader); 1617} 1618 1619 1620void GLAPIENTRY 1621_mesa_DetachObjectARB(GLhandleARB program, GLhandleARB shader) 1622{ 1623 GET_CURRENT_CONTEXT(ctx); 1624 detach_shader_error(ctx, program, shader); 1625} 1626 1627 1628void GLAPIENTRY 1629_mesa_DetachShader_no_error(GLuint program, GLuint shader) 1630{ 1631 GET_CURRENT_CONTEXT(ctx); 1632 detach_shader_no_error(ctx, program, shader); 1633} 1634 1635 1636void GLAPIENTRY 1637_mesa_DetachShader(GLuint program, GLuint shader) 1638{ 1639 GET_CURRENT_CONTEXT(ctx); 1640 detach_shader_error(ctx, program, shader); 1641} 1642 1643 1644void GLAPIENTRY 1645_mesa_GetAttachedObjectsARB(GLhandleARB container, GLsizei maxCount, 1646 GLsizei * count, GLhandleARB * obj) 1647{ 1648 GET_CURRENT_CONTEXT(ctx); 1649 get_attached_shaders(ctx, (GLuint)container, maxCount, count, NULL, obj); 1650} 1651 1652 1653void GLAPIENTRY 1654_mesa_GetAttachedShaders(GLuint program, GLsizei maxCount, 1655 GLsizei *count, GLuint *obj) 1656{ 1657 GET_CURRENT_CONTEXT(ctx); 1658 get_attached_shaders(ctx, program, maxCount, count, obj, NULL); 1659} 1660 1661 1662void GLAPIENTRY 1663_mesa_GetInfoLogARB(GLhandleARB object, GLsizei maxLength, GLsizei * length, 1664 GLcharARB * infoLog) 1665{ 1666 GET_CURRENT_CONTEXT(ctx); 1667 if (is_program(ctx, object)) { 1668 get_program_info_log(ctx, object, maxLength, length, infoLog); 1669 } 1670 else if (is_shader(ctx, object)) { 1671 get_shader_info_log(ctx, object, maxLength, length, infoLog); 1672 } 1673 else { 1674 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetInfoLogARB"); 1675 } 1676} 1677 1678 1679void GLAPIENTRY 1680_mesa_GetObjectParameterivARB(GLhandleARB object, GLenum pname, GLint *params) 1681{ 1682 GET_CURRENT_CONTEXT(ctx); 1683 /* Implement in terms of GetProgramiv, GetShaderiv */ 1684 if (is_program(ctx, object)) { 1685 if (pname == GL_OBJECT_TYPE_ARB) { 1686 *params = GL_PROGRAM_OBJECT_ARB; 1687 } 1688 else { 1689 get_programiv(ctx, object, pname, params); 1690 } 1691 } 1692 else if (is_shader(ctx, object)) { 1693 if (pname == GL_OBJECT_TYPE_ARB) { 1694 *params = GL_SHADER_OBJECT_ARB; 1695 } 1696 else { 1697 get_shaderiv(ctx, object, pname, params); 1698 } 1699 } 1700 else { 1701 _mesa_error(ctx, GL_INVALID_VALUE, "glGetObjectParameterivARB"); 1702 } 1703} 1704 1705 1706void GLAPIENTRY 1707_mesa_GetObjectParameterfvARB(GLhandleARB object, GLenum pname, 1708 GLfloat *params) 1709{ 1710 GLint iparams[1] = {0}; /* XXX is one element enough? */ 1711 _mesa_GetObjectParameterivARB(object, pname, iparams); 1712 params[0] = (GLfloat) iparams[0]; 1713} 1714 1715 1716void GLAPIENTRY 1717_mesa_GetProgramiv(GLuint program, GLenum pname, GLint *params) 1718{ 1719 GET_CURRENT_CONTEXT(ctx); 1720 get_programiv(ctx, program, pname, params); 1721} 1722 1723 1724void GLAPIENTRY 1725_mesa_GetShaderiv(GLuint shader, GLenum pname, GLint *params) 1726{ 1727 GET_CURRENT_CONTEXT(ctx); 1728 get_shaderiv(ctx, shader, pname, params); 1729} 1730 1731 1732void GLAPIENTRY 1733_mesa_GetProgramInfoLog(GLuint program, GLsizei bufSize, 1734 GLsizei *length, GLchar *infoLog) 1735{ 1736 GET_CURRENT_CONTEXT(ctx); 1737 get_program_info_log(ctx, program, bufSize, length, infoLog); 1738} 1739 1740 1741void GLAPIENTRY 1742_mesa_GetShaderInfoLog(GLuint shader, GLsizei bufSize, 1743 GLsizei *length, GLchar *infoLog) 1744{ 1745 GET_CURRENT_CONTEXT(ctx); 1746 get_shader_info_log(ctx, shader, bufSize, length, infoLog); 1747} 1748 1749 1750void GLAPIENTRY 1751_mesa_GetShaderSource(GLuint shader, GLsizei maxLength, 1752 GLsizei *length, GLchar *sourceOut) 1753{ 1754 GET_CURRENT_CONTEXT(ctx); 1755 get_shader_source(ctx, shader, maxLength, length, sourceOut); 1756} 1757 1758 1759GLhandleARB GLAPIENTRY 1760_mesa_GetHandleARB(GLenum pname) 1761{ 1762 GET_CURRENT_CONTEXT(ctx); 1763 return get_handle(ctx, pname); 1764} 1765 1766 1767GLboolean GLAPIENTRY 1768_mesa_IsProgram(GLuint name) 1769{ 1770 GET_CURRENT_CONTEXT(ctx); 1771 return is_program(ctx, name); 1772} 1773 1774 1775GLboolean GLAPIENTRY 1776_mesa_IsShader(GLuint name) 1777{ 1778 GET_CURRENT_CONTEXT(ctx); 1779 return is_shader(ctx, name); 1780} 1781 1782 1783void GLAPIENTRY 1784_mesa_LinkProgram_no_error(GLuint programObj) 1785{ 1786 GET_CURRENT_CONTEXT(ctx); 1787 1788 struct gl_shader_program *shProg = 1789 _mesa_lookup_shader_program(ctx, programObj); 1790 link_program_no_error(ctx, shProg); 1791} 1792 1793 1794void GLAPIENTRY 1795_mesa_LinkProgram(GLuint programObj) 1796{ 1797 GET_CURRENT_CONTEXT(ctx); 1798 1799 if (MESA_VERBOSE & VERBOSE_API) 1800 _mesa_debug(ctx, "glLinkProgram %u\n", programObj); 1801 1802 struct gl_shader_program *shProg = 1803 _mesa_lookup_shader_program_err(ctx, programObj, "glLinkProgram"); 1804 link_program_error(ctx, shProg); 1805} 1806 1807#ifdef ENABLE_SHADER_CACHE 1808/** 1809 * Generate a SHA-1 hash value string for given source string. 1810 */ 1811static void 1812generate_sha1(const char *source, char sha_str[64]) 1813{ 1814 unsigned char sha[20]; 1815 _mesa_sha1_compute(source, strlen(source), sha); 1816 _mesa_sha1_format(sha_str, sha); 1817} 1818 1819/** 1820 * Construct a full path for shader replacement functionality using 1821 * following format: 1822 * 1823 * <path>/<stage prefix>_<CHECKSUM>.glsl 1824 * <path>/<stage prefix>_<CHECKSUM>.arb 1825 */ 1826static char * 1827construct_name(const gl_shader_stage stage, const char *source, 1828 const char *path) 1829{ 1830 char sha[64]; 1831 static const char *types[] = { 1832 "VS", "TC", "TE", "GS", "FS", "CS", 1833 }; 1834 1835 const char *format = strncmp(source, "!!ARB", 5) ? "glsl" : "arb"; 1836 1837 generate_sha1(source, sha); 1838 return ralloc_asprintf(NULL, "%s/%s_%s.%s", path, types[stage], sha, format); 1839} 1840 1841/** 1842 * Write given shader source to a file in MESA_SHADER_DUMP_PATH. 1843 */ 1844void 1845_mesa_dump_shader_source(const gl_shader_stage stage, const char *source) 1846{ 1847 static bool path_exists = true; 1848 char *dump_path; 1849 FILE *f; 1850 1851 if (!path_exists) 1852 return; 1853 1854 dump_path = getenv("MESA_SHADER_DUMP_PATH"); 1855 if (!dump_path) { 1856 path_exists = false; 1857 return; 1858 } 1859 1860 char *name = construct_name(stage, source, dump_path); 1861 1862 f = fopen(name, "w"); 1863 if (f) { 1864 fputs(source, f); 1865 fclose(f); 1866 } else { 1867 GET_CURRENT_CONTEXT(ctx); 1868 _mesa_warning(ctx, "could not open %s for dumping shader (%s)", name, 1869 strerror(errno)); 1870 } 1871 ralloc_free(name); 1872} 1873 1874/** 1875 * Read shader source code from a file. 1876 * Useful for debugging to override an app's shader. 1877 */ 1878GLcharARB * 1879_mesa_read_shader_source(const gl_shader_stage stage, const char *source) 1880{ 1881 char *read_path; 1882 static bool path_exists = true; 1883 int len, shader_size = 0; 1884 GLcharARB *buffer; 1885 FILE *f; 1886 1887 if (!path_exists) 1888 return NULL; 1889 1890 read_path = getenv("MESA_SHADER_READ_PATH"); 1891 if (!read_path) { 1892 path_exists = false; 1893 return NULL; 1894 } 1895 1896 char *name = construct_name(stage, source, read_path); 1897 f = fopen(name, "r"); 1898 ralloc_free(name); 1899 if (!f) 1900 return NULL; 1901 1902 /* allocate enough room for the entire shader */ 1903 fseek(f, 0, SEEK_END); 1904 shader_size = ftell(f); 1905 rewind(f); 1906 assert(shader_size); 1907 1908 /* add one for terminating zero */ 1909 shader_size++; 1910 1911 buffer = malloc(shader_size); 1912 assert(buffer); 1913 1914 len = fread(buffer, 1, shader_size, f); 1915 buffer[len] = 0; 1916 1917 fclose(f); 1918 1919 return buffer; 1920} 1921 1922#endif /* ENABLE_SHADER_CACHE */ 1923 1924/** 1925 * Called via glShaderSource() and glShaderSourceARB() API functions. 1926 * Basically, concatenate the source code strings into one long string 1927 * and pass it to _mesa_shader_source(). 1928 */ 1929static ALWAYS_INLINE void 1930shader_source(struct gl_context *ctx, GLuint shaderObj, GLsizei count, 1931 const GLchar *const *string, const GLint *length, bool no_error) 1932{ 1933 GLint *offsets; 1934 GLsizei i, totalLength; 1935 GLcharARB *source; 1936 struct gl_shader *sh; 1937 1938 if (!no_error) { 1939 sh = _mesa_lookup_shader_err(ctx, shaderObj, "glShaderSourceARB"); 1940 if (!sh) 1941 return; 1942 1943 if (string == NULL) { 1944 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderSourceARB"); 1945 return; 1946 } 1947 } else { 1948 sh = _mesa_lookup_shader(ctx, shaderObj); 1949 } 1950 1951 /* 1952 * This array holds offsets of where the appropriate string ends, thus the 1953 * last element will be set to the total length of the source code. 1954 */ 1955 offsets = malloc(count * sizeof(GLint)); 1956 if (offsets == NULL) { 1957 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB"); 1958 return; 1959 } 1960 1961 for (i = 0; i < count; i++) { 1962 if (!no_error && string[i] == NULL) { 1963 free((GLvoid *) offsets); 1964 _mesa_error(ctx, GL_INVALID_OPERATION, 1965 "glShaderSourceARB(null string)"); 1966 return; 1967 } 1968 if (length == NULL || length[i] < 0) 1969 offsets[i] = strlen(string[i]); 1970 else 1971 offsets[i] = length[i]; 1972 /* accumulate string lengths */ 1973 if (i > 0) 1974 offsets[i] += offsets[i - 1]; 1975 } 1976 1977 /* Total length of source string is sum off all strings plus two. 1978 * One extra byte for terminating zero, another extra byte to silence 1979 * valgrind warnings in the parser/grammer code. 1980 */ 1981 totalLength = offsets[count - 1] + 2; 1982 source = malloc(totalLength * sizeof(GLcharARB)); 1983 if (source == NULL) { 1984 free((GLvoid *) offsets); 1985 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderSourceARB"); 1986 return; 1987 } 1988 1989 for (i = 0; i < count; i++) { 1990 GLint start = (i > 0) ? offsets[i - 1] : 0; 1991 memcpy(source + start, string[i], 1992 (offsets[i] - start) * sizeof(GLcharARB)); 1993 } 1994 source[totalLength - 1] = '\0'; 1995 source[totalLength - 2] = '\0'; 1996 1997#ifdef ENABLE_SHADER_CACHE 1998 GLcharARB *replacement; 1999 2000 /* Dump original shader source to MESA_SHADER_DUMP_PATH and replace 2001 * if corresponding entry found from MESA_SHADER_READ_PATH. 2002 */ 2003 _mesa_dump_shader_source(sh->Stage, source); 2004 2005 replacement = _mesa_read_shader_source(sh->Stage, source); 2006 if (replacement) { 2007 free(source); 2008 source = replacement; 2009 } 2010#endif /* ENABLE_SHADER_CACHE */ 2011 2012 set_shader_source(sh, source); 2013 2014 free(offsets); 2015} 2016 2017 2018void GLAPIENTRY 2019_mesa_ShaderSource_no_error(GLuint shaderObj, GLsizei count, 2020 const GLchar *const *string, const GLint *length) 2021{ 2022 GET_CURRENT_CONTEXT(ctx); 2023 shader_source(ctx, shaderObj, count, string, length, true); 2024} 2025 2026 2027void GLAPIENTRY 2028_mesa_ShaderSource(GLuint shaderObj, GLsizei count, 2029 const GLchar *const *string, const GLint *length) 2030{ 2031 GET_CURRENT_CONTEXT(ctx); 2032 shader_source(ctx, shaderObj, count, string, length, false); 2033} 2034 2035 2036static ALWAYS_INLINE void 2037use_program(GLuint program, bool no_error) 2038{ 2039 GET_CURRENT_CONTEXT(ctx); 2040 struct gl_shader_program *shProg = NULL; 2041 2042 if (MESA_VERBOSE & VERBOSE_API) 2043 _mesa_debug(ctx, "glUseProgram %u\n", program); 2044 2045 if (no_error) { 2046 if (program) { 2047 shProg = _mesa_lookup_shader_program(ctx, program); 2048 } 2049 } else { 2050 if (_mesa_is_xfb_active_and_unpaused(ctx)) { 2051 _mesa_error(ctx, GL_INVALID_OPERATION, 2052 "glUseProgram(transform feedback active)"); 2053 return; 2054 } 2055 2056 if (program) { 2057 shProg = 2058 _mesa_lookup_shader_program_err(ctx, program, "glUseProgram"); 2059 if (!shProg) 2060 return; 2061 2062 if (!shProg->data->LinkStatus) { 2063 _mesa_error(ctx, GL_INVALID_OPERATION, 2064 "glUseProgram(program %u not linked)", program); 2065 return; 2066 } 2067 2068 /* debug code */ 2069 if (ctx->_Shader->Flags & GLSL_USE_PROG) { 2070 print_shader_info(shProg); 2071 } 2072 } 2073 } 2074 2075 /* The ARB_separate_shader_object spec says: 2076 * 2077 * "The executable code for an individual shader stage is taken from 2078 * the current program for that stage. If there is a current program 2079 * object established by UseProgram, that program is considered current 2080 * for all stages. Otherwise, if there is a bound program pipeline 2081 * object (section 2.14.PPO), the program bound to the appropriate 2082 * stage of the pipeline object is considered current." 2083 */ 2084 if (shProg) { 2085 /* Attach shader state to the binding point */ 2086 _mesa_reference_pipeline_object(ctx, &ctx->_Shader, &ctx->Shader); 2087 /* Update the program */ 2088 _mesa_use_shader_program(ctx, shProg); 2089 } else { 2090 /* Must be done first: detach the progam */ 2091 _mesa_use_shader_program(ctx, shProg); 2092 /* Unattach shader_state binding point */ 2093 _mesa_reference_pipeline_object(ctx, &ctx->_Shader, 2094 ctx->Pipeline.Default); 2095 /* If a pipeline was bound, rebind it */ 2096 if (ctx->Pipeline.Current) { 2097 if (no_error) 2098 _mesa_BindProgramPipeline_no_error(ctx->Pipeline.Current->Name); 2099 else 2100 _mesa_BindProgramPipeline(ctx->Pipeline.Current->Name); 2101 } 2102 } 2103 2104 _mesa_update_vertex_processing_mode(ctx); 2105} 2106 2107 2108void GLAPIENTRY 2109_mesa_UseProgram_no_error(GLuint program) 2110{ 2111 use_program(program, true); 2112} 2113 2114 2115void GLAPIENTRY 2116_mesa_UseProgram(GLuint program) 2117{ 2118 use_program(program, false); 2119} 2120 2121 2122void GLAPIENTRY 2123_mesa_ValidateProgram(GLuint program) 2124{ 2125 GET_CURRENT_CONTEXT(ctx); 2126 validate_program(ctx, program); 2127} 2128 2129 2130/** 2131 * For OpenGL ES 2.0, GL_ARB_ES2_compatibility 2132 */ 2133void GLAPIENTRY 2134_mesa_GetShaderPrecisionFormat(GLenum shadertype, GLenum precisiontype, 2135 GLint* range, GLint* precision) 2136{ 2137 const struct gl_program_constants *limits; 2138 const struct gl_precision *p; 2139 GET_CURRENT_CONTEXT(ctx); 2140 2141 switch (shadertype) { 2142 case GL_VERTEX_SHADER: 2143 limits = &ctx->Const.Program[MESA_SHADER_VERTEX]; 2144 break; 2145 case GL_FRAGMENT_SHADER: 2146 limits = &ctx->Const.Program[MESA_SHADER_FRAGMENT]; 2147 break; 2148 default: 2149 _mesa_error(ctx, GL_INVALID_ENUM, 2150 "glGetShaderPrecisionFormat(shadertype)"); 2151 return; 2152 } 2153 2154 switch (precisiontype) { 2155 case GL_LOW_FLOAT: 2156 p = &limits->LowFloat; 2157 break; 2158 case GL_MEDIUM_FLOAT: 2159 p = &limits->MediumFloat; 2160 break; 2161 case GL_HIGH_FLOAT: 2162 p = &limits->HighFloat; 2163 break; 2164 case GL_LOW_INT: 2165 p = &limits->LowInt; 2166 break; 2167 case GL_MEDIUM_INT: 2168 p = &limits->MediumInt; 2169 break; 2170 case GL_HIGH_INT: 2171 p = &limits->HighInt; 2172 break; 2173 default: 2174 _mesa_error(ctx, GL_INVALID_ENUM, 2175 "glGetShaderPrecisionFormat(precisiontype)"); 2176 return; 2177 } 2178 2179 range[0] = p->RangeMin; 2180 range[1] = p->RangeMax; 2181 precision[0] = p->Precision; 2182} 2183 2184 2185/** 2186 * For OpenGL ES 2.0, GL_ARB_ES2_compatibility 2187 */ 2188void GLAPIENTRY 2189_mesa_ReleaseShaderCompiler(void) 2190{ 2191 _mesa_destroy_shader_compiler_caches(); 2192} 2193 2194 2195/** 2196 * For OpenGL ES 2.0, GL_ARB_ES2_compatibility 2197 */ 2198void GLAPIENTRY 2199_mesa_ShaderBinary(GLint n, const GLuint* shaders, GLenum binaryformat, 2200 const void* binary, GLint length) 2201{ 2202 GET_CURRENT_CONTEXT(ctx); 2203 struct gl_shader **sh; 2204 2205 /* Page 68, section 7.2 'Shader Binaries" of the of the OpenGL ES 3.1, and 2206 * page 88 of the OpenGL 4.5 specs state: 2207 * 2208 * "An INVALID_VALUE error is generated if count or length is negative. 2209 * An INVALID_ENUM error is generated if binaryformat is not a supported 2210 * format returned in SHADER_BINARY_FORMATS." 2211 */ 2212 if (n < 0 || length < 0) { 2213 _mesa_error(ctx, GL_INVALID_VALUE, "glShaderBinary(count or length < 0)"); 2214 return; 2215 } 2216 2217 /* Get all shader objects at once so we can make the operation 2218 * all-or-nothing. 2219 */ 2220 if (n > SIZE_MAX / sizeof(*sh)) { 2221 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderBinary(count)"); 2222 return; 2223 } 2224 2225 sh = alloca(sizeof(*sh) * (size_t)n); 2226 if (!sh) { 2227 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glShaderBinary"); 2228 return; 2229 } 2230 2231 for (int i = 0; i < n; ++i) { 2232 sh[i] = _mesa_lookup_shader_err(ctx, shaders[i], "glShaderBinary"); 2233 if (!sh[i]) 2234 return; 2235 } 2236 2237 if (binaryformat == GL_SHADER_BINARY_FORMAT_SPIR_V_ARB) { 2238 if (!ctx->Extensions.ARB_gl_spirv) { 2239 _mesa_error(ctx, GL_INVALID_OPERATION, "glShaderBinary(SPIR-V)"); 2240 } else if (n > 0) { 2241 _mesa_spirv_shader_binary(ctx, (unsigned) n, sh, binary, 2242 (size_t) length); 2243 } 2244 2245 return; 2246 } 2247 2248 _mesa_error(ctx, GL_INVALID_ENUM, "glShaderBinary(format)"); 2249} 2250 2251 2252void GLAPIENTRY 2253_mesa_GetProgramBinary(GLuint program, GLsizei bufSize, GLsizei *length, 2254 GLenum *binaryFormat, GLvoid *binary) 2255{ 2256 struct gl_shader_program *shProg; 2257 GLsizei length_dummy; 2258 GET_CURRENT_CONTEXT(ctx); 2259 2260 if (bufSize < 0){ 2261 _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramBinary(bufSize < 0)"); 2262 return; 2263 } 2264 2265 shProg = _mesa_lookup_shader_program_err(ctx, program, "glGetProgramBinary"); 2266 if (!shProg) 2267 return; 2268 2269 /* The ARB_get_program_binary spec says: 2270 * 2271 * "If <length> is NULL, then no length is returned." 2272 * 2273 * Ensure that length always points to valid storage to avoid multiple NULL 2274 * pointer checks below. 2275 */ 2276 if (length == NULL) 2277 length = &length_dummy; 2278 2279 2280 /* The ARB_get_program_binary spec says: 2281 * 2282 * "When a program object's LINK_STATUS is FALSE, its program binary 2283 * length is zero, and a call to GetProgramBinary will generate an 2284 * INVALID_OPERATION error. 2285 */ 2286 if (!shProg->data->LinkStatus) { 2287 _mesa_error(ctx, GL_INVALID_OPERATION, 2288 "glGetProgramBinary(program %u not linked)", 2289 shProg->Name); 2290 *length = 0; 2291 return; 2292 } 2293 2294 if (ctx->Const.NumProgramBinaryFormats == 0) { 2295 *length = 0; 2296 _mesa_error(ctx, GL_INVALID_OPERATION, 2297 "glGetProgramBinary(driver supports zero binary formats)"); 2298 } else { 2299 _mesa_get_program_binary(ctx, shProg, bufSize, length, binaryFormat, 2300 binary); 2301 assert(*length == 0 || *binaryFormat == GL_PROGRAM_BINARY_FORMAT_MESA); 2302 } 2303} 2304 2305void GLAPIENTRY 2306_mesa_ProgramBinary(GLuint program, GLenum binaryFormat, 2307 const GLvoid *binary, GLsizei length) 2308{ 2309 struct gl_shader_program *shProg; 2310 GET_CURRENT_CONTEXT(ctx); 2311 2312 shProg = _mesa_lookup_shader_program_err(ctx, program, "glProgramBinary"); 2313 if (!shProg) 2314 return; 2315 2316 _mesa_clear_shader_program_data(ctx, shProg); 2317 shProg->data = _mesa_create_shader_program_data(); 2318 2319 /* Section 2.3.1 (Errors) of the OpenGL 4.5 spec says: 2320 * 2321 * "If a negative number is provided where an argument of type sizei or 2322 * sizeiptr is specified, an INVALID_VALUE error is generated." 2323 */ 2324 if (length < 0) { 2325 _mesa_error(ctx, GL_INVALID_VALUE, "glProgramBinary(length < 0)"); 2326 return; 2327 } 2328 2329 if (ctx->Const.NumProgramBinaryFormats == 0 || 2330 binaryFormat != GL_PROGRAM_BINARY_FORMAT_MESA) { 2331 /* The ARB_get_program_binary spec says: 2332 * 2333 * "<binaryFormat> and <binary> must be those returned by a previous 2334 * call to GetProgramBinary, and <length> must be the length of the 2335 * program binary as returned by GetProgramBinary or GetProgramiv with 2336 * <pname> PROGRAM_BINARY_LENGTH. Loading the program binary will fail, 2337 * setting the LINK_STATUS of <program> to FALSE, if these conditions 2338 * are not met." 2339 * 2340 * Since any value of binaryFormat passed "is not one of those specified as 2341 * allowable for [this] command, an INVALID_ENUM error is generated." 2342 */ 2343 shProg->data->LinkStatus = LINKING_FAILURE; 2344 _mesa_error(ctx, GL_INVALID_ENUM, "glProgramBinary"); 2345 } else { 2346 _mesa_program_binary(ctx, shProg, binaryFormat, binary, length); 2347 } 2348} 2349 2350 2351static ALWAYS_INLINE void 2352program_parameteri(struct gl_context *ctx, struct gl_shader_program *shProg, 2353 GLuint pname, GLint value, bool no_error) 2354{ 2355 switch (pname) { 2356 case GL_PROGRAM_BINARY_RETRIEVABLE_HINT: 2357 /* This enum isn't part of the OES extension for OpenGL ES 2.0, but it 2358 * is part of OpenGL ES 3.0. For the ES2 case, this function shouldn't 2359 * even be in the dispatch table, so we shouldn't need to expclicitly 2360 * check here. 2361 * 2362 * On desktop, we ignore the 3.0+ requirement because it is silly. 2363 */ 2364 2365 /* The ARB_get_program_binary extension spec says: 2366 * 2367 * "An INVALID_VALUE error is generated if the <value> argument to 2368 * ProgramParameteri is not TRUE or FALSE." 2369 */ 2370 if (!no_error && value != GL_TRUE && value != GL_FALSE) { 2371 goto invalid_value; 2372 } 2373 2374 /* No need to notify the driver. Any changes will actually take effect 2375 * the next time the shader is linked. 2376 * 2377 * The ARB_get_program_binary extension spec says: 2378 * 2379 * "To indicate that a program binary is likely to be retrieved, 2380 * ProgramParameteri should be called with <pname> 2381 * PROGRAM_BINARY_RETRIEVABLE_HINT and <value> TRUE. This setting 2382 * will not be in effect until the next time LinkProgram or 2383 * ProgramBinary has been called successfully." 2384 * 2385 * The resloution of issue 9 in the extension spec also says: 2386 * 2387 * "The application may use the PROGRAM_BINARY_RETRIEVABLE_HINT hint 2388 * to indicate to the GL implementation that this program will 2389 * likely be saved with GetProgramBinary at some point. This will 2390 * give the GL implementation the opportunity to track any state 2391 * changes made to the program before being saved such that when it 2392 * is loaded again a recompile can be avoided." 2393 */ 2394 shProg->BinaryRetreivableHint = value; 2395 return; 2396 2397 case GL_PROGRAM_SEPARABLE: 2398 /* Spec imply that the behavior is the same as ARB_get_program_binary 2399 * Chapter 7.3 Program Objects 2400 */ 2401 if (!no_error && value != GL_TRUE && value != GL_FALSE) { 2402 goto invalid_value; 2403 } 2404 shProg->SeparateShader = value; 2405 return; 2406 2407 default: 2408 if (!no_error) { 2409 _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameteri(pname=%s)", 2410 _mesa_enum_to_string(pname)); 2411 } 2412 return; 2413 } 2414 2415invalid_value: 2416 _mesa_error(ctx, GL_INVALID_VALUE, 2417 "glProgramParameteri(pname=%s, value=%d): " 2418 "value must be 0 or 1.", 2419 _mesa_enum_to_string(pname), 2420 value); 2421} 2422 2423 2424void GLAPIENTRY 2425_mesa_ProgramParameteri_no_error(GLuint program, GLenum pname, GLint value) 2426{ 2427 GET_CURRENT_CONTEXT(ctx); 2428 2429 struct gl_shader_program *shProg = _mesa_lookup_shader_program(ctx, program); 2430 program_parameteri(ctx, shProg, pname, value, true); 2431} 2432 2433 2434void GLAPIENTRY 2435_mesa_ProgramParameteri(GLuint program, GLenum pname, GLint value) 2436{ 2437 struct gl_shader_program *shProg; 2438 GET_CURRENT_CONTEXT(ctx); 2439 2440 shProg = _mesa_lookup_shader_program_err(ctx, program, 2441 "glProgramParameteri"); 2442 if (!shProg) 2443 return; 2444 2445 program_parameteri(ctx, shProg, pname, value, false); 2446} 2447 2448 2449void 2450_mesa_use_program(struct gl_context *ctx, gl_shader_stage stage, 2451 struct gl_shader_program *shProg, struct gl_program *prog, 2452 struct gl_pipeline_object *shTarget) 2453{ 2454 struct gl_program **target; 2455 2456 target = &shTarget->CurrentProgram[stage]; 2457 if (prog) { 2458 _mesa_program_init_subroutine_defaults(ctx, prog); 2459 } 2460 2461 if (*target != prog) { 2462 /* Program is current, flush it */ 2463 if (shTarget == ctx->_Shader) { 2464 FLUSH_VERTICES(ctx, _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS); 2465 } 2466 2467 _mesa_reference_shader_program(ctx, 2468 &shTarget->ReferencedPrograms[stage], 2469 shProg); 2470 _mesa_reference_program(ctx, target, prog); 2471 if (stage == MESA_SHADER_VERTEX) 2472 _mesa_update_vertex_processing_mode(ctx); 2473 return; 2474 } 2475 2476} 2477 2478 2479/** 2480 * Copy program-specific data generated by linking from the gl_shader_program 2481 * object to the gl_program object referred to by the gl_linked_shader. 2482 * 2483 * This function expects _mesa_reference_program() to have been previously 2484 * called setting the gl_linked_shaders program reference. 2485 */ 2486void 2487_mesa_copy_linked_program_data(const struct gl_shader_program *src, 2488 struct gl_linked_shader *dst_sh) 2489{ 2490 assert(dst_sh->Program); 2491 2492 struct gl_program *dst = dst_sh->Program; 2493 2494 dst->info.separate_shader = src->SeparateShader; 2495 2496 switch (dst_sh->Stage) { 2497 case MESA_SHADER_GEOMETRY: { 2498 dst->info.gs.vertices_in = src->Geom.VerticesIn; 2499 dst->info.gs.uses_end_primitive = src->Geom.UsesEndPrimitive; 2500 dst->info.gs.uses_streams = src->Geom.UsesStreams; 2501 break; 2502 } 2503 case MESA_SHADER_FRAGMENT: { 2504 dst->info.fs.depth_layout = src->FragDepthLayout; 2505 break; 2506 } 2507 case MESA_SHADER_COMPUTE: { 2508 dst->info.cs.shared_size = src->Comp.SharedSize; 2509 break; 2510 } 2511 default: 2512 break; 2513 } 2514} 2515 2516/** 2517 * ARB_separate_shader_objects: Compile & Link Program 2518 */ 2519GLuint GLAPIENTRY 2520_mesa_CreateShaderProgramv(GLenum type, GLsizei count, 2521 const GLchar* const *strings) 2522{ 2523 GET_CURRENT_CONTEXT(ctx); 2524 2525 const GLuint shader = create_shader_err(ctx, type, "glCreateShaderProgramv"); 2526 GLuint program = 0; 2527 2528 /* 2529 * According to OpenGL 4.5 and OpenGL ES 3.1 standards, section 7.3: 2530 * GL_INVALID_VALUE should be generated if count < 0 2531 */ 2532 if (count < 0) { 2533 _mesa_error(ctx, GL_INVALID_VALUE, "glCreateShaderProgram (count < 0)"); 2534 return program; 2535 } 2536 2537 if (shader) { 2538 struct gl_shader *sh = _mesa_lookup_shader(ctx, shader); 2539 2540 _mesa_ShaderSource(shader, count, strings, NULL); 2541 _mesa_compile_shader(ctx, sh); 2542 2543 program = create_shader_program(ctx); 2544 if (program) { 2545 struct gl_shader_program *shProg; 2546 GLint compiled = GL_FALSE; 2547 2548 shProg = _mesa_lookup_shader_program(ctx, program); 2549 2550 shProg->SeparateShader = GL_TRUE; 2551 2552 get_shaderiv(ctx, shader, GL_COMPILE_STATUS, &compiled); 2553 if (compiled) { 2554 attach_shader_err(ctx, program, shader, "glCreateShaderProgramv"); 2555 _mesa_link_program(ctx, shProg); 2556 detach_shader_error(ctx, program, shader); 2557 2558#if 0 2559 /* Possibly... */ 2560 if (active-user-defined-varyings-in-linked-program) { 2561 append-error-to-info-log; 2562 shProg->data->LinkStatus = LINKING_FAILURE; 2563 } 2564#endif 2565 } 2566 if (sh->InfoLog) 2567 ralloc_strcat(&shProg->data->InfoLog, sh->InfoLog); 2568 } 2569 2570 delete_shader(ctx, shader); 2571 } 2572 2573 return program; 2574} 2575 2576 2577/** 2578 * For GL_ARB_tessellation_shader 2579 */ 2580void GLAPIENTRY 2581_mesa_PatchParameteri_no_error(GLenum pname, GLint value) 2582{ 2583 GET_CURRENT_CONTEXT(ctx); 2584 ctx->TessCtrlProgram.patch_vertices = value; 2585} 2586 2587 2588extern void GLAPIENTRY 2589_mesa_PatchParameteri(GLenum pname, GLint value) 2590{ 2591 GET_CURRENT_CONTEXT(ctx); 2592 2593 if (!_mesa_has_tessellation(ctx)) { 2594 _mesa_error(ctx, GL_INVALID_OPERATION, "glPatchParameteri"); 2595 return; 2596 } 2597 2598 if (pname != GL_PATCH_VERTICES) { 2599 _mesa_error(ctx, GL_INVALID_ENUM, "glPatchParameteri"); 2600 return; 2601 } 2602 2603 if (value <= 0 || value > ctx->Const.MaxPatchVertices) { 2604 _mesa_error(ctx, GL_INVALID_VALUE, "glPatchParameteri"); 2605 return; 2606 } 2607 2608 ctx->TessCtrlProgram.patch_vertices = value; 2609} 2610 2611 2612extern void GLAPIENTRY 2613_mesa_PatchParameterfv(GLenum pname, const GLfloat *values) 2614{ 2615 GET_CURRENT_CONTEXT(ctx); 2616 2617 if (!_mesa_has_tessellation(ctx)) { 2618 _mesa_error(ctx, GL_INVALID_OPERATION, "glPatchParameterfv"); 2619 return; 2620 } 2621 2622 switch(pname) { 2623 case GL_PATCH_DEFAULT_OUTER_LEVEL: 2624 FLUSH_VERTICES(ctx, 0); 2625 memcpy(ctx->TessCtrlProgram.patch_default_outer_level, values, 2626 4 * sizeof(GLfloat)); 2627 ctx->NewDriverState |= ctx->DriverFlags.NewDefaultTessLevels; 2628 return; 2629 case GL_PATCH_DEFAULT_INNER_LEVEL: 2630 FLUSH_VERTICES(ctx, 0); 2631 memcpy(ctx->TessCtrlProgram.patch_default_inner_level, values, 2632 2 * sizeof(GLfloat)); 2633 ctx->NewDriverState |= ctx->DriverFlags.NewDefaultTessLevels; 2634 return; 2635 default: 2636 _mesa_error(ctx, GL_INVALID_ENUM, "glPatchParameterfv"); 2637 return; 2638 } 2639} 2640 2641/** 2642 * ARB_shader_subroutine 2643 */ 2644GLint GLAPIENTRY 2645_mesa_GetSubroutineUniformLocation(GLuint program, GLenum shadertype, 2646 const GLchar *name) 2647{ 2648 GET_CURRENT_CONTEXT(ctx); 2649 const char *api_name = "glGetSubroutineUniformLocation"; 2650 struct gl_shader_program *shProg; 2651 GLenum resource_type; 2652 gl_shader_stage stage; 2653 2654 if (!_mesa_validate_shader_target(ctx, shadertype)) { 2655 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2656 return -1; 2657 } 2658 2659 shProg = _mesa_lookup_shader_program_err(ctx, program, api_name); 2660 if (!shProg) 2661 return -1; 2662 2663 stage = _mesa_shader_enum_to_shader_stage(shadertype); 2664 if (!shProg->_LinkedShaders[stage]) { 2665 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2666 return -1; 2667 } 2668 2669 resource_type = _mesa_shader_stage_to_subroutine_uniform(stage); 2670 return _mesa_program_resource_location(shProg, resource_type, name); 2671} 2672 2673GLuint GLAPIENTRY 2674_mesa_GetSubroutineIndex(GLuint program, GLenum shadertype, 2675 const GLchar *name) 2676{ 2677 GET_CURRENT_CONTEXT(ctx); 2678 const char *api_name = "glGetSubroutineIndex"; 2679 struct gl_shader_program *shProg; 2680 struct gl_program_resource *res; 2681 GLenum resource_type; 2682 gl_shader_stage stage; 2683 2684 if (!_mesa_validate_shader_target(ctx, shadertype)) { 2685 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2686 return -1; 2687 } 2688 2689 shProg = _mesa_lookup_shader_program_err(ctx, program, api_name); 2690 if (!shProg) 2691 return -1; 2692 2693 stage = _mesa_shader_enum_to_shader_stage(shadertype); 2694 if (!shProg->_LinkedShaders[stage]) { 2695 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2696 return -1; 2697 } 2698 2699 resource_type = _mesa_shader_stage_to_subroutine(stage); 2700 res = _mesa_program_resource_find_name(shProg, resource_type, name, NULL); 2701 if (!res) { 2702 return -1; 2703 } 2704 2705 return _mesa_program_resource_index(shProg, res); 2706} 2707 2708 2709GLvoid GLAPIENTRY 2710_mesa_GetActiveSubroutineUniformiv(GLuint program, GLenum shadertype, 2711 GLuint index, GLenum pname, GLint *values) 2712{ 2713 GET_CURRENT_CONTEXT(ctx); 2714 const char *api_name = "glGetActiveSubroutineUniformiv"; 2715 struct gl_shader_program *shProg; 2716 struct gl_linked_shader *sh; 2717 gl_shader_stage stage; 2718 struct gl_program_resource *res; 2719 const struct gl_uniform_storage *uni; 2720 GLenum resource_type; 2721 int count, i, j; 2722 2723 if (!_mesa_validate_shader_target(ctx, shadertype)) { 2724 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2725 return; 2726 } 2727 2728 shProg = _mesa_lookup_shader_program_err(ctx, program, api_name); 2729 if (!shProg) 2730 return; 2731 2732 stage = _mesa_shader_enum_to_shader_stage(shadertype); 2733 resource_type = _mesa_shader_stage_to_subroutine_uniform(stage); 2734 2735 sh = shProg->_LinkedShaders[stage]; 2736 if (!sh) { 2737 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2738 return; 2739 } 2740 2741 struct gl_program *p = shProg->_LinkedShaders[stage]->Program; 2742 if (index >= p->sh.NumSubroutineUniforms) { 2743 _mesa_error(ctx, GL_INVALID_VALUE, "%s: invalid index greater than GL_ACTIVE_SUBROUTINE_UNIFORMS", api_name); 2744 return; 2745 } 2746 2747 switch (pname) { 2748 case GL_NUM_COMPATIBLE_SUBROUTINES: { 2749 res = _mesa_program_resource_find_index(shProg, resource_type, index); 2750 if (res) { 2751 uni = res->Data; 2752 values[0] = uni->num_compatible_subroutines; 2753 } 2754 break; 2755 } 2756 case GL_COMPATIBLE_SUBROUTINES: { 2757 res = _mesa_program_resource_find_index(shProg, resource_type, index); 2758 if (res) { 2759 uni = res->Data; 2760 count = 0; 2761 for (i = 0; i < p->sh.NumSubroutineFunctions; i++) { 2762 struct gl_subroutine_function *fn = &p->sh.SubroutineFunctions[i]; 2763 for (j = 0; j < fn->num_compat_types; j++) { 2764 if (fn->types[j] == uni->type) { 2765 values[count++] = i; 2766 break; 2767 } 2768 } 2769 } 2770 } 2771 break; 2772 } 2773 case GL_UNIFORM_SIZE: 2774 res = _mesa_program_resource_find_index(shProg, resource_type, index); 2775 if (res) { 2776 uni = res->Data; 2777 values[0] = uni->array_elements ? uni->array_elements : 1; 2778 } 2779 break; 2780 case GL_UNIFORM_NAME_LENGTH: 2781 res = _mesa_program_resource_find_index(shProg, resource_type, index); 2782 if (res) { 2783 values[0] = strlen(_mesa_program_resource_name(res)) + 1 2784 + ((_mesa_program_resource_array_size(res) != 0) ? 3 : 0); 2785 } 2786 break; 2787 default: 2788 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2789 return; 2790 } 2791} 2792 2793 2794GLvoid GLAPIENTRY 2795_mesa_GetActiveSubroutineUniformName(GLuint program, GLenum shadertype, 2796 GLuint index, GLsizei bufsize, 2797 GLsizei *length, GLchar *name) 2798{ 2799 GET_CURRENT_CONTEXT(ctx); 2800 const char *api_name = "glGetActiveSubroutineUniformName"; 2801 struct gl_shader_program *shProg; 2802 GLenum resource_type; 2803 gl_shader_stage stage; 2804 2805 if (!_mesa_validate_shader_target(ctx, shadertype)) { 2806 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2807 return; 2808 } 2809 2810 shProg = _mesa_lookup_shader_program_err(ctx, program, api_name); 2811 if (!shProg) 2812 return; 2813 2814 stage = _mesa_shader_enum_to_shader_stage(shadertype); 2815 if (!shProg->_LinkedShaders[stage]) { 2816 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2817 return; 2818 } 2819 2820 resource_type = _mesa_shader_stage_to_subroutine_uniform(stage); 2821 /* get program resource name */ 2822 _mesa_get_program_resource_name(shProg, resource_type, 2823 index, bufsize, 2824 length, name, api_name); 2825} 2826 2827 2828GLvoid GLAPIENTRY 2829_mesa_GetActiveSubroutineName(GLuint program, GLenum shadertype, 2830 GLuint index, GLsizei bufsize, 2831 GLsizei *length, GLchar *name) 2832{ 2833 GET_CURRENT_CONTEXT(ctx); 2834 const char *api_name = "glGetActiveSubroutineName"; 2835 struct gl_shader_program *shProg; 2836 GLenum resource_type; 2837 gl_shader_stage stage; 2838 2839 if (!_mesa_validate_shader_target(ctx, shadertype)) { 2840 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2841 return; 2842 } 2843 2844 shProg = _mesa_lookup_shader_program_err(ctx, program, api_name); 2845 if (!shProg) 2846 return; 2847 2848 stage = _mesa_shader_enum_to_shader_stage(shadertype); 2849 if (!shProg->_LinkedShaders[stage]) { 2850 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2851 return; 2852 } 2853 resource_type = _mesa_shader_stage_to_subroutine(stage); 2854 _mesa_get_program_resource_name(shProg, resource_type, 2855 index, bufsize, 2856 length, name, api_name); 2857} 2858 2859GLvoid GLAPIENTRY 2860_mesa_UniformSubroutinesuiv(GLenum shadertype, GLsizei count, 2861 const GLuint *indices) 2862{ 2863 GET_CURRENT_CONTEXT(ctx); 2864 const char *api_name = "glUniformSubroutinesuiv"; 2865 gl_shader_stage stage; 2866 int i; 2867 2868 if (!_mesa_validate_shader_target(ctx, shadertype)) { 2869 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2870 return; 2871 } 2872 2873 stage = _mesa_shader_enum_to_shader_stage(shadertype); 2874 struct gl_program *p = ctx->_Shader->CurrentProgram[stage]; 2875 if (!p) { 2876 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2877 return; 2878 } 2879 2880 if (count != p->sh.NumSubroutineUniformRemapTable) { 2881 _mesa_error(ctx, GL_INVALID_VALUE, "%s", api_name); 2882 return; 2883 } 2884 2885 i = 0; 2886 bool flushed = false; 2887 do { 2888 struct gl_uniform_storage *uni = p->sh.SubroutineUniformRemapTable[i]; 2889 if (uni == NULL) { 2890 i++; 2891 continue; 2892 } 2893 2894 if (!flushed) { 2895 _mesa_flush_vertices_for_uniforms(ctx, uni); 2896 flushed = true; 2897 } 2898 2899 int uni_count = uni->array_elements ? uni->array_elements : 1; 2900 int j, k, f; 2901 2902 for (j = i; j < i + uni_count; j++) { 2903 struct gl_subroutine_function *subfn = NULL; 2904 if (indices[j] > p->sh.MaxSubroutineFunctionIndex) { 2905 _mesa_error(ctx, GL_INVALID_VALUE, "%s", api_name); 2906 return; 2907 } 2908 2909 for (f = 0; f < p->sh.NumSubroutineFunctions; f++) { 2910 if (p->sh.SubroutineFunctions[f].index == indices[j]) 2911 subfn = &p->sh.SubroutineFunctions[f]; 2912 } 2913 2914 if (!subfn) { 2915 continue; 2916 } 2917 2918 for (k = 0; k < subfn->num_compat_types; k++) { 2919 if (subfn->types[k] == uni->type) 2920 break; 2921 } 2922 if (k == subfn->num_compat_types) { 2923 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2924 return; 2925 } 2926 2927 ctx->SubroutineIndex[p->info.stage].IndexPtr[j] = indices[j]; 2928 } 2929 i += uni_count; 2930 } while(i < count); 2931} 2932 2933 2934GLvoid GLAPIENTRY 2935_mesa_GetUniformSubroutineuiv(GLenum shadertype, GLint location, 2936 GLuint *params) 2937{ 2938 GET_CURRENT_CONTEXT(ctx); 2939 const char *api_name = "glGetUniformSubroutineuiv"; 2940 gl_shader_stage stage; 2941 2942 if (!_mesa_validate_shader_target(ctx, shadertype)) { 2943 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2944 return; 2945 } 2946 2947 stage = _mesa_shader_enum_to_shader_stage(shadertype); 2948 struct gl_program *p = ctx->_Shader->CurrentProgram[stage]; 2949 if (!p) { 2950 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2951 return; 2952 } 2953 2954 if (location >= p->sh.NumSubroutineUniformRemapTable) { 2955 _mesa_error(ctx, GL_INVALID_VALUE, "%s", api_name); 2956 return; 2957 } 2958 2959 *params = ctx->SubroutineIndex[p->info.stage].IndexPtr[location]; 2960} 2961 2962 2963GLvoid GLAPIENTRY 2964_mesa_GetProgramStageiv(GLuint program, GLenum shadertype, 2965 GLenum pname, GLint *values) 2966{ 2967 GET_CURRENT_CONTEXT(ctx); 2968 const char *api_name = "glGetProgramStageiv"; 2969 struct gl_shader_program *shProg; 2970 struct gl_linked_shader *sh; 2971 gl_shader_stage stage; 2972 2973 if (!_mesa_validate_shader_target(ctx, shadertype)) { 2974 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 2975 return; 2976 } 2977 2978 shProg = _mesa_lookup_shader_program_err(ctx, program, api_name); 2979 if (!shProg) 2980 return; 2981 2982 stage = _mesa_shader_enum_to_shader_stage(shadertype); 2983 sh = shProg->_LinkedShaders[stage]; 2984 2985 /* ARB_shader_subroutine doesn't ask the program to be linked, or list any 2986 * INVALID_OPERATION in the case of not be linked. 2987 * 2988 * And for some pnames, like GL_ACTIVE_SUBROUTINE_UNIFORMS, you can ask the 2989 * same info using other specs (ARB_program_interface_query), without the 2990 * need of the program to be linked, being the value for that case 0. 2991 * 2992 * But at the same time, some other methods require the program to be 2993 * linked for pname related to locations, so it would be inconsistent to 2994 * not do the same here. So we are: 2995 * * Return GL_INVALID_OPERATION if not linked only for locations. 2996 * * Setting a default value of 0, to be returned if not linked. 2997 */ 2998 if (!sh) { 2999 values[0] = 0; 3000 if (pname == GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS) { 3001 _mesa_error(ctx, GL_INVALID_OPERATION, "%s", api_name); 3002 } 3003 return; 3004 } 3005 3006 struct gl_program *p = sh->Program; 3007 switch (pname) { 3008 case GL_ACTIVE_SUBROUTINES: 3009 values[0] = p->sh.NumSubroutineFunctions; 3010 break; 3011 case GL_ACTIVE_SUBROUTINE_UNIFORM_LOCATIONS: 3012 values[0] = p->sh.NumSubroutineUniformRemapTable; 3013 break; 3014 case GL_ACTIVE_SUBROUTINE_UNIFORMS: 3015 values[0] = p->sh.NumSubroutineUniforms; 3016 break; 3017 case GL_ACTIVE_SUBROUTINE_MAX_LENGTH: 3018 { 3019 unsigned i; 3020 GLint max_len = 0; 3021 GLenum resource_type; 3022 struct gl_program_resource *res; 3023 3024 resource_type = _mesa_shader_stage_to_subroutine(stage); 3025 for (i = 0; i < p->sh.NumSubroutineFunctions; i++) { 3026 res = _mesa_program_resource_find_index(shProg, resource_type, i); 3027 if (res) { 3028 const GLint len = strlen(_mesa_program_resource_name(res)) + 1; 3029 if (len > max_len) 3030 max_len = len; 3031 } 3032 } 3033 values[0] = max_len; 3034 break; 3035 } 3036 case GL_ACTIVE_SUBROUTINE_UNIFORM_MAX_LENGTH: 3037 { 3038 unsigned i; 3039 GLint max_len = 0; 3040 GLenum resource_type; 3041 struct gl_program_resource *res; 3042 3043 resource_type = _mesa_shader_stage_to_subroutine_uniform(stage); 3044 for (i = 0; i < p->sh.NumSubroutineUniformRemapTable; i++) { 3045 res = _mesa_program_resource_find_index(shProg, resource_type, i); 3046 if (res) { 3047 const GLint len = strlen(_mesa_program_resource_name(res)) + 1 3048 + ((_mesa_program_resource_array_size(res) != 0) ? 3 : 0); 3049 3050 if (len > max_len) 3051 max_len = len; 3052 } 3053 } 3054 values[0] = max_len; 3055 break; 3056 } 3057 default: 3058 _mesa_error(ctx, GL_INVALID_ENUM, "%s", api_name); 3059 values[0] = -1; 3060 break; 3061 } 3062} 3063 3064static int 3065find_compat_subroutine(struct gl_program *p, const struct glsl_type *type) 3066{ 3067 int i, j; 3068 3069 for (i = 0; i < p->sh.NumSubroutineFunctions; i++) { 3070 struct gl_subroutine_function *fn = &p->sh.SubroutineFunctions[i]; 3071 for (j = 0; j < fn->num_compat_types; j++) { 3072 if (fn->types[j] == type) 3073 return i; 3074 } 3075 } 3076 return 0; 3077} 3078 3079static void 3080_mesa_shader_write_subroutine_index(struct gl_context *ctx, 3081 struct gl_program *p) 3082{ 3083 int i, j; 3084 3085 if (p->sh.NumSubroutineUniformRemapTable == 0) 3086 return; 3087 3088 i = 0; 3089 do { 3090 struct gl_uniform_storage *uni = p->sh.SubroutineUniformRemapTable[i]; 3091 int uni_count; 3092 int val; 3093 3094 if (!uni) { 3095 i++; 3096 continue; 3097 } 3098 3099 uni_count = uni->array_elements ? uni->array_elements : 1; 3100 for (j = 0; j < uni_count; j++) { 3101 val = ctx->SubroutineIndex[p->info.stage].IndexPtr[i + j]; 3102 memcpy(&uni->storage[j], &val, sizeof(int)); 3103 } 3104 3105 _mesa_propagate_uniforms_to_driver_storage(uni, 0, uni_count); 3106 i += uni_count; 3107 } while(i < p->sh.NumSubroutineUniformRemapTable); 3108} 3109 3110void 3111_mesa_shader_write_subroutine_indices(struct gl_context *ctx, 3112 gl_shader_stage stage) 3113{ 3114 if (ctx->_Shader->CurrentProgram[stage]) 3115 _mesa_shader_write_subroutine_index(ctx, 3116 ctx->_Shader->CurrentProgram[stage]); 3117} 3118 3119void 3120_mesa_program_init_subroutine_defaults(struct gl_context *ctx, 3121 struct gl_program *p) 3122{ 3123 assert(p); 3124 3125 struct gl_subroutine_index_binding *binding = &ctx->SubroutineIndex[p->info.stage]; 3126 if (binding->NumIndex != p->sh.NumSubroutineUniformRemapTable) { 3127 binding->IndexPtr = realloc(binding->IndexPtr, 3128 p->sh.NumSubroutineUniformRemapTable * (sizeof(GLuint))); 3129 binding->NumIndex = p->sh.NumSubroutineUniformRemapTable; 3130 } 3131 3132 for (int i = 0; i < p->sh.NumSubroutineUniformRemapTable; i++) { 3133 struct gl_uniform_storage *uni = p->sh.SubroutineUniformRemapTable[i]; 3134 3135 if (!uni) 3136 continue; 3137 3138 binding->IndexPtr[i] = find_compat_subroutine(p, uni->type); 3139 } 3140} 3141