ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

nvprogram.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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.