nvprogram.c revision 120584a1e650c5c72c889666a82624af4f5df1c1
12861e737e84e4884109b9526ac645194ba892a74Michal Krol/*
22861e737e84e4884109b9526ac645194ba892a74Michal Krol * Mesa 3-D graphics library
3ebcedd2d8909cc00d8528d76d3a1990315f270eaBrian Paul * Version:  6.5.2
42861e737e84e4884109b9526ac645194ba892a74Michal Krol *
58a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul * Copyright (C) 1999-2006  Brian Paul   All Rights Reserved.
62861e737e84e4884109b9526ac645194ba892a74Michal Krol *
72861e737e84e4884109b9526ac645194ba892a74Michal Krol * Permission is hereby granted, free of charge, to any person obtaining a
82861e737e84e4884109b9526ac645194ba892a74Michal Krol * copy of this software and associated documentation files (the "Software"),
92861e737e84e4884109b9526ac645194ba892a74Michal Krol * to deal in the Software without restriction, including without limitation
102861e737e84e4884109b9526ac645194ba892a74Michal Krol * the rights to use, copy, modify, merge, publish, distribute, sublicense,
112861e737e84e4884109b9526ac645194ba892a74Michal Krol * and/or sell copies of the Software, and to permit persons to whom the
122861e737e84e4884109b9526ac645194ba892a74Michal Krol * Software is furnished to do so, subject to the following conditions:
132861e737e84e4884109b9526ac645194ba892a74Michal Krol *
142861e737e84e4884109b9526ac645194ba892a74Michal Krol * The above copyright notice and this permission notice shall be included
152861e737e84e4884109b9526ac645194ba892a74Michal Krol * in all copies or substantial portions of the Software.
162861e737e84e4884109b9526ac645194ba892a74Michal Krol *
172861e737e84e4884109b9526ac645194ba892a74Michal Krol * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
182861e737e84e4884109b9526ac645194ba892a74Michal Krol * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
192861e737e84e4884109b9526ac645194ba892a74Michal Krol * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
202861e737e84e4884109b9526ac645194ba892a74Michal Krol * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
212861e737e84e4884109b9526ac645194ba892a74Michal Krol * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
222861e737e84e4884109b9526ac645194ba892a74Michal Krol * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
232861e737e84e4884109b9526ac645194ba892a74Michal Krol */
242861e737e84e4884109b9526ac645194ba892a74Michal Krol
252861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
262861e737e84e4884109b9526ac645194ba892a74Michal Krol * \file nvprogram.c
272861e737e84e4884109b9526ac645194ba892a74Michal Krol * NVIDIA vertex/fragment program state management functions.
282861e737e84e4884109b9526ac645194ba892a74Michal Krol * \author Brian Paul
292861e737e84e4884109b9526ac645194ba892a74Michal Krol */
302861e737e84e4884109b9526ac645194ba892a74Michal Krol
312861e737e84e4884109b9526ac645194ba892a74Michal Krol/*
322861e737e84e4884109b9526ac645194ba892a74Michal Krol * Regarding GL_NV_fragment/vertex_program, GL_NV_vertex_program1_1, etc:
332861e737e84e4884109b9526ac645194ba892a74Michal Krol *
342861e737e84e4884109b9526ac645194ba892a74Michal Krol * Portions of this software may use or implement intellectual
352861e737e84e4884109b9526ac645194ba892a74Michal Krol * property owned and licensed by NVIDIA Corporation. NVIDIA disclaims
362861e737e84e4884109b9526ac645194ba892a74Michal Krol * any and all warranties with respect to such intellectual property,
372861e737e84e4884109b9526ac645194ba892a74Michal Krol * including any use thereof or modifications thereto.
382861e737e84e4884109b9526ac645194ba892a74Michal Krol */
392861e737e84e4884109b9526ac645194ba892a74Michal Krol
402861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "glheader.h"
412861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "context.h"
422861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "hash.h"
432861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "imports.h"
442861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "macros.h"
452861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "mtypes.h"
462861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "nvfragparse.h"
477e807510d8c3e88ee7ae6c697393201cf08f992fBrian Paul#include "program_instruction.h"
482861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "nvvertexec.h"
492861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "nvvertparse.h"
502861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "nvprogram.h"
512861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "program.h"
522861e737e84e4884109b9526ac645194ba892a74Michal Krol
532861e737e84e4884109b9526ac645194ba892a74Michal Krol
542861e737e84e4884109b9526ac645194ba892a74Michal Krol
552861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
562861e737e84e4884109b9526ac645194ba892a74Michal Krol * Execute a vertex state program.
572861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
582861e737e84e4884109b9526ac645194ba892a74Michal Krol */
592861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
602861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params)
612861e737e84e4884109b9526ac645194ba892a74Michal Krol{
62122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_vertex_program *vprog;
632861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
642861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
652861e737e84e4884109b9526ac645194ba892a74Michal Krol
662861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target != GL_VERTEX_STATE_PROGRAM_NV) {
672861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glExecuteProgramNV");
682861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
692861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
702861e737e84e4884109b9526ac645194ba892a74Michal Krol
712861e737e84e4884109b9526ac645194ba892a74Michal Krol   FLUSH_VERTICES(ctx, _NEW_PROGRAM);
722861e737e84e4884109b9526ac645194ba892a74Michal Krol
734d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul   vprog = (struct gl_vertex_program *) _mesa_lookup_program(ctx, id);
742861e737e84e4884109b9526ac645194ba892a74Michal Krol
752861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!vprog || vprog->Base.Target != GL_VERTEX_STATE_PROGRAM_NV) {
762861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glExecuteProgramNV");
772861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
782861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
792861e737e84e4884109b9526ac645194ba892a74Michal Krol
80ebcedd2d8909cc00d8528d76d3a1990315f270eaBrian Paul   _mesa_exec_vertex_state_program(ctx, vprog, params);
812861e737e84e4884109b9526ac645194ba892a74Michal Krol}
822861e737e84e4884109b9526ac645194ba892a74Michal Krol
832861e737e84e4884109b9526ac645194ba892a74Michal Krol
842861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
852861e737e84e4884109b9526ac645194ba892a74Michal Krol * Determine if a set of programs is resident in hardware.
862861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
872861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
882861e737e84e4884109b9526ac645194ba892a74Michal Krol */
8981968ec49d9e06be0e095fa0084aa61b68b23d75Brian PaulGLboolean GLAPIENTRY
9081968ec49d9e06be0e095fa0084aa61b68b23d75Brian Paul_mesa_AreProgramsResidentNV(GLsizei n, const GLuint *ids,
9181968ec49d9e06be0e095fa0084aa61b68b23d75Brian Paul                            GLboolean *residences)
922861e737e84e4884109b9526ac645194ba892a74Michal Krol{
932861e737e84e4884109b9526ac645194ba892a74Michal Krol   GLint i, j;
942861e737e84e4884109b9526ac645194ba892a74Michal Krol   GLboolean allResident = GL_TRUE;
952861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
962861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
972861e737e84e4884109b9526ac645194ba892a74Michal Krol
982861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (n < 0) {
992861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV(n)");
1002861e737e84e4884109b9526ac645194ba892a74Michal Krol      return GL_FALSE;
1012861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
1022861e737e84e4884109b9526ac645194ba892a74Michal Krol
1032861e737e84e4884109b9526ac645194ba892a74Michal Krol   for (i = 0; i < n; i++) {
104122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul      const struct gl_program *prog;
1052861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (ids[i] == 0) {
1062861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV");
1072861e737e84e4884109b9526ac645194ba892a74Michal Krol         return GL_FALSE;
1082861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1094d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul      prog = _mesa_lookup_program(ctx, ids[i]);
1102861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (!prog) {
1112861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV");
1122861e737e84e4884109b9526ac645194ba892a74Michal Krol         return GL_FALSE;
1132861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1142861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (prog->Resident) {
1152861e737e84e4884109b9526ac645194ba892a74Michal Krol	 if (!allResident)
1162861e737e84e4884109b9526ac645194ba892a74Michal Krol	    residences[i] = GL_TRUE;
1172861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1182861e737e84e4884109b9526ac645194ba892a74Michal Krol      else {
1192861e737e84e4884109b9526ac645194ba892a74Michal Krol         if (allResident) {
1202861e737e84e4884109b9526ac645194ba892a74Michal Krol	    allResident = GL_FALSE;
1212861e737e84e4884109b9526ac645194ba892a74Michal Krol	    for (j = 0; j < i; j++)
1222861e737e84e4884109b9526ac645194ba892a74Michal Krol	       residences[j] = GL_TRUE;
1232861e737e84e4884109b9526ac645194ba892a74Michal Krol	 }
1242861e737e84e4884109b9526ac645194ba892a74Michal Krol	 residences[i] = GL_FALSE;
1252861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1262861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
1272861e737e84e4884109b9526ac645194ba892a74Michal Krol
1282861e737e84e4884109b9526ac645194ba892a74Michal Krol   return allResident;
1292861e737e84e4884109b9526ac645194ba892a74Michal Krol}
1302861e737e84e4884109b9526ac645194ba892a74Michal Krol
1312861e737e84e4884109b9526ac645194ba892a74Michal Krol
1322861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
1332861e737e84e4884109b9526ac645194ba892a74Michal Krol * Request that a set of programs be resident in hardware.
1342861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
1352861e737e84e4884109b9526ac645194ba892a74Michal Krol */
1362861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
1372861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_RequestResidentProgramsNV(GLsizei n, const GLuint *ids)
1382861e737e84e4884109b9526ac645194ba892a74Michal Krol{
1392861e737e84e4884109b9526ac645194ba892a74Michal Krol   GLint i;
1402861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
1412861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
1422861e737e84e4884109b9526ac645194ba892a74Michal Krol
1432861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (n < 0) {
1442861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(n)");
1452861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
1462861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
1472861e737e84e4884109b9526ac645194ba892a74Michal Krol
1482861e737e84e4884109b9526ac645194ba892a74Michal Krol   /* just error checking for now */
1492861e737e84e4884109b9526ac645194ba892a74Michal Krol   for (i = 0; i < n; i++) {
150122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul      struct gl_program *prog;
1512861e737e84e4884109b9526ac645194ba892a74Michal Krol
1522861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (ids[i] == 0) {
1532861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(id)");
1542861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
1552861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1562861e737e84e4884109b9526ac645194ba892a74Michal Krol
1574d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul      prog = _mesa_lookup_program(ctx, ids[i]);
1582861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (!prog) {
1592861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(id)");
1602861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
1612861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1622861e737e84e4884109b9526ac645194ba892a74Michal Krol
1639ca83924848070d02a5ac2f0aa4e20444eec2183Brian Paul      /* XXX this is really a hardware thing we should hook out */
1642861e737e84e4884109b9526ac645194ba892a74Michal Krol      prog->Resident = GL_TRUE;
1652861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
1662861e737e84e4884109b9526ac645194ba892a74Michal Krol}
1672861e737e84e4884109b9526ac645194ba892a74Michal Krol
1682861e737e84e4884109b9526ac645194ba892a74Michal Krol
1692861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
1702861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a program parameter register.
1712861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
1722861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
1732861e737e84e4884109b9526ac645194ba892a74Michal Krol */
1742861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
1752861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetProgramParameterfvNV(GLenum target, GLuint index,
1762861e737e84e4884109b9526ac645194ba892a74Michal Krol                              GLenum pname, GLfloat *params)
1772861e737e84e4884109b9526ac645194ba892a74Michal Krol{
1782861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
1792861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
1802861e737e84e4884109b9526ac645194ba892a74Michal Krol
1812861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target == GL_VERTEX_PROGRAM_NV) {
1822861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (pname == GL_PROGRAM_PARAMETER_NV) {
1832861e737e84e4884109b9526ac645194ba892a74Michal Krol         if (index < MAX_NV_VERTEX_PROGRAM_PARAMS) {
1842861e737e84e4884109b9526ac645194ba892a74Michal Krol            COPY_4V(params, ctx->VertexProgram.Parameters[index]);
1852861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
1862861e737e84e4884109b9526ac645194ba892a74Michal Krol         else {
1872861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_INVALID_VALUE,
1882861e737e84e4884109b9526ac645194ba892a74Michal Krol                        "glGetProgramParameterfvNV(index)");
1892861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
1902861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
1912861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1922861e737e84e4884109b9526ac645194ba892a74Michal Krol      else {
1932861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterfvNV(pname)");
1942861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
1952861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1962861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
1972861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
1982861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterfvNV(target)");
1992861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
2002861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2012861e737e84e4884109b9526ac645194ba892a74Michal Krol}
2022861e737e84e4884109b9526ac645194ba892a74Michal Krol
2032861e737e84e4884109b9526ac645194ba892a74Michal Krol
2042861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
2052861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a program parameter register.
2062861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
2072861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
2082861e737e84e4884109b9526ac645194ba892a74Michal Krol */
2092861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
2102861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetProgramParameterdvNV(GLenum target, GLuint index,
2112861e737e84e4884109b9526ac645194ba892a74Michal Krol                              GLenum pname, GLdouble *params)
2122861e737e84e4884109b9526ac645194ba892a74Michal Krol{
2132861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
2142861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
2152861e737e84e4884109b9526ac645194ba892a74Michal Krol
2162861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target == GL_VERTEX_PROGRAM_NV) {
2172861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (pname == GL_PROGRAM_PARAMETER_NV) {
2182861e737e84e4884109b9526ac645194ba892a74Michal Krol         if (index < MAX_NV_VERTEX_PROGRAM_PARAMS) {
2192861e737e84e4884109b9526ac645194ba892a74Michal Krol            COPY_4V(params, ctx->VertexProgram.Parameters[index]);
2202861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
2212861e737e84e4884109b9526ac645194ba892a74Michal Krol         else {
2222861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_INVALID_VALUE,
2232861e737e84e4884109b9526ac645194ba892a74Michal Krol                        "glGetProgramParameterdvNV(index)");
2242861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
2252861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
2262861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
2272861e737e84e4884109b9526ac645194ba892a74Michal Krol      else {
2282861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterdvNV(pname)");
2292861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
2302861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
2312861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2322861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
2332861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterdvNV(target)");
2342861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
2352861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2362861e737e84e4884109b9526ac645194ba892a74Michal Krol}
2372861e737e84e4884109b9526ac645194ba892a74Michal Krol
2382861e737e84e4884109b9526ac645194ba892a74Michal Krol
2392861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
2402861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a program attribute.
2412861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
2422861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
2432861e737e84e4884109b9526ac645194ba892a74Michal Krol */
2442861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
2452861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetProgramivNV(GLuint id, GLenum pname, GLint *params)
2462861e737e84e4884109b9526ac645194ba892a74Michal Krol{
247122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program *prog;
2482861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
2492861e737e84e4884109b9526ac645194ba892a74Michal Krol
2502861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!ctx->_CurrentProgram)
2512861e737e84e4884109b9526ac645194ba892a74Michal Krol      ASSERT_OUTSIDE_BEGIN_END(ctx);
2522861e737e84e4884109b9526ac645194ba892a74Michal Krol
2534d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul   prog = _mesa_lookup_program(ctx, id);
2542861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!prog) {
2552861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramivNV");
2562861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
2572861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2582861e737e84e4884109b9526ac645194ba892a74Michal Krol
2592861e737e84e4884109b9526ac645194ba892a74Michal Krol   switch (pname) {
2602861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_PROGRAM_TARGET_NV:
2612861e737e84e4884109b9526ac645194ba892a74Michal Krol         *params = prog->Target;
2622861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
2632861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_PROGRAM_LENGTH_NV:
2646258b76c49f49a56a7c713914b798e80c6553b06Karl Schultz         *params = prog->String ?(GLint)_mesa_strlen((char *) prog->String) : 0;
2652861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
2662861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_PROGRAM_RESIDENT_NV:
2672861e737e84e4884109b9526ac645194ba892a74Michal Krol         *params = prog->Resident;
2682861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
2692861e737e84e4884109b9526ac645194ba892a74Michal Krol      default:
2702861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramivNV(pname)");
2712861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
2722861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2732861e737e84e4884109b9526ac645194ba892a74Michal Krol}
2742861e737e84e4884109b9526ac645194ba892a74Michal Krol
2752861e737e84e4884109b9526ac645194ba892a74Michal Krol
2762861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
2772861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get the program source code.
2782861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
2792861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
2802861e737e84e4884109b9526ac645194ba892a74Michal Krol */
2812861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
2822861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetProgramStringNV(GLuint id, GLenum pname, GLubyte *program)
2832861e737e84e4884109b9526ac645194ba892a74Michal Krol{
284122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program *prog;
2852861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
2862861e737e84e4884109b9526ac645194ba892a74Michal Krol
2872861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!ctx->_CurrentProgram)
2882861e737e84e4884109b9526ac645194ba892a74Michal Krol      ASSERT_OUTSIDE_BEGIN_END(ctx);
2892861e737e84e4884109b9526ac645194ba892a74Michal Krol
2902861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (pname != GL_PROGRAM_STRING_NV) {
2912861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramStringNV(pname)");
2922861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
2932861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2942861e737e84e4884109b9526ac645194ba892a74Michal Krol
2954d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul   prog = _mesa_lookup_program(ctx, id);
2962861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!prog) {
2972861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramStringNV");
2982861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
2992861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3002861e737e84e4884109b9526ac645194ba892a74Michal Krol
3012861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (prog->String) {
3022861e737e84e4884109b9526ac645194ba892a74Michal Krol      MEMCPY(program, prog->String, _mesa_strlen((char *) prog->String));
3032861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3042861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
3052861e737e84e4884109b9526ac645194ba892a74Michal Krol      program[0] = 0;
3062861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3072861e737e84e4884109b9526ac645194ba892a74Michal Krol}
3082861e737e84e4884109b9526ac645194ba892a74Michal Krol
3092861e737e84e4884109b9526ac645194ba892a74Michal Krol
3102861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
3112861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get matrix tracking information.
3122861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
3132861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
3142861e737e84e4884109b9526ac645194ba892a74Michal Krol */
3152861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
3162861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetTrackMatrixivNV(GLenum target, GLuint address,
3172861e737e84e4884109b9526ac645194ba892a74Michal Krol                         GLenum pname, GLint *params)
3182861e737e84e4884109b9526ac645194ba892a74Michal Krol{
3192861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
3202861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
3212861e737e84e4884109b9526ac645194ba892a74Michal Krol
3222861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target == GL_VERTEX_PROGRAM_NV
3232861e737e84e4884109b9526ac645194ba892a74Michal Krol       && ctx->Extensions.NV_vertex_program) {
3242861e737e84e4884109b9526ac645194ba892a74Michal Krol      GLuint i;
3252861e737e84e4884109b9526ac645194ba892a74Michal Krol
3262861e737e84e4884109b9526ac645194ba892a74Michal Krol      if ((address & 0x3) || address >= MAX_NV_VERTEX_PROGRAM_PARAMS) {
3272861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glGetTrackMatrixivNV(address)");
3282861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
3292861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
3302861e737e84e4884109b9526ac645194ba892a74Michal Krol
3312861e737e84e4884109b9526ac645194ba892a74Michal Krol      i = address / 4;
3322861e737e84e4884109b9526ac645194ba892a74Michal Krol
3332861e737e84e4884109b9526ac645194ba892a74Michal Krol      switch (pname) {
3342861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_TRACK_MATRIX_NV:
3352861e737e84e4884109b9526ac645194ba892a74Michal Krol            params[0] = (GLint) ctx->VertexProgram.TrackMatrix[i];
3362861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
3372861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_TRACK_MATRIX_TRANSFORM_NV:
3382861e737e84e4884109b9526ac645194ba892a74Michal Krol            params[0] = (GLint) ctx->VertexProgram.TrackMatrixTransform[i];
3392861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
3402861e737e84e4884109b9526ac645194ba892a74Michal Krol         default:
3412861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_INVALID_ENUM, "glGetTrackMatrixivNV");
3422861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
3432861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
3442861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3452861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
3462861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTrackMatrixivNV");
3472861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
3482861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3492861e737e84e4884109b9526ac645194ba892a74Michal Krol}
3502861e737e84e4884109b9526ac645194ba892a74Michal Krol
3512861e737e84e4884109b9526ac645194ba892a74Michal Krol
3522861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
3532861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a vertex (or vertex array) attribute.
3542861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
3552861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
3562861e737e84e4884109b9526ac645194ba892a74Michal Krol */
3572861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
3582861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble *params)
3592861e737e84e4884109b9526ac645194ba892a74Michal Krol{
3602861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
3612861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
3622861e737e84e4884109b9526ac645194ba892a74Michal Krol
363120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
3642861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)");
3652861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
3662861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3672861e737e84e4884109b9526ac645194ba892a74Michal Krol
3682861e737e84e4884109b9526ac645194ba892a74Michal Krol   switch (pname) {
3692861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_SIZE_NV:
370ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Size;
3712861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
3722861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_STRIDE_NV:
373ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Stride;
3742861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
3752861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_TYPE_NV:
376ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Type;
3772861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
3782861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_CURRENT_ATTRIB_NV:
379120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         if (index == 0) {
380120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            _mesa_error(ctx, GL_INVALID_OPERATION,
381120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul                        "glGetVertexAttribdvNV(index == 0)");
382120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            return;
383120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         }
3842861e737e84e4884109b9526ac645194ba892a74Michal Krol	 FLUSH_CURRENT(ctx, 0);
3852861e737e84e4884109b9526ac645194ba892a74Michal Krol         COPY_4V(params, ctx->Current.Attrib[index]);
3862861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
3872861e737e84e4884109b9526ac645194ba892a74Michal Krol      default:
3882861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
3892861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
3902861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3912861e737e84e4884109b9526ac645194ba892a74Michal Krol}
3922861e737e84e4884109b9526ac645194ba892a74Michal Krol
3932861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
3942861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a vertex (or vertex array) attribute.
3952861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
3962861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
3972861e737e84e4884109b9526ac645194ba892a74Michal Krol */
3982861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
3992861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat *params)
4002861e737e84e4884109b9526ac645194ba892a74Michal Krol{
4012861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
4022861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
4032861e737e84e4884109b9526ac645194ba892a74Michal Krol
404120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
4052861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)");
4062861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
4072861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
4082861e737e84e4884109b9526ac645194ba892a74Michal Krol
4092861e737e84e4884109b9526ac645194ba892a74Michal Krol   switch (pname) {
4102861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_SIZE_NV:
411ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick         params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].Size;
4122861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4132861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_STRIDE_NV:
414ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick         params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].Stride;
4152861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4162861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_TYPE_NV:
417ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick         params[0] = (GLfloat) ctx->Array.ArrayObj->VertexAttrib[index].Type;
4182861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4192861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_CURRENT_ATTRIB_NV:
420120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         if (index == 0) {
421120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            _mesa_error(ctx, GL_INVALID_OPERATION,
422120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul                        "glGetVertexAttribfvNV(index == 0)");
423120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            return;
424120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         }
4252861e737e84e4884109b9526ac645194ba892a74Michal Krol	 FLUSH_CURRENT(ctx, 0);
4262861e737e84e4884109b9526ac645194ba892a74Michal Krol         COPY_4V(params, ctx->Current.Attrib[index]);
4272861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4282861e737e84e4884109b9526ac645194ba892a74Michal Krol      default:
4292861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
4302861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
4312861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
4322861e737e84e4884109b9526ac645194ba892a74Michal Krol}
4332861e737e84e4884109b9526ac645194ba892a74Michal Krol
4342861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
4352861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a vertex (or vertex array) attribute.
4362861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
4372861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
4382861e737e84e4884109b9526ac645194ba892a74Michal Krol */
4392861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
4402861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetVertexAttribivNV(GLuint index, GLenum pname, GLint *params)
4412861e737e84e4884109b9526ac645194ba892a74Michal Krol{
4422861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
4432861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
4442861e737e84e4884109b9526ac645194ba892a74Michal Krol
445120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
4462861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)");
4472861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
4482861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
4492861e737e84e4884109b9526ac645194ba892a74Michal Krol
4502861e737e84e4884109b9526ac645194ba892a74Michal Krol   switch (pname) {
4512861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_SIZE_NV:
452ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Size;
4532861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4542861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_STRIDE_NV:
455ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Stride;
4562861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4572861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_TYPE_NV:
458ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].Type;
4592861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4602861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_CURRENT_ATTRIB_NV:
461120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         if (index == 0) {
462120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            _mesa_error(ctx, GL_INVALID_OPERATION,
463120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul                        "glGetVertexAttribivNV(index == 0)");
464120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            return;
465120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         }
4662861e737e84e4884109b9526ac645194ba892a74Michal Krol	 FLUSH_CURRENT(ctx, 0);
4672861e737e84e4884109b9526ac645194ba892a74Michal Krol         params[0] = (GLint) ctx->Current.Attrib[index][0];
4682861e737e84e4884109b9526ac645194ba892a74Michal Krol         params[1] = (GLint) ctx->Current.Attrib[index][1];
4692861e737e84e4884109b9526ac645194ba892a74Michal Krol         params[2] = (GLint) ctx->Current.Attrib[index][2];
4702861e737e84e4884109b9526ac645194ba892a74Michal Krol         params[3] = (GLint) ctx->Current.Attrib[index][3];
4712861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4722861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
4732861e737e84e4884109b9526ac645194ba892a74Michal Krol         if (!ctx->Extensions.ARB_vertex_buffer_object) {
4742861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
4752861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
4762861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
477ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick         params[0] = ctx->Array.ArrayObj->VertexAttrib[index].BufferObj->Name;
4782861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4792861e737e84e4884109b9526ac645194ba892a74Michal Krol      default:
4802861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
4812861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
4822861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
4832861e737e84e4884109b9526ac645194ba892a74Michal Krol}
4842861e737e84e4884109b9526ac645194ba892a74Michal Krol
4852861e737e84e4884109b9526ac645194ba892a74Michal Krol
4862861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
4872861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a vertex array attribute pointer.
4882861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
4892861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
4902861e737e84e4884109b9526ac645194ba892a74Michal Krol */
4912861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
4922861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid **pointer)
4932861e737e84e4884109b9526ac645194ba892a74Michal Krol{
4942861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
4952861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
4962861e737e84e4884109b9526ac645194ba892a74Michal Krol
4972861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
4982861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerNV(index)");
4992861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
5002861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
5012861e737e84e4884109b9526ac645194ba892a74Michal Krol
5022861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (pname != GL_ATTRIB_ARRAY_POINTER_NV) {
5032861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerNV(pname)");
5042861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
5052861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
5062861e737e84e4884109b9526ac645194ba892a74Michal Krol
507ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick   *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[index].Ptr;
5082861e737e84e4884109b9526ac645194ba892a74Michal Krol}
5092861e737e84e4884109b9526ac645194ba892a74Michal Krol
5102861e737e84e4884109b9526ac645194ba892a74Michal Krol
5112861e737e84e4884109b9526ac645194ba892a74Michal Krol
5122861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
5132861e737e84e4884109b9526ac645194ba892a74Michal Krol * Load/parse/compile a program.
5142861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
5152861e737e84e4884109b9526ac645194ba892a74Michal Krol */
5162861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
5172861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len,
5182861e737e84e4884109b9526ac645194ba892a74Michal Krol                    const GLubyte *program)
5192861e737e84e4884109b9526ac645194ba892a74Michal Krol{
520122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program *prog;
5212861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
5222861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
5232861e737e84e4884109b9526ac645194ba892a74Michal Krol
5242861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (id == 0) {
5252861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glLoadProgramNV(id)");
5262861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
5278a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul   }
5288a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul
5298a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul   if (len < 0) {
5308a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glLoadProgramNV(len)");
5318a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul      return;
5322861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
5332861e737e84e4884109b9526ac645194ba892a74Michal Krol
5342861e737e84e4884109b9526ac645194ba892a74Michal Krol   FLUSH_VERTICES(ctx, _NEW_PROGRAM);
5352861e737e84e4884109b9526ac645194ba892a74Michal Krol
5364d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul   prog = _mesa_lookup_program(ctx, id);
5372861e737e84e4884109b9526ac645194ba892a74Michal Krol
5382861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (prog && prog->Target != 0 && prog->Target != target) {
5392861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glLoadProgramNV(target)");
5402861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
5412861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
5422861e737e84e4884109b9526ac645194ba892a74Michal Krol
5432861e737e84e4884109b9526ac645194ba892a74Michal Krol   if ((target == GL_VERTEX_PROGRAM_NV ||
5442861e737e84e4884109b9526ac645194ba892a74Michal Krol        target == GL_VERTEX_STATE_PROGRAM_NV)
5452861e737e84e4884109b9526ac645194ba892a74Michal Krol       && ctx->Extensions.NV_vertex_program) {
546122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul      struct gl_vertex_program *vprog = (struct gl_vertex_program *) prog;
5479ca83924848070d02a5ac2f0aa4e20444eec2183Brian Paul      if (!vprog || prog == &_mesa_DummyProgram) {
548122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul         vprog = (struct gl_vertex_program *)
5490590786f8af98bb849cee11fffd51be7db04f1b5Brian Paul            ctx->Driver.NewProgram(ctx, target, id);
5502861e737e84e4884109b9526ac645194ba892a74Michal Krol         if (!vprog) {
5512861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV");
5522861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
5532861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
5542861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_HashInsert(ctx->Shared->Programs, id, vprog);
5552861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
5562861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_parse_nv_vertex_program(ctx, target, program, len, vprog);
5572861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
5582861e737e84e4884109b9526ac645194ba892a74Michal Krol   else if (target == GL_FRAGMENT_PROGRAM_NV
5592861e737e84e4884109b9526ac645194ba892a74Michal Krol            && ctx->Extensions.NV_fragment_program) {
560122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul      struct gl_fragment_program *fprog = (struct gl_fragment_program *) prog;
5619ca83924848070d02a5ac2f0aa4e20444eec2183Brian Paul      if (!fprog || prog == &_mesa_DummyProgram) {
562122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul         fprog = (struct gl_fragment_program *)
5630590786f8af98bb849cee11fffd51be7db04f1b5Brian Paul            ctx->Driver.NewProgram(ctx, target, id);
5642861e737e84e4884109b9526ac645194ba892a74Michal Krol         if (!fprog) {
5652861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV");
5662861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
5672861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
5682861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_HashInsert(ctx->Shared->Programs, id, fprog);
5692861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
5702861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_parse_nv_fragment_program(ctx, target, program, len, fprog);
5712861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
5722861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
5732861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glLoadProgramNV(target)");
5742861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
5752861e737e84e4884109b9526ac645194ba892a74Michal Krol}
5762861e737e84e4884109b9526ac645194ba892a74Michal Krol
5772861e737e84e4884109b9526ac645194ba892a74Michal Krol
5782861e737e84e4884109b9526ac645194ba892a74Michal Krol
5792861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
5802861e737e84e4884109b9526ac645194ba892a74Michal Krol * Set a program parameter register.
5812861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
5822861e737e84e4884109b9526ac645194ba892a74Michal Krol */
5832861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
5842861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramParameter4dNV(GLenum target, GLuint index,
5852861e737e84e4884109b9526ac645194ba892a74Michal Krol                           GLdouble x, GLdouble y, GLdouble z, GLdouble w)
5862861e737e84e4884109b9526ac645194ba892a74Michal Krol{
5872861e737e84e4884109b9526ac645194ba892a74Michal Krol   _mesa_ProgramParameter4fNV(target, index,
5882861e737e84e4884109b9526ac645194ba892a74Michal Krol		   	      (GLfloat)x, (GLfloat)y, (GLfloat)z, (GLfloat)w);
5892861e737e84e4884109b9526ac645194ba892a74Michal Krol}
5902861e737e84e4884109b9526ac645194ba892a74Michal Krol
5912861e737e84e4884109b9526ac645194ba892a74Michal Krol
5922861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
5932861e737e84e4884109b9526ac645194ba892a74Michal Krol * Set a program parameter register.
5942861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
5952861e737e84e4884109b9526ac645194ba892a74Michal Krol */
5962861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
5972861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramParameter4dvNV(GLenum target, GLuint index,
5982861e737e84e4884109b9526ac645194ba892a74Michal Krol                            const GLdouble *params)
5992861e737e84e4884109b9526ac645194ba892a74Michal Krol{
6002861e737e84e4884109b9526ac645194ba892a74Michal Krol   _mesa_ProgramParameter4fNV(target, index,
6012861e737e84e4884109b9526ac645194ba892a74Michal Krol                              (GLfloat)params[0], (GLfloat)params[1],
6022861e737e84e4884109b9526ac645194ba892a74Michal Krol			      (GLfloat)params[2], (GLfloat)params[3]);
6032861e737e84e4884109b9526ac645194ba892a74Michal Krol}
6042861e737e84e4884109b9526ac645194ba892a74Michal Krol
6052861e737e84e4884109b9526ac645194ba892a74Michal Krol
6062861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
6072861e737e84e4884109b9526ac645194ba892a74Michal Krol * Set a program parameter register.
6082861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
6092861e737e84e4884109b9526ac645194ba892a74Michal Krol */
6102861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
6112861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramParameter4fNV(GLenum target, GLuint index,
6122861e737e84e4884109b9526ac645194ba892a74Michal Krol                           GLfloat x, GLfloat y, GLfloat z, GLfloat w)
6132861e737e84e4884109b9526ac645194ba892a74Michal Krol{
6142861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
6152861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
6162861e737e84e4884109b9526ac645194ba892a74Michal Krol
6172861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) {
6182861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (index < MAX_NV_VERTEX_PROGRAM_PARAMS) {
6192861e737e84e4884109b9526ac645194ba892a74Michal Krol         FLUSH_VERTICES(ctx, _NEW_PROGRAM);
6202861e737e84e4884109b9526ac645194ba892a74Michal Krol         ASSIGN_4V(ctx->VertexProgram.Parameters[index], x, y, z, w);
6212861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
6222861e737e84e4884109b9526ac645194ba892a74Michal Krol      else {
6232861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameterNV(index)");
6242861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
6252861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
6262861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
6272861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
6282861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameterNV");
6292861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
6302861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
6312861e737e84e4884109b9526ac645194ba892a74Michal Krol}
6322861e737e84e4884109b9526ac645194ba892a74Michal Krol
6332861e737e84e4884109b9526ac645194ba892a74Michal Krol
6342861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
6352861e737e84e4884109b9526ac645194ba892a74Michal Krol * Set a program parameter register.
6362861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
6372861e737e84e4884109b9526ac645194ba892a74Michal Krol */
6382861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
6392861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramParameter4fvNV(GLenum target, GLuint index,
6402861e737e84e4884109b9526ac645194ba892a74Michal Krol                            const GLfloat *params)
6412861e737e84e4884109b9526ac645194ba892a74Michal Krol{
6422861e737e84e4884109b9526ac645194ba892a74Michal Krol   _mesa_ProgramParameter4fNV(target, index,
6432861e737e84e4884109b9526ac645194ba892a74Michal Krol                              params[0], params[1], params[2], params[3]);
6442861e737e84e4884109b9526ac645194ba892a74Michal Krol}
6452861e737e84e4884109b9526ac645194ba892a74Michal Krol
6462861e737e84e4884109b9526ac645194ba892a74Michal Krol
6472861e737e84e4884109b9526ac645194ba892a74Michal Krol
6482861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
6492861e737e84e4884109b9526ac645194ba892a74Michal Krol * Set a sequence of program parameter registers.
6502861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
6512861e737e84e4884109b9526ac645194ba892a74Michal Krol */
6522861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
6532861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramParameters4dvNV(GLenum target, GLuint index,
6542861e737e84e4884109b9526ac645194ba892a74Michal Krol                             GLuint num, const GLdouble *params)
6552861e737e84e4884109b9526ac645194ba892a74Michal Krol{
6562861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
6572861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
6582861e737e84e4884109b9526ac645194ba892a74Michal Krol
6592861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) {
6602861e737e84e4884109b9526ac645194ba892a74Michal Krol      GLuint i;
6612861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (index + num > MAX_NV_VERTEX_PROGRAM_PARAMS) {
6622861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameters4dvNV");
6632861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
6642861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
6652861e737e84e4884109b9526ac645194ba892a74Michal Krol      for (i = 0; i < num; i++) {
6662861e737e84e4884109b9526ac645194ba892a74Michal Krol         ctx->VertexProgram.Parameters[index + i][0] = (GLfloat) params[0];
6672861e737e84e4884109b9526ac645194ba892a74Michal Krol         ctx->VertexProgram.Parameters[index + i][1] = (GLfloat) params[1];
6682861e737e84e4884109b9526ac645194ba892a74Michal Krol         ctx->VertexProgram.Parameters[index + i][2] = (GLfloat) params[2];
6692861e737e84e4884109b9526ac645194ba892a74Michal Krol         ctx->VertexProgram.Parameters[index + i][3] = (GLfloat) params[3];
6702861e737e84e4884109b9526ac645194ba892a74Michal Krol         params += 4;
6712861e737e84e4884109b9526ac645194ba892a74Michal Krol      };
6722861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
6732861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
6742861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameters4dvNV");
6752861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
6762861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
6772861e737e84e4884109b9526ac645194ba892a74Michal Krol}
6782861e737e84e4884109b9526ac645194ba892a74Michal Krol
6792861e737e84e4884109b9526ac645194ba892a74Michal Krol
6802861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
6812861e737e84e4884109b9526ac645194ba892a74Michal Krol * Set a sequence of program parameter registers.
6822861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
6832861e737e84e4884109b9526ac645194ba892a74Michal Krol */
6842861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
6852861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramParameters4fvNV(GLenum target, GLuint index,
6862861e737e84e4884109b9526ac645194ba892a74Michal Krol                             GLuint num, const GLfloat *params)
6872861e737e84e4884109b9526ac645194ba892a74Michal Krol{
6882861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
6892861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
6902861e737e84e4884109b9526ac645194ba892a74Michal Krol
6912861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) {
6922861e737e84e4884109b9526ac645194ba892a74Michal Krol      GLuint i;
6932861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (index + num > MAX_NV_VERTEX_PROGRAM_PARAMS) {
6942861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameters4fvNV");
6952861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
6962861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
6972861e737e84e4884109b9526ac645194ba892a74Michal Krol      for (i = 0; i < num; i++) {
6982861e737e84e4884109b9526ac645194ba892a74Michal Krol         COPY_4V(ctx->VertexProgram.Parameters[index + i], params);
6992861e737e84e4884109b9526ac645194ba892a74Michal Krol         params += 4;
700daea7176347f15f1c916c4a1131fce0bd1f062bcIan Romanick      }
7012861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
7022861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
7032861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameters4fvNV");
7042861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
7052861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
7062861e737e84e4884109b9526ac645194ba892a74Michal Krol}
7072861e737e84e4884109b9526ac645194ba892a74Michal Krol
7082861e737e84e4884109b9526ac645194ba892a74Michal Krol
7092861e737e84e4884109b9526ac645194ba892a74Michal Krol
7102861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
7112861e737e84e4884109b9526ac645194ba892a74Michal Krol * Setup tracking of matrices into program parameter registers.
7122861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
7132861e737e84e4884109b9526ac645194ba892a74Michal Krol */
7142861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
7152861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_TrackMatrixNV(GLenum target, GLuint address,
7162861e737e84e4884109b9526ac645194ba892a74Michal Krol                    GLenum matrix, GLenum transform)
7172861e737e84e4884109b9526ac645194ba892a74Michal Krol{
7182861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
7192861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
7202861e737e84e4884109b9526ac645194ba892a74Michal Krol
7212861e737e84e4884109b9526ac645194ba892a74Michal Krol   FLUSH_VERTICES(ctx, _NEW_PROGRAM);
7222861e737e84e4884109b9526ac645194ba892a74Michal Krol
7232861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) {
7242861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (address & 0x3) {
7252861e737e84e4884109b9526ac645194ba892a74Michal Krol         /* addr must be multiple of four */
7262861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glTrackMatrixNV(address)");
7272861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
7282861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
7292861e737e84e4884109b9526ac645194ba892a74Michal Krol
7302861e737e84e4884109b9526ac645194ba892a74Michal Krol      switch (matrix) {
7312861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_NONE:
7322861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MODELVIEW:
7332861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_PROJECTION:
7342861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_TEXTURE:
7352861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_COLOR:
7362861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MODELVIEW_PROJECTION_NV:
7372861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX0_NV:
7382861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX1_NV:
7392861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX2_NV:
7402861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX3_NV:
7412861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX4_NV:
7422861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX5_NV:
7432861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX6_NV:
7442861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX7_NV:
7452861e737e84e4884109b9526ac645194ba892a74Michal Krol            /* OK, fallthrough */
7462861e737e84e4884109b9526ac645194ba892a74Michal Krol            break;
7472861e737e84e4884109b9526ac645194ba892a74Michal Krol         default:
7482861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(matrix)");
7492861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
7502861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
7512861e737e84e4884109b9526ac645194ba892a74Michal Krol
7522861e737e84e4884109b9526ac645194ba892a74Michal Krol      switch (transform) {
7532861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_IDENTITY_NV:
7542861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_INVERSE_NV:
7552861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_TRANSPOSE_NV:
7562861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_INVERSE_TRANSPOSE_NV:
7572861e737e84e4884109b9526ac645194ba892a74Michal Krol            /* OK, fallthrough */
7582861e737e84e4884109b9526ac645194ba892a74Michal Krol            break;
7592861e737e84e4884109b9526ac645194ba892a74Michal Krol         default:
7602861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(transform)");
7612861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
7622861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
7632861e737e84e4884109b9526ac645194ba892a74Michal Krol
7642861e737e84e4884109b9526ac645194ba892a74Michal Krol      ctx->VertexProgram.TrackMatrix[address / 4] = matrix;
7652861e737e84e4884109b9526ac645194ba892a74Michal Krol      ctx->VertexProgram.TrackMatrixTransform[address / 4] = transform;
7662861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
7672861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
7682861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(target)");
7692861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
7702861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
7712861e737e84e4884109b9526ac645194ba892a74Michal Krol}
7722861e737e84e4884109b9526ac645194ba892a74Michal Krol
7732861e737e84e4884109b9526ac645194ba892a74Michal Krol
7742861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
7752861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte *name,
7762861e737e84e4884109b9526ac645194ba892a74Michal Krol                                GLfloat x, GLfloat y, GLfloat z, GLfloat w)
7772861e737e84e4884109b9526ac645194ba892a74Michal Krol{
778122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program *prog;
779122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_fragment_program *fragProg;
7802861e737e84e4884109b9526ac645194ba892a74Michal Krol   GLfloat *v;
7812861e737e84e4884109b9526ac645194ba892a74Michal Krol
7822861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
7832861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
7842861e737e84e4884109b9526ac645194ba892a74Michal Krol
7852861e737e84e4884109b9526ac645194ba892a74Michal Krol   FLUSH_VERTICES(ctx, _NEW_PROGRAM);
7862861e737e84e4884109b9526ac645194ba892a74Michal Krol
7874d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul   prog = _mesa_lookup_program(ctx, id);
7882861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!prog || prog->Target != GL_FRAGMENT_PROGRAM_NV) {
7892861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glProgramNamedParameterNV");
7902861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
7912861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
7922861e737e84e4884109b9526ac645194ba892a74Michal Krol
7932861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (len <= 0) {
7949ca83924848070d02a5ac2f0aa4e20444eec2183Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glProgramNamedParameterNV(len)");
7952861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
7962861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
7972861e737e84e4884109b9526ac645194ba892a74Michal Krol
798122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   fragProg = (struct gl_fragment_program *) prog;
799de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   v = _mesa_lookup_parameter_value(fragProg->Base.Parameters, len,
800de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul                                    (char *) name);
8012861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (v) {
8022861e737e84e4884109b9526ac645194ba892a74Michal Krol      v[0] = x;
8032861e737e84e4884109b9526ac645194ba892a74Michal Krol      v[1] = y;
8042861e737e84e4884109b9526ac645194ba892a74Michal Krol      v[2] = z;
8052861e737e84e4884109b9526ac645194ba892a74Michal Krol      v[3] = w;
8062861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
8072861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
8082861e737e84e4884109b9526ac645194ba892a74Michal Krol
8099ca83924848070d02a5ac2f0aa4e20444eec2183Brian Paul   _mesa_error(ctx, GL_INVALID_VALUE, "glProgramNamedParameterNV(name)");
8102861e737e84e4884109b9526ac645194ba892a74Michal Krol}
8112861e737e84e4884109b9526ac645194ba892a74Michal Krol
8122861e737e84e4884109b9526ac645194ba892a74Michal Krol
8132861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
8142861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte *name,
8152861e737e84e4884109b9526ac645194ba892a74Michal Krol                                 const float v[])
8162861e737e84e4884109b9526ac645194ba892a74Michal Krol{
8172861e737e84e4884109b9526ac645194ba892a74Michal Krol   _mesa_ProgramNamedParameter4fNV(id, len, name, v[0], v[1], v[2], v[3]);
8182861e737e84e4884109b9526ac645194ba892a74Michal Krol}
8192861e737e84e4884109b9526ac645194ba892a74Michal Krol
8202861e737e84e4884109b9526ac645194ba892a74Michal Krol
8212861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
8222861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte *name,
8232861e737e84e4884109b9526ac645194ba892a74Michal Krol                                GLdouble x, GLdouble y, GLdouble z, GLdouble w)
8242861e737e84e4884109b9526ac645194ba892a74Michal Krol{
8252861e737e84e4884109b9526ac645194ba892a74Michal Krol   _mesa_ProgramNamedParameter4fNV(id, len, name, (GLfloat)x, (GLfloat)y,
8262861e737e84e4884109b9526ac645194ba892a74Michal Krol                                   (GLfloat)z, (GLfloat)w);
8272861e737e84e4884109b9526ac645194ba892a74Michal Krol}
8282861e737e84e4884109b9526ac645194ba892a74Michal Krol
8292861e737e84e4884109b9526ac645194ba892a74Michal Krol
8302861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
8312861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte *name,
8322861e737e84e4884109b9526ac645194ba892a74Michal Krol                                 const double v[])
8332861e737e84e4884109b9526ac645194ba892a74Michal Krol{
8342861e737e84e4884109b9526ac645194ba892a74Michal Krol   _mesa_ProgramNamedParameter4fNV(id, len, name,
8352861e737e84e4884109b9526ac645194ba892a74Michal Krol                                   (GLfloat)v[0], (GLfloat)v[1],
8362861e737e84e4884109b9526ac645194ba892a74Michal Krol                                   (GLfloat)v[2], (GLfloat)v[3]);
8372861e737e84e4884109b9526ac645194ba892a74Michal Krol}
8382861e737e84e4884109b9526ac645194ba892a74Michal Krol
8392861e737e84e4884109b9526ac645194ba892a74Michal Krol
8402861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
8412861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte *name,
8422861e737e84e4884109b9526ac645194ba892a74Michal Krol                                   GLfloat *params)
8432861e737e84e4884109b9526ac645194ba892a74Michal Krol{
844122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program *prog;
845122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_fragment_program *fragProg;
8462861e737e84e4884109b9526ac645194ba892a74Michal Krol   const GLfloat *v;
8472861e737e84e4884109b9526ac645194ba892a74Michal Krol
8482861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
8492861e737e84e4884109b9526ac645194ba892a74Michal Krol
8502861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!ctx->_CurrentProgram)
8512861e737e84e4884109b9526ac645194ba892a74Michal Krol      ASSERT_OUTSIDE_BEGIN_END(ctx);
8522861e737e84e4884109b9526ac645194ba892a74Michal Krol
8534d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul   prog = _mesa_lookup_program(ctx, id);
8542861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!prog || prog->Target != GL_FRAGMENT_PROGRAM_NV) {
8552861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramNamedParameterNV");
8562861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
8572861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
8582861e737e84e4884109b9526ac645194ba892a74Michal Krol
8592861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (len <= 0) {
8602861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramNamedParameterNV");
8612861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
8622861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
8632861e737e84e4884109b9526ac645194ba892a74Michal Krol
864122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   fragProg = (struct gl_fragment_program *) prog;
865de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   v = _mesa_lookup_parameter_value(fragProg->Base.Parameters,
866de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul                                    len, (char *) name);
8672861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (v) {
8682861e737e84e4884109b9526ac645194ba892a74Michal Krol      params[0] = v[0];
8692861e737e84e4884109b9526ac645194ba892a74Michal Krol      params[1] = v[1];
8702861e737e84e4884109b9526ac645194ba892a74Michal Krol      params[2] = v[2];
8712861e737e84e4884109b9526ac645194ba892a74Michal Krol      params[3] = v[3];
8722861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
8732861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
8742861e737e84e4884109b9526ac645194ba892a74Michal Krol
8752861e737e84e4884109b9526ac645194ba892a74Michal Krol   _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramNamedParameterNV");
8762861e737e84e4884109b9526ac645194ba892a74Michal Krol}
8772861e737e84e4884109b9526ac645194ba892a74Michal Krol
8782861e737e84e4884109b9526ac645194ba892a74Michal Krol
8792861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
8802861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetProgramNamedParameterdvNV(GLuint id, GLsizei len, const GLubyte *name,
8812861e737e84e4884109b9526ac645194ba892a74Michal Krol                                   GLdouble *params)
8822861e737e84e4884109b9526ac645194ba892a74Michal Krol{
8832861e737e84e4884109b9526ac645194ba892a74Michal Krol   GLfloat floatParams[4];
8842861e737e84e4884109b9526ac645194ba892a74Michal Krol   _mesa_GetProgramNamedParameterfvNV(id, len, name, floatParams);
8852861e737e84e4884109b9526ac645194ba892a74Michal Krol   COPY_4V(params, floatParams);
8862861e737e84e4884109b9526ac645194ba892a74Michal Krol}
887