pipelineobj.c revision af69d88d
1/* 2 * Mesa 3-D graphics library 3 * 4 * Copyright © 2013 Gregory Hainaut <gregory.hainaut@gmail.com> 5 * 6 * Permission is hereby granted, free of charge, to any person obtaining a 7 * copy of this software and associated documentation files (the "Software"), 8 * to deal in the Software without restriction, including without limitation 9 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10 * and/or sell copies of the Software, and to permit persons to whom the 11 * Software is furnished to do so, subject to the following conditions: 12 * 13 * The above copyright notice and this permission notice (including the next 14 * paragraph) shall be included in all copies or substantial portions of the 15 * Software. 16 * 17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * 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 OTHER 21 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 22 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS 23 * IN THE SOFTWARE. 24 */ 25 26/** 27 * \file pipelineobj.c 28 * \author Hainaut Gregory <gregory.hainaut@gmail.com> 29 * 30 * Implementation of pipeline object related API functions. Based on 31 * GL_ARB_separate_shader_objects extension. 32 */ 33 34#include "main/glheader.h" 35#include "main/context.h" 36#include "main/dispatch.h" 37#include "main/enums.h" 38#include "main/hash.h" 39#include "main/mtypes.h" 40#include "main/pipelineobj.h" 41#include "main/shaderapi.h" 42#include "main/shaderobj.h" 43#include "main/transformfeedback.h" 44#include "main/uniforms.h" 45#include "program/program.h" 46#include "program/prog_parameter.h" 47#include "util/ralloc.h" 48#include <stdbool.h> 49#include "../glsl/glsl_parser_extras.h" 50#include "../glsl/ir_uniform.h" 51 52/** 53 * Delete a pipeline object. 54 */ 55void 56_mesa_delete_pipeline_object(struct gl_context *ctx, 57 struct gl_pipeline_object *obj) 58{ 59 unsigned i; 60 61 _mesa_reference_shader_program(ctx, &obj->_CurrentFragmentProgram, NULL); 62 63 for (i = 0; i < MESA_SHADER_STAGES; i++) 64 _mesa_reference_shader_program(ctx, &obj->CurrentProgram[i], NULL); 65 66 _mesa_reference_shader_program(ctx, &obj->ActiveProgram, NULL); 67 mtx_destroy(&obj->Mutex); 68 ralloc_free(obj); 69} 70 71/** 72 * Allocate and initialize a new pipeline object. 73 */ 74static struct gl_pipeline_object * 75_mesa_new_pipeline_object(struct gl_context *ctx, GLuint name) 76{ 77 struct gl_pipeline_object *obj = rzalloc(NULL, struct gl_pipeline_object); 78 if (obj) { 79 obj->Name = name; 80 mtx_init(&obj->Mutex, mtx_plain); 81 obj->RefCount = 1; 82 obj->Flags = _mesa_get_shader_flags(); 83 obj->InfoLog = NULL; 84 } 85 86 return obj; 87} 88 89/** 90 * Initialize pipeline object state for given context. 91 */ 92void 93_mesa_init_pipeline(struct gl_context *ctx) 94{ 95 ctx->Pipeline.Objects = _mesa_NewHashTable(); 96 97 ctx->Pipeline.Current = NULL; 98 99 /* Install a default Pipeline */ 100 ctx->Pipeline.Default = _mesa_new_pipeline_object(ctx, 0); 101 _mesa_reference_pipeline_object(ctx, &ctx->_Shader, ctx->Pipeline.Default); 102} 103 104 105/** 106 * Callback for deleting a pipeline object. Called by _mesa_HashDeleteAll(). 107 */ 108static void 109delete_pipelineobj_cb(GLuint id, void *data, void *userData) 110{ 111 struct gl_pipeline_object *obj = (struct gl_pipeline_object *) data; 112 struct gl_context *ctx = (struct gl_context *) userData; 113 _mesa_delete_pipeline_object(ctx, obj); 114} 115 116 117/** 118 * Free pipeline state for given context. 119 */ 120void 121_mesa_free_pipeline_data(struct gl_context *ctx) 122{ 123 _mesa_reference_pipeline_object(ctx, &ctx->_Shader, NULL); 124 125 _mesa_HashDeleteAll(ctx->Pipeline.Objects, delete_pipelineobj_cb, ctx); 126 _mesa_DeleteHashTable(ctx->Pipeline.Objects); 127 128 _mesa_delete_pipeline_object(ctx, ctx->Pipeline.Default); 129} 130 131/** 132 * Look up the pipeline object for the given ID. 133 * 134 * \returns 135 * Either a pointer to the pipeline object with the specified ID or \c NULL for 136 * a non-existent ID. The spec defines ID 0 as being technically 137 * non-existent. 138 */ 139static inline struct gl_pipeline_object * 140lookup_pipeline_object(struct gl_context *ctx, GLuint id) 141{ 142 if (id == 0) 143 return NULL; 144 else 145 return (struct gl_pipeline_object *) 146 _mesa_HashLookup(ctx->Pipeline.Objects, id); 147} 148 149/** 150 * Add the given pipeline object to the pipeline object pool. 151 */ 152static void 153save_pipeline_object(struct gl_context *ctx, struct gl_pipeline_object *obj) 154{ 155 if (obj->Name > 0) { 156 _mesa_HashInsert(ctx->Pipeline.Objects, obj->Name, obj); 157 } 158} 159 160/** 161 * Remove the given pipeline object from the pipeline object pool. 162 * Do not deallocate the pipeline object though. 163 */ 164static void 165remove_pipeline_object(struct gl_context *ctx, struct gl_pipeline_object *obj) 166{ 167 if (obj->Name > 0) { 168 _mesa_HashRemove(ctx->Pipeline.Objects, obj->Name); 169 } 170} 171 172/** 173 * Set ptr to obj w/ reference counting. 174 * Note: this should only be called from the _mesa_reference_pipeline_object() 175 * inline function. 176 */ 177void 178_mesa_reference_pipeline_object_(struct gl_context *ctx, 179 struct gl_pipeline_object **ptr, 180 struct gl_pipeline_object *obj) 181{ 182 assert(*ptr != obj); 183 184 if (*ptr) { 185 /* Unreference the old pipeline object */ 186 GLboolean deleteFlag = GL_FALSE; 187 struct gl_pipeline_object *oldObj = *ptr; 188 189 mtx_lock(&oldObj->Mutex); 190 ASSERT(oldObj->RefCount > 0); 191 oldObj->RefCount--; 192 deleteFlag = (oldObj->RefCount == 0); 193 mtx_unlock(&oldObj->Mutex); 194 195 if (deleteFlag) { 196 _mesa_delete_pipeline_object(ctx, oldObj); 197 } 198 199 *ptr = NULL; 200 } 201 ASSERT(!*ptr); 202 203 if (obj) { 204 /* reference new pipeline object */ 205 mtx_lock(&obj->Mutex); 206 if (obj->RefCount == 0) { 207 /* this pipeline's being deleted (look just above) */ 208 /* Not sure this can ever really happen. Warn if it does. */ 209 _mesa_problem(NULL, "referencing deleted pipeline object"); 210 *ptr = NULL; 211 } 212 else { 213 obj->RefCount++; 214 *ptr = obj; 215 } 216 mtx_unlock(&obj->Mutex); 217 } 218} 219 220/** 221 * Bound program to severals stages of the pipeline 222 */ 223void GLAPIENTRY 224_mesa_UseProgramStages(GLuint pipeline, GLbitfield stages, GLuint program) 225{ 226 GET_CURRENT_CONTEXT(ctx); 227 228 struct gl_pipeline_object *pipe = lookup_pipeline_object(ctx, pipeline); 229 struct gl_shader_program *shProg = NULL; 230 GLbitfield any_valid_stages; 231 232 if (!pipe) { 233 _mesa_error(ctx, GL_INVALID_OPERATION, "glUseProgramStages(pipeline)"); 234 return; 235 } 236 237 /* Object is created by any Pipeline call but glGenProgramPipelines, 238 * glIsProgramPipeline and GetProgramPipelineInfoLog 239 */ 240 pipe->EverBound = GL_TRUE; 241 242 /* Section 2.11.4 (Program Pipeline Objects) of the OpenGL 4.1 spec says: 243 * 244 * "If stages is not the special value ALL_SHADER_BITS, and has a bit 245 * set that is not recognized, the error INVALID_VALUE is generated." 246 * 247 * NOT YET SUPPORTED: 248 * GL_TESS_CONTROL_SHADER_BIT 249 * GL_TESS_EVALUATION_SHADER_BIT 250 */ 251 any_valid_stages = GL_VERTEX_SHADER_BIT | GL_FRAGMENT_SHADER_BIT; 252 if (_mesa_has_geometry_shaders(ctx)) 253 any_valid_stages |= GL_GEOMETRY_SHADER_BIT; 254 255 if (stages != GL_ALL_SHADER_BITS && (stages & ~any_valid_stages) != 0) { 256 _mesa_error(ctx, GL_INVALID_VALUE, "glUseProgramStages(Stages)"); 257 return; 258 } 259 260 /* Section 2.17.2 (Transform Feedback Primitive Capture) of the OpenGL 4.1 261 * spec says: 262 * 263 * "The error INVALID_OPERATION is generated: 264 * 265 * ... 266 * 267 * - by UseProgramStages if the program pipeline object it refers 268 * to is current and the current transform feedback object is 269 * active and not paused; 270 */ 271 if (ctx->_Shader == pipe) { 272 if (_mesa_is_xfb_active_and_unpaused(ctx)) { 273 _mesa_error(ctx, GL_INVALID_OPERATION, 274 "glUseProgramStages(transform feedback active)"); 275 return; 276 } 277 } 278 279 if (program) { 280 shProg = _mesa_lookup_shader_program_err(ctx, program, 281 "glUseProgramStages"); 282 if (shProg == NULL) 283 return; 284 285 /* Section 2.11.4 (Program Pipeline Objects) of the OpenGL 4.1 spec 286 * says: 287 * 288 * "If the program object named by program was linked without the 289 * PROGRAM_SEPARABLE parameter set, or was not linked successfully, 290 * the error INVALID_OPERATION is generated and the corresponding 291 * shader stages in the pipeline program pipeline object are not 292 * modified." 293 */ 294 if (!shProg->LinkStatus) { 295 _mesa_error(ctx, GL_INVALID_OPERATION, 296 "glUseProgramStages(program not linked)"); 297 return; 298 } 299 300 if (!shProg->SeparateShader) { 301 _mesa_error(ctx, GL_INVALID_OPERATION, 302 "glUseProgramStages(program wasn't linked with the " 303 "PROGRAM_SEPARABLE flag)"); 304 return; 305 } 306 } 307 308 /* Enable individual stages from the program as requested by the 309 * application. If there is no shader for a requested stage in the 310 * program, _mesa_use_shader_program will enable fixed-function processing 311 * as dictated by the spec. 312 * 313 * Section 2.11.4 (Program Pipeline Objects) of the OpenGL 4.1 spec 314 * says: 315 * 316 * "If UseProgramStages is called with program set to zero or with a 317 * program object that contains no executable code for the given 318 * stages, it is as if the pipeline object has no programmable stage 319 * configured for the indicated shader stages." 320 */ 321 if ((stages & GL_VERTEX_SHADER_BIT) != 0) 322 _mesa_use_shader_program(ctx, GL_VERTEX_SHADER, shProg, pipe); 323 324 if ((stages & GL_FRAGMENT_SHADER_BIT) != 0) 325 _mesa_use_shader_program(ctx, GL_FRAGMENT_SHADER, shProg, pipe); 326 327 if ((stages & GL_GEOMETRY_SHADER_BIT) != 0) 328 _mesa_use_shader_program(ctx, GL_GEOMETRY_SHADER, shProg, pipe); 329} 330 331/** 332 * Use the named shader program for subsequent glUniform calls (if pipeline 333 * bound) 334 */ 335void GLAPIENTRY 336_mesa_ActiveShaderProgram(GLuint pipeline, GLuint program) 337{ 338 GET_CURRENT_CONTEXT(ctx); 339 struct gl_shader_program *shProg = NULL; 340 struct gl_pipeline_object *pipe = lookup_pipeline_object(ctx, pipeline); 341 342 if (program != 0) { 343 shProg = _mesa_lookup_shader_program_err(ctx, program, 344 "glActiveShaderProgram(program)"); 345 if (shProg == NULL) 346 return; 347 } 348 349 if (!pipe) { 350 _mesa_error(ctx, GL_INVALID_OPERATION, "glActiveShaderProgram(pipeline)"); 351 return; 352 } 353 354 /* Object is created by any Pipeline call but glGenProgramPipelines, 355 * glIsProgramPipeline and GetProgramPipelineInfoLog 356 */ 357 pipe->EverBound = GL_TRUE; 358 359 if ((shProg != NULL) && !shProg->LinkStatus) { 360 _mesa_error(ctx, GL_INVALID_OPERATION, 361 "glActiveShaderProgram(program %u not linked)", shProg->Name); 362 return; 363 } 364 365 _mesa_reference_shader_program(ctx, &pipe->ActiveProgram, shProg); 366} 367 368/** 369 * Make program of the pipeline current 370 */ 371void GLAPIENTRY 372_mesa_BindProgramPipeline(GLuint pipeline) 373{ 374 GET_CURRENT_CONTEXT(ctx); 375 struct gl_pipeline_object *newObj = NULL; 376 377 /* Rebinding the same pipeline object: no change. 378 */ 379 if (ctx->_Shader->Name == pipeline) 380 return; 381 382 /* Section 2.17.2 (Transform Feedback Primitive Capture) of the OpenGL 4.1 383 * spec says: 384 * 385 * "The error INVALID_OPERATION is generated: 386 * 387 * ... 388 * 389 * - by BindProgramPipeline if the current transform feedback 390 * object is active and not paused; 391 */ 392 if (_mesa_is_xfb_active_and_unpaused(ctx)) { 393 _mesa_error(ctx, GL_INVALID_OPERATION, 394 "glBindProgramPipeline(transform feedback active)"); 395 return; 396 } 397 398 /* Get pointer to new pipeline object (newObj) 399 */ 400 if (pipeline) { 401 /* non-default pipeline object */ 402 newObj = lookup_pipeline_object(ctx, pipeline); 403 if (!newObj) { 404 _mesa_error(ctx, GL_INVALID_OPERATION, 405 "glBindProgramPipeline(non-gen name)"); 406 return; 407 } 408 409 /* Object is created by any Pipeline call but glGenProgramPipelines, 410 * glIsProgramPipeline and GetProgramPipelineInfoLog 411 */ 412 newObj->EverBound = GL_TRUE; 413 } 414 415 _mesa_bind_pipeline(ctx, newObj); 416} 417 418void 419_mesa_bind_pipeline(struct gl_context *ctx, 420 struct gl_pipeline_object *pipe) 421{ 422 /* First bind the Pipeline to pipeline binding point */ 423 _mesa_reference_pipeline_object(ctx, &ctx->Pipeline.Current, pipe); 424 425 /* Section 2.11.3 (Program Objects) of the OpenGL 4.1 spec says: 426 * 427 * "If there is a current program object established by UseProgram, 428 * that program is considered current for all stages. Otherwise, if 429 * there is a bound program pipeline object (see section 2.11.4), the 430 * program bound to the appropriate stage of the pipeline object is 431 * considered current." 432 */ 433 if (&ctx->Shader != ctx->_Shader) { 434 if (pipe != NULL) { 435 /* Bound the pipeline to the current program and 436 * restore the pipeline state 437 */ 438 _mesa_reference_pipeline_object(ctx, &ctx->_Shader, pipe); 439 } else { 440 /* Unbind the pipeline */ 441 _mesa_reference_pipeline_object(ctx, &ctx->_Shader, 442 ctx->Pipeline.Default); 443 } 444 445 FLUSH_VERTICES(ctx, _NEW_PROGRAM | _NEW_PROGRAM_CONSTANTS); 446 447 if (ctx->Driver.UseProgram) 448 ctx->Driver.UseProgram(ctx, NULL); 449 } 450} 451 452/** 453 * Delete a set of pipeline objects. 454 * 455 * \param n Number of pipeline objects to delete. 456 * \param ids pipeline of \c n pipeline object IDs. 457 */ 458void GLAPIENTRY 459_mesa_DeleteProgramPipelines(GLsizei n, const GLuint *pipelines) 460{ 461 GET_CURRENT_CONTEXT(ctx); 462 GLsizei i; 463 464 if (n < 0) { 465 _mesa_error(ctx, GL_INVALID_VALUE, "glDeleteProgramPipelines(n<0)"); 466 return; 467 } 468 469 for (i = 0; i < n; i++) { 470 struct gl_pipeline_object *obj = 471 lookup_pipeline_object(ctx, pipelines[i]); 472 473 if (obj) { 474 ASSERT(obj->Name == pipelines[i]); 475 476 /* If the pipeline object is currently bound, the spec says "If an 477 * object that is currently bound is deleted, the binding for that 478 * object reverts to zero and no program pipeline object becomes 479 * current." 480 */ 481 if (obj == ctx->Pipeline.Current) { 482 _mesa_BindProgramPipeline(0); 483 } 484 485 /* The ID is immediately freed for re-use */ 486 remove_pipeline_object(ctx, obj); 487 488 /* Unreference the pipeline object. 489 * If refcount hits zero, the object will be deleted. 490 */ 491 _mesa_reference_pipeline_object(ctx, &obj, NULL); 492 } 493 } 494} 495 496/** 497 * Generate a set of unique pipeline object IDs and store them in \c pipelines. 498 * \param n Number of IDs to generate. 499 * \param pipelines pipeline of \c n locations to store the IDs. 500 */ 501void GLAPIENTRY 502_mesa_GenProgramPipelines(GLsizei n, GLuint *pipelines) 503{ 504 GET_CURRENT_CONTEXT(ctx); 505 506 GLuint first; 507 GLint i; 508 509 if (n < 0) { 510 _mesa_error(ctx, GL_INVALID_VALUE, "glGenProgramPipelines(n<0)"); 511 return; 512 } 513 514 if (!pipelines) { 515 return; 516 } 517 518 first = _mesa_HashFindFreeKeyBlock(ctx->Pipeline.Objects, n); 519 520 for (i = 0; i < n; i++) { 521 struct gl_pipeline_object *obj; 522 GLuint name = first + i; 523 524 obj = _mesa_new_pipeline_object(ctx, name); 525 if (!obj) { 526 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glGenProgramPipelines"); 527 return; 528 } 529 530 save_pipeline_object(ctx, obj); 531 pipelines[i] = first + i; 532 } 533 534} 535 536/** 537 * Determine if ID is the name of an pipeline object. 538 * 539 * \param id ID of the potential pipeline object. 540 * \return \c GL_TRUE if \c id is the name of a pipeline object, 541 * \c GL_FALSE otherwise. 542 */ 543GLboolean GLAPIENTRY 544_mesa_IsProgramPipeline(GLuint pipeline) 545{ 546 GET_CURRENT_CONTEXT(ctx); 547 548 struct gl_pipeline_object *obj = lookup_pipeline_object(ctx, pipeline); 549 if (obj == NULL) 550 return GL_FALSE; 551 552 return obj->EverBound; 553} 554 555/** 556 * glGetProgramPipelineiv() - get pipeline shader state. 557 */ 558void GLAPIENTRY 559_mesa_GetProgramPipelineiv(GLuint pipeline, GLenum pname, GLint *params) 560{ 561 GET_CURRENT_CONTEXT(ctx); 562 struct gl_pipeline_object *pipe = lookup_pipeline_object(ctx, pipeline); 563 564 /* Are geometry shaders available in this context? 565 */ 566 const bool has_gs = _mesa_has_geometry_shaders(ctx); 567 568 if (!pipe) { 569 _mesa_error(ctx, GL_INVALID_OPERATION, 570 "glGetProgramPipelineiv(pipeline)"); 571 return; 572 } 573 574 /* Object is created by any Pipeline call but glGenProgramPipelines, 575 * glIsProgramPipeline and GetProgramPipelineInfoLog 576 */ 577 pipe->EverBound = GL_TRUE; 578 579 switch (pname) { 580 case GL_ACTIVE_PROGRAM: 581 *params = pipe->ActiveProgram ? pipe->ActiveProgram->Name : 0; 582 return; 583 case GL_INFO_LOG_LENGTH: 584 *params = pipe->InfoLog ? strlen(pipe->InfoLog) + 1 : 0; 585 return; 586 case GL_VALIDATE_STATUS: 587 *params = pipe->Validated; 588 return; 589 case GL_VERTEX_SHADER: 590 *params = pipe->CurrentProgram[MESA_SHADER_VERTEX] 591 ? pipe->CurrentProgram[MESA_SHADER_VERTEX]->Name : 0; 592 return; 593 case GL_TESS_EVALUATION_SHADER: 594 /* NOT YET SUPPORTED */ 595 break; 596 case GL_TESS_CONTROL_SHADER: 597 /* NOT YET SUPPORTED */ 598 break; 599 case GL_GEOMETRY_SHADER: 600 if (!has_gs) 601 break; 602 *params = pipe->CurrentProgram[MESA_SHADER_GEOMETRY] 603 ? pipe->CurrentProgram[MESA_SHADER_GEOMETRY]->Name : 0; 604 return; 605 case GL_FRAGMENT_SHADER: 606 *params = pipe->CurrentProgram[MESA_SHADER_FRAGMENT] 607 ? pipe->CurrentProgram[MESA_SHADER_FRAGMENT]->Name : 0; 608 return; 609 default: 610 break; 611 } 612 613 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramPipelineiv(pname=%s)", 614 _mesa_lookup_enum_by_nr(pname)); 615} 616 617/** 618 * Determines whether every stage in a linked program is active in the 619 * specified pipeline. 620 */ 621static bool 622program_stages_all_active(struct gl_pipeline_object *pipe, 623 const struct gl_shader_program *prog) 624{ 625 unsigned i; 626 bool status = true; 627 628 if (!prog) 629 return true; 630 631 for (i = 0; i < MESA_SHADER_STAGES; i++) { 632 if (prog->_LinkedShaders[i]) { 633 if (pipe->CurrentProgram[i]) { 634 if (prog->Name != pipe->CurrentProgram[i]->Name) { 635 status = false; 636 } 637 } else { 638 status = false; 639 } 640 } 641 } 642 643 if (!status) { 644 pipe->InfoLog = ralloc_asprintf(pipe, 645 "Program %d is not active for all " 646 "shaders that was linked", 647 prog->Name); 648 } 649 650 return status; 651} 652 653extern GLboolean 654_mesa_validate_program_pipeline(struct gl_context* ctx, 655 struct gl_pipeline_object *pipe, 656 GLboolean IsBound) 657{ 658 unsigned i; 659 660 pipe->Validated = GL_FALSE; 661 662 /* Release and reset the info log. 663 */ 664 if (pipe->InfoLog != NULL) 665 ralloc_free(pipe->InfoLog); 666 667 pipe->InfoLog = NULL; 668 669 /* Section 2.11.11 (Shader Execution), subheading "Validation," of the 670 * OpenGL 4.1 spec says: 671 * 672 * "[INVALID_OPERATION] is generated by any command that transfers 673 * vertices to the GL if: 674 * 675 * - A program object is active for at least one, but not all of 676 * the shader stages that were present when the program was 677 * linked." 678 * 679 * For each possible program stage, verify that the program bound to that 680 * stage has all of its stages active. In other words, if the program 681 * bound to the vertex stage also has a fragment shader, the fragment 682 * shader must also be bound to the fragment stage. 683 */ 684 for (i = 0; i < MESA_SHADER_STAGES; i++) { 685 if (!program_stages_all_active(pipe, pipe->CurrentProgram[i])) { 686 goto err; 687 } 688 } 689 690 /* Section 2.11.11 (Shader Execution), subheading "Validation," of the 691 * OpenGL 4.1 spec says: 692 * 693 * "[INVALID_OPERATION] is generated by any command that transfers 694 * vertices to the GL if: 695 * 696 * ... 697 * 698 * - One program object is active for at least two shader stages 699 * and a second program is active for a shader stage between two 700 * stages for which the first program was active." 701 * 702 * Without Tesselation, the only case where this can occur is the geometry 703 * shader between the fragment shader and vertex shader. 704 */ 705 if (pipe->CurrentProgram[MESA_SHADER_GEOMETRY] 706 && pipe->CurrentProgram[MESA_SHADER_FRAGMENT] 707 && pipe->CurrentProgram[MESA_SHADER_VERTEX]) { 708 if (pipe->CurrentProgram[MESA_SHADER_VERTEX]->Name == pipe->CurrentProgram[MESA_SHADER_FRAGMENT]->Name && 709 pipe->CurrentProgram[MESA_SHADER_GEOMETRY]->Name != pipe->CurrentProgram[MESA_SHADER_VERTEX]->Name) { 710 pipe->InfoLog = 711 ralloc_asprintf(pipe, 712 "Program %d is active for geometry stage between " 713 "two stages for which another program %d is " 714 "active", 715 pipe->CurrentProgram[MESA_SHADER_GEOMETRY]->Name, 716 pipe->CurrentProgram[MESA_SHADER_VERTEX]->Name); 717 goto err; 718 } 719 } 720 721 /* Section 2.11.11 (Shader Execution), subheading "Validation," of the 722 * OpenGL 4.1 spec says: 723 * 724 * "[INVALID_OPERATION] is generated by any command that transfers 725 * vertices to the GL if: 726 * 727 * ... 728 * 729 * - There is an active program for tessellation control, 730 * tessellation evaluation, or geometry stages with corresponding 731 * executable shader, but there is no active program with 732 * executable vertex shader." 733 */ 734 if (!pipe->CurrentProgram[MESA_SHADER_VERTEX] 735 && pipe->CurrentProgram[MESA_SHADER_GEOMETRY]) { 736 pipe->InfoLog = ralloc_strdup(pipe, "Program lacks a vertex shader"); 737 goto err; 738 } 739 740 /* Section 2.11.11 (Shader Execution), subheading "Validation," of the 741 * OpenGL 4.1 spec says: 742 * 743 * "[INVALID_OPERATION] is generated by any command that transfers 744 * vertices to the GL if: 745 * 746 * ... 747 * 748 * - There is no current program object specified by UseProgram, 749 * there is a current program pipeline object, and the current 750 * program for any shader stage has been relinked since being 751 * applied to the pipeline object via UseProgramStages with the 752 * PROGRAM_SEPARABLE parameter set to FALSE. 753 */ 754 for (i = 0; i < MESA_SHADER_STAGES; i++) { 755 if (pipe->CurrentProgram[i] && !pipe->CurrentProgram[i]->SeparateShader) { 756 pipe->InfoLog = ralloc_asprintf(pipe, 757 "Program %d was relinked without " 758 "PROGRAM_SEPARABLE state", 759 pipe->CurrentProgram[i]->Name); 760 goto err; 761 } 762 } 763 764 /* Section 2.11.11 (Shader Execution), subheading "Validation," of the 765 * OpenGL 4.1 spec says: 766 * 767 * "[INVALID_OPERATION] is generated by any command that transfers 768 * vertices to the GL if: 769 * 770 * ... 771 * 772 * - Any two active samplers in the current program object are of 773 * different types, but refer to the same texture image unit. 774 * 775 * - The number of active samplers in the program exceeds the 776 * maximum number of texture image units allowed." 777 */ 778 if (!_mesa_sampler_uniforms_pipeline_are_valid(pipe)) 779 goto err; 780 781 pipe->Validated = GL_TRUE; 782 return GL_TRUE; 783 784err: 785 if (IsBound) 786 _mesa_error(ctx, GL_INVALID_OPERATION, 787 "glValidateProgramPipeline failed to validate the pipeline"); 788 789 return GL_FALSE; 790} 791 792/** 793 * Check compatibility of pipeline's program 794 */ 795void GLAPIENTRY 796_mesa_ValidateProgramPipeline(GLuint pipeline) 797{ 798 GET_CURRENT_CONTEXT(ctx); 799 800 struct gl_pipeline_object *pipe = lookup_pipeline_object(ctx, pipeline); 801 802 if (!pipe) { 803 _mesa_error(ctx, GL_INVALID_OPERATION, 804 "glValidateProgramPipeline(pipeline)"); 805 return; 806 } 807 808 _mesa_validate_program_pipeline(ctx, pipe, 809 (ctx->_Shader->Name == pipe->Name)); 810} 811 812void GLAPIENTRY 813_mesa_GetProgramPipelineInfoLog(GLuint pipeline, GLsizei bufSize, 814 GLsizei *length, GLchar *infoLog) 815{ 816 GET_CURRENT_CONTEXT(ctx); 817 818 struct gl_pipeline_object *pipe = lookup_pipeline_object(ctx, pipeline); 819 820 if (!pipe) { 821 _mesa_error(ctx, GL_INVALID_VALUE, 822 "glGetProgramPipelineInfoLog(pipeline)"); 823 return; 824 } 825 826 if (bufSize < 0) { 827 _mesa_error(ctx, GL_INVALID_VALUE, 828 "glGetProgramPipelineInfoLog(bufSize)"); 829 return; 830 } 831 832 if (pipe->InfoLog) 833 _mesa_copy_string(infoLog, bufSize, length, pipe->InfoLog); 834 else 835 *length = 0; 836} 837