Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygennvprogram.c
Go to the documentation of this file.
00001 /* 00002 * Mesa 3-D graphics library 00003 * Version: 6.5.2 00004 * 00005 * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 00006 * 00007 * Permission is hereby granted, free of charge, to any person obtaining a 00008 * copy of this software and associated documentation files (the "Software"), 00009 * to deal in the Software without restriction, including without limitation 00010 * the rights to use, copy, modify, merge, publish, distribute, sublicense, 00011 * and/or sell copies of the Software, and to permit persons to whom the 00012 * Software is furnished to do so, subject to the following conditions: 00013 * 00014 * The above copyright notice and this permission notice shall be included 00015 * in all copies or substantial portions of the Software. 00016 * 00017 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 00018 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 00019 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 00020 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 00021 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 00022 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00023 */ 00024 00031 /* 00032 * Regarding GL_NV_fragment/vertex_program, GL_NV_vertex_program1_1, etc: 00033 * 00034 * Portions of this software may use or implement intellectual 00035 * property owned and licensed by NVIDIA Corporation. NVIDIA disclaims 00036 * any and all warranties with respect to such intellectual property, 00037 * including any use thereof or modifications thereto. 00038 */ 00039 00040 #include "main/glheader.h" 00041 #include "main/context.h" 00042 #include "main/hash.h" 00043 #include "main/imports.h" 00044 #include "main/macros.h" 00045 #include "program.h" 00046 #include "prog_parameter.h" 00047 #include "prog_instruction.h" 00048 #include "nvfragparse.h" 00049 #include "nvvertparse.h" 00050 #include "nvprogram.h" 00051 00052 00053 00058 void GLAPIENTRY 00059 _mesa_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params) 00060 { 00061 struct gl_vertex_program *vprog; 00062 GET_CURRENT_CONTEXT(ctx); 00063 ASSERT_OUTSIDE_BEGIN_END(ctx); 00064 00065 if (target != GL_VERTEX_STATE_PROGRAM_NV) { 00066 _mesa_error(ctx, GL_INVALID_ENUM, "glExecuteProgramNV"); 00067 return; 00068 } 00069 00070 FLUSH_VERTICES(ctx, _NEW_PROGRAM); 00071 00072 vprog = (struct gl_vertex_program *) _mesa_lookup_program(ctx, id); 00073 00074 if (!vprog || vprog->Base.Target != GL_VERTEX_STATE_PROGRAM_NV) { 00075 _mesa_error(ctx, GL_INVALID_OPERATION, "glExecuteProgramNV"); 00076 return; 00077 } 00078 00079 _mesa_problem(ctx, "glExecuteProgramNV() not supported"); 00080 } 00081 00082 00088 GLboolean GLAPIENTRY 00089 _mesa_AreProgramsResidentNV(GLsizei n, const GLuint *ids, 00090 GLboolean *residences) 00091 { 00092 GLint i, j; 00093 GLboolean allResident = GL_TRUE; 00094 GET_CURRENT_CONTEXT(ctx); 00095 ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 00096 00097 if (n < 0) { 00098 _mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV(n)"); 00099 return GL_FALSE; 00100 } 00101 00102 for (i = 0; i < n; i++) { 00103 const struct gl_program *prog; 00104 if (ids[i] == 0) { 00105 _mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV"); 00106 return GL_FALSE; 00107 } 00108 prog = _mesa_lookup_program(ctx, ids[i]); 00109 if (!prog) { 00110 _mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV"); 00111 return GL_FALSE; 00112 } 00113 if (prog->Resident) { 00114 if (!allResident) 00115 residences[i] = GL_TRUE; 00116 } 00117 else { 00118 if (allResident) { 00119 allResident = GL_FALSE; 00120 for (j = 0; j < i; j++) 00121 residences[j] = GL_TRUE; 00122 } 00123 residences[i] = GL_FALSE; 00124 } 00125 } 00126 00127 return allResident; 00128 } 00129 00130 00135 void GLAPIENTRY 00136 _mesa_RequestResidentProgramsNV(GLsizei n, const GLuint *ids) 00137 { 00138 GLint i; 00139 GET_CURRENT_CONTEXT(ctx); 00140 ASSERT_OUTSIDE_BEGIN_END(ctx); 00141 00142 if (n < 0) { 00143 _mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(n)"); 00144 return; 00145 } 00146 00147 /* just error checking for now */ 00148 for (i = 0; i < n; i++) { 00149 struct gl_program *prog; 00150 00151 if (ids[i] == 0) { 00152 _mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(id)"); 00153 return; 00154 } 00155 00156 prog = _mesa_lookup_program(ctx, ids[i]); 00157 if (!prog) { 00158 _mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(id)"); 00159 return; 00160 } 00161 00162 /* XXX this is really a hardware thing we should hook out */ 00163 prog->Resident = GL_TRUE; 00164 } 00165 } 00166 00167 00173 void GLAPIENTRY 00174 _mesa_GetProgramParameterfvNV(GLenum target, GLuint index, 00175 GLenum pname, GLfloat *params) 00176 { 00177 GET_CURRENT_CONTEXT(ctx); 00178 ASSERT_OUTSIDE_BEGIN_END(ctx); 00179 00180 if (target == GL_VERTEX_PROGRAM_NV) { 00181 if (pname == GL_PROGRAM_PARAMETER_NV) { 00182 if (index < MAX_NV_VERTEX_PROGRAM_PARAMS) { 00183 COPY_4V(params, ctx->VertexProgram.Parameters[index]); 00184 } 00185 else { 00186 _mesa_error(ctx, GL_INVALID_VALUE, 00187 "glGetProgramParameterfvNV(index)"); 00188 return; 00189 } 00190 } 00191 else { 00192 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterfvNV(pname)"); 00193 return; 00194 } 00195 } 00196 else { 00197 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterfvNV(target)"); 00198 return; 00199 } 00200 } 00201 00202 00208 void GLAPIENTRY 00209 _mesa_GetProgramParameterdvNV(GLenum target, GLuint index, 00210 GLenum pname, GLdouble *params) 00211 { 00212 GET_CURRENT_CONTEXT(ctx); 00213 ASSERT_OUTSIDE_BEGIN_END(ctx); 00214 00215 if (target == GL_VERTEX_PROGRAM_NV) { 00216 if (pname == GL_PROGRAM_PARAMETER_NV) { 00217 if (index < MAX_NV_VERTEX_PROGRAM_PARAMS) { 00218 COPY_4V(params, ctx->VertexProgram.Parameters[index]); 00219 } 00220 else { 00221 _mesa_error(ctx, GL_INVALID_VALUE, 00222 "glGetProgramParameterdvNV(index)"); 00223 return; 00224 } 00225 } 00226 else { 00227 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterdvNV(pname)"); 00228 return; 00229 } 00230 } 00231 else { 00232 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterdvNV(target)"); 00233 return; 00234 } 00235 } 00236 00237 00243 void GLAPIENTRY 00244 _mesa_GetProgramivNV(GLuint id, GLenum pname, GLint *params) 00245 { 00246 struct gl_program *prog; 00247 GET_CURRENT_CONTEXT(ctx); 00248 00249 if (!ctx->_CurrentProgram) 00250 ASSERT_OUTSIDE_BEGIN_END(ctx); 00251 00252 prog = _mesa_lookup_program(ctx, id); 00253 if (!prog) { 00254 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramivNV"); 00255 return; 00256 } 00257 00258 switch (pname) { 00259 case GL_PROGRAM_TARGET_NV: 00260 *params = prog->Target; 00261 return; 00262 case GL_PROGRAM_LENGTH_NV: 00263 *params = prog->String ?(GLint)_mesa_strlen((char *) prog->String) : 0; 00264 return; 00265 case GL_PROGRAM_RESIDENT_NV: 00266 *params = prog->Resident; 00267 return; 00268 default: 00269 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramivNV(pname)"); 00270 return; 00271 } 00272 } 00273 00274 00280 void GLAPIENTRY 00281 _mesa_GetProgramStringNV(GLuint id, GLenum pname, GLubyte *program) 00282 { 00283 struct gl_program *prog; 00284 GET_CURRENT_CONTEXT(ctx); 00285 00286 if (!ctx->_CurrentProgram) 00287 ASSERT_OUTSIDE_BEGIN_END(ctx); 00288 00289 if (pname != GL_PROGRAM_STRING_NV) { 00290 _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramStringNV(pname)"); 00291 return; 00292 } 00293 00294 prog = _mesa_lookup_program(ctx, id); 00295 if (!prog) { 00296 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramStringNV"); 00297 return; 00298 } 00299 00300 if (prog->String) { 00301 MEMCPY(program, prog->String, _mesa_strlen((char *) prog->String)); 00302 } 00303 else { 00304 program[0] = 0; 00305 } 00306 } 00307 00308 00314 void GLAPIENTRY 00315 _mesa_GetTrackMatrixivNV(GLenum target, GLuint address, 00316 GLenum pname, GLint *params) 00317 { 00318 GET_CURRENT_CONTEXT(ctx); 00319 ASSERT_OUTSIDE_BEGIN_END(ctx); 00320 00321 if (target == GL_VERTEX_PROGRAM_NV 00322 && ctx->Extensions.NV_vertex_program) { 00323 GLuint i; 00324 00325 if ((address & 0x3) || address >= MAX_NV_VERTEX_PROGRAM_PARAMS) { 00326 _mesa_error(ctx, GL_INVALID_VALUE, "glGetTrackMatrixivNV(address)"); 00327 return; 00328 } 00329 00330 i = address / 4; 00331 00332 switch (pname) { 00333 case GL_TRACK_MATRIX_NV: 00334 params[0] = (GLint) ctx->VertexProgram.TrackMatrix[i]; 00335 return; 00336 case GL_TRACK_MATRIX_TRANSFORM_NV: 00337 params[0] = (GLint) ctx->VertexProgram.TrackMatrixTransform[i]; 00338 return; 00339 default: 00340 _mesa_error(ctx, GL_INVALID_ENUM, "glGetTrackMatrixivNV"); 00341 return; 00342 } 00343 } 00344 else { 00345 _mesa_error(ctx, GL_INVALID_ENUM, "glGetTrackMatrixivNV"); 00346 return; 00347 } 00348 } 00349 00350 00356 void GLAPIENTRY 00357 _mesa_GetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble *params) 00358 { 00359 GET_CURRENT_CONTEXT(ctx); 00360 ASSERT_OUTSIDE_BEGIN_END(ctx); 00361 00362 if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 00363 _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)"); 00364 return; 00365 } 00366 00367 switch (pname) { 00368 case GL_ATTRIB_ARRAY_SIZE_NV: 00369 params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Size; 00370 break; 00371 case GL_ATTRIB_ARRAY_STRIDE_NV: 00372 params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Stride; 00373 break; 00374 case GL_ATTRIB_ARRAY_TYPE_NV: 00375 params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Type; 00376 break; 00377 case GL_CURRENT_ATTRIB_NV: 00378 if (index == 0) { 00379 _mesa_error(ctx, GL_INVALID_OPERATION, 00380 "glGetVertexAttribdvNV(index == 0)"); 00381 return; 00382 } 00383 FLUSH_CURRENT(ctx, 0); 00384 COPY_4V(params, ctx->Current.Attrib[index]); 00385 break; 00386 default: 00387 _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV"); 00388 return; 00389 } 00390 } 00391 00397 void GLAPIENTRY 00398 _mesa_GetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat *params) 00399 { 00400 GET_CURRENT_CONTEXT(ctx); 00401 ASSERT_OUTSIDE_BEGIN_END(ctx); 00402 00403 if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 00404 _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)"); 00405 return; 00406 } 00407 00408 switch (pname) { 00409 case GL_ATTRIB_ARRAY_SIZE_NV: 00410 params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].Size; 00411 break; 00412 case GL_ATTRIB_ARRAY_STRIDE_NV: 00413 params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].Stride; 00414 break; 00415 case GL_ATTRIB_ARRAY_TYPE_NV: 00416 params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].Type; 00417 break; 00418 case GL_CURRENT_ATTRIB_NV: 00419 if (index == 0) { 00420 _mesa_error(ctx, GL_INVALID_OPERATION, 00421 "glGetVertexAttribfvNV(index == 0)"); 00422 return; 00423 } 00424 FLUSH_CURRENT(ctx, 0); 00425 COPY_4V(params, ctx->Current.Attrib[index]); 00426 break; 00427 default: 00428 _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV"); 00429 return; 00430 } 00431 } 00432 00438 void GLAPIENTRY 00439 _mesa_GetVertexAttribivNV(GLuint index, GLenum pname, GLint *params) 00440 { 00441 GET_CURRENT_CONTEXT(ctx); 00442 ASSERT_OUTSIDE_BEGIN_END(ctx); 00443 00444 if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 00445 _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)"); 00446 return; 00447 } 00448 00449 switch (pname) { 00450 case GL_ATTRIB_ARRAY_SIZE_NV: 00451 params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Size; 00452 break; 00453 case GL_ATTRIB_ARRAY_STRIDE_NV: 00454 params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Stride; 00455 break; 00456 case GL_ATTRIB_ARRAY_TYPE_NV: 00457 params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Type; 00458 break; 00459 case GL_CURRENT_ATTRIB_NV: 00460 if (index == 0) { 00461 _mesa_error(ctx, GL_INVALID_OPERATION, 00462 "glGetVertexAttribivNV(index == 0)"); 00463 return; 00464 } 00465 FLUSH_CURRENT(ctx, 0); 00466 params[0] = (GLint) ctx->Current.Attrib[index][0]; 00467 params[1] = (GLint) ctx->Current.Attrib[index][1]; 00468 params[2] = (GLint) ctx->Current.Attrib[index][2]; 00469 params[3] = (GLint) ctx->Current.Attrib[index][3]; 00470 break; 00471 case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB: 00472 if (!ctx->Extensions.ARB_vertex_buffer_object) { 00473 _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV"); 00474 return; 00475 } 00476 params[0] = ctx->Array.ArrayObj->VertexAttrib[index].BufferObj->Name; 00477 break; 00478 default: 00479 _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV"); 00480 return; 00481 } 00482 } 00483 00484 00490 void GLAPIENTRY 00491 _mesa_GetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid **pointer) 00492 { 00493 GET_CURRENT_CONTEXT(ctx); 00494 ASSERT_OUTSIDE_BEGIN_END(ctx); 00495 00496 if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 00497 _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerNV(index)"); 00498 return; 00499 } 00500 00501 if (pname != GL_ATTRIB_ARRAY_POINTER_NV) { 00502 _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerNV(pname)"); 00503 return; 00504 } 00505 00506 *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[index].Ptr; 00507 } 00508 00509 00510 00515 void GLAPIENTRY 00516 _mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len, 00517 const GLubyte *program) 00518 { 00519 struct gl_program *prog; 00520 GET_CURRENT_CONTEXT(ctx); 00521 ASSERT_OUTSIDE_BEGIN_END(ctx); 00522 00523 if (id == 0) { 00524 _mesa_error(ctx, GL_INVALID_VALUE, "glLoadProgramNV(id)"); 00525 return; 00526 } 00527 00528 if (len < 0) { 00529 _mesa_error(ctx, GL_INVALID_VALUE, "glLoadProgramNV(len)"); 00530 return; 00531 } 00532 00533 FLUSH_VERTICES(ctx, _NEW_PROGRAM); 00534 00535 prog = _mesa_lookup_program(ctx, id); 00536 00537 if (prog && prog->Target != 0 && prog->Target != target) { 00538 _mesa_error(ctx, GL_INVALID_OPERATION, "glLoadProgramNV(target)"); 00539 return; 00540 } 00541 00542 if ((target == GL_VERTEX_PROGRAM_NV || 00543 target == GL_VERTEX_STATE_PROGRAM_NV) 00544 && ctx->Extensions.NV_vertex_program) { 00545 struct gl_vertex_program *vprog = (struct gl_vertex_program *) prog; 00546 if (!vprog || prog == &_mesa_DummyProgram) { 00547 vprog = (struct gl_vertex_program *) 00548 ctx->Driver.NewProgram(ctx, target, id); 00549 if (!vprog) { 00550 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV"); 00551 return; 00552 } 00553 _mesa_HashInsert(ctx->Shared->Programs, id, vprog); 00554 } 00555 _mesa_parse_nv_vertex_program(ctx, target, program, len, vprog); 00556 } 00557 else if (target == GL_FRAGMENT_PROGRAM_NV 00558 && ctx->Extensions.NV_fragment_program) { 00559 struct gl_fragment_program *fprog = (struct gl_fragment_program *) prog; 00560 if (!fprog || prog == &_mesa_DummyProgram) { 00561 fprog = (struct gl_fragment_program *) 00562 ctx->Driver.NewProgram(ctx, target, id); 00563 if (!fprog) { 00564 _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV"); 00565 return; 00566 } 00567 _mesa_HashInsert(ctx->Shared->Programs, id, fprog); 00568 } 00569 _mesa_parse_nv_fragment_program(ctx, target, program, len, fprog); 00570 } 00571 else { 00572 _mesa_error(ctx, GL_INVALID_ENUM, "glLoadProgramNV(target)"); 00573 } 00574 } 00575 00576 00577 00582 void GLAPIENTRY 00583 _mesa_ProgramParameters4dvNV(GLenum target, GLuint index, 00584 GLuint num, const GLdouble *params) 00585 { 00586 GET_CURRENT_CONTEXT(ctx); 00587 ASSERT_OUTSIDE_BEGIN_END(ctx); 00588 00589 if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) { 00590 GLuint i; 00591 if (index + num > MAX_NV_VERTEX_PROGRAM_PARAMS) { 00592 _mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameters4dvNV"); 00593 return; 00594 } 00595 for (i = 0; i < num; i++) { 00596 ctx->VertexProgram.Parameters[index + i][0] = (GLfloat) params[0]; 00597 ctx->VertexProgram.Parameters[index + i][1] = (GLfloat) params[1]; 00598 ctx->VertexProgram.Parameters[index + i][2] = (GLfloat) params[2]; 00599 ctx->VertexProgram.Parameters[index + i][3] = (GLfloat) params[3]; 00600 params += 4; 00601 }; 00602 } 00603 else { 00604 _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameters4dvNV"); 00605 return; 00606 } 00607 } 00608 00609 00614 void GLAPIENTRY 00615 _mesa_ProgramParameters4fvNV(GLenum target, GLuint index, 00616 GLuint num, const GLfloat *params) 00617 { 00618 GET_CURRENT_CONTEXT(ctx); 00619 ASSERT_OUTSIDE_BEGIN_END(ctx); 00620 00621 if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) { 00622 GLuint i; 00623 if (index + num > MAX_NV_VERTEX_PROGRAM_PARAMS) { 00624 _mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameters4fvNV"); 00625 return; 00626 } 00627 for (i = 0; i < num; i++) { 00628 COPY_4V(ctx->VertexProgram.Parameters[index + i], params); 00629 params += 4; 00630 } 00631 } 00632 else { 00633 _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameters4fvNV"); 00634 return; 00635 } 00636 } 00637 00638 00639 00644 void GLAPIENTRY 00645 _mesa_TrackMatrixNV(GLenum target, GLuint address, 00646 GLenum matrix, GLenum transform) 00647 { 00648 GET_CURRENT_CONTEXT(ctx); 00649 ASSERT_OUTSIDE_BEGIN_END(ctx); 00650 00651 FLUSH_VERTICES(ctx, _NEW_PROGRAM); 00652 00653 if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) { 00654 if (address & 0x3) { 00655 /* addr must be multiple of four */ 00656 _mesa_error(ctx, GL_INVALID_VALUE, "glTrackMatrixNV(address)"); 00657 return; 00658 } 00659 00660 switch (matrix) { 00661 case GL_NONE: 00662 case GL_MODELVIEW: 00663 case GL_PROJECTION: 00664 case GL_TEXTURE: 00665 case GL_COLOR: 00666 case GL_MODELVIEW_PROJECTION_NV: 00667 case GL_MATRIX0_NV: 00668 case GL_MATRIX1_NV: 00669 case GL_MATRIX2_NV: 00670 case GL_MATRIX3_NV: 00671 case GL_MATRIX4_NV: 00672 case GL_MATRIX5_NV: 00673 case GL_MATRIX6_NV: 00674 case GL_MATRIX7_NV: 00675 /* OK, fallthrough */ 00676 break; 00677 default: 00678 _mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(matrix)"); 00679 return; 00680 } 00681 00682 switch (transform) { 00683 case GL_IDENTITY_NV: 00684 case GL_INVERSE_NV: 00685 case GL_TRANSPOSE_NV: 00686 case GL_INVERSE_TRANSPOSE_NV: 00687 /* OK, fallthrough */ 00688 break; 00689 default: 00690 _mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(transform)"); 00691 return; 00692 } 00693 00694 ctx->VertexProgram.TrackMatrix[address / 4] = matrix; 00695 ctx->VertexProgram.TrackMatrixTransform[address / 4] = transform; 00696 } 00697 else { 00698 _mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(target)"); 00699 return; 00700 } 00701 } 00702 00703 00704 void GLAPIENTRY 00705 _mesa_ProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte *name, 00706 GLfloat x, GLfloat y, GLfloat z, GLfloat w) 00707 { 00708 struct gl_program *prog; 00709 struct gl_fragment_program *fragProg; 00710 GLfloat *v; 00711 00712 GET_CURRENT_CONTEXT(ctx); 00713 ASSERT_OUTSIDE_BEGIN_END(ctx); 00714 00715 FLUSH_VERTICES(ctx, _NEW_PROGRAM); 00716 00717 prog = _mesa_lookup_program(ctx, id); 00718 if (!prog || prog->Target != GL_FRAGMENT_PROGRAM_NV) { 00719 _mesa_error(ctx, GL_INVALID_OPERATION, "glProgramNamedParameterNV"); 00720 return; 00721 } 00722 00723 if (len <= 0) { 00724 _mesa_error(ctx, GL_INVALID_VALUE, "glProgramNamedParameterNV(len)"); 00725 return; 00726 } 00727 00728 fragProg = (struct gl_fragment_program *) prog; 00729 v = _mesa_lookup_parameter_value(fragProg->Base.Parameters, len, 00730 (char *) name); 00731 if (v) { 00732 v[0] = x; 00733 v[1] = y; 00734 v[2] = z; 00735 v[3] = w; 00736 return; 00737 } 00738 00739 _mesa_error(ctx, GL_INVALID_VALUE, "glProgramNamedParameterNV(name)"); 00740 } 00741 00742 00743 void GLAPIENTRY 00744 _mesa_ProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte *name, 00745 const float v[]) 00746 { 00747 _mesa_ProgramNamedParameter4fNV(id, len, name, v[0], v[1], v[2], v[3]); 00748 } 00749 00750 00751 void GLAPIENTRY 00752 _mesa_ProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte *name, 00753 GLdouble x, GLdouble y, GLdouble z, GLdouble w) 00754 { 00755 _mesa_ProgramNamedParameter4fNV(id, len, name, (GLfloat)x, (GLfloat)y, 00756 (GLfloat)z, (GLfloat)w); 00757 } 00758 00759 00760 void GLAPIENTRY 00761 _mesa_ProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte *name, 00762 const double v[]) 00763 { 00764 _mesa_ProgramNamedParameter4fNV(id, len, name, 00765 (GLfloat)v[0], (GLfloat)v[1], 00766 (GLfloat)v[2], (GLfloat)v[3]); 00767 } 00768 00769 00770 void GLAPIENTRY 00771 _mesa_GetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte *name, 00772 GLfloat *params) 00773 { 00774 struct gl_program *prog; 00775 struct gl_fragment_program *fragProg; 00776 const GLfloat *v; 00777 00778 GET_CURRENT_CONTEXT(ctx); 00779 00780 if (!ctx->_CurrentProgram) 00781 ASSERT_OUTSIDE_BEGIN_END(ctx); 00782 00783 prog = _mesa_lookup_program(ctx, id); 00784 if (!prog || prog->Target != GL_FRAGMENT_PROGRAM_NV) { 00785 _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramNamedParameterNV"); 00786 return; 00787 } 00788 00789 if (len <= 0) { 00790 _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramNamedParameterNV"); 00791 return; 00792 } 00793 00794 fragProg = (struct gl_fragment_program *) prog; 00795 v = _mesa_lookup_parameter_value(fragProg->Base.Parameters, 00796 len, (char *) name); 00797 if (v) { 00798 params[0] = v[0]; 00799 params[1] = v[1]; 00800 params[2] = v[2]; 00801 params[3] = v[3]; 00802 return; 00803 } 00804 00805 _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramNamedParameterNV"); 00806 } 00807 00808 00809 void GLAPIENTRY 00810 _mesa_GetProgramNamedParameterdvNV(GLuint id, GLsizei len, const GLubyte *name, 00811 GLdouble *params) 00812 { 00813 GLfloat floatParams[4]; 00814 _mesa_GetProgramNamedParameterfvNV(id, len, name, floatParams); 00815 COPY_4V(params, floatParams); 00816 } Generated on Sat May 26 2012 04:19:21 for ReactOS by
1.7.6.1
|