nvprogram.c revision 20fbb24b67dda0679774756e4b6d98c2c66c2c42
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
40bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/glheader.h"
41bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/context.h"
42bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/hash.h"
43bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/imports.h"
44bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/macros.h"
45bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "program.h"
4657d9531cd644226d15be4a09ad1492ab647165dcBrian#include "prog_parameter.h"
4757d9531cd644226d15be4a09ad1492ab647165dcBrian#include "prog_instruction.h"
486232438acb205ea44dee2d5eb68fb618e40b47d6Brian#include "nvfragparse.h"
492861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "nvvertparse.h"
50289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick#include "arbprogparse.h"
512861e737e84e4884109b9526ac645194ba892a74Michal Krol#include "nvprogram.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
80740a8b0b66f0e00807f064e3105fd6b045e5a2d0Brian   _mesa_problem(ctx, "glExecuteProgramNV() not supported");
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
250548be3846db59ad43934a159c051b359db6e56dbBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
2512861e737e84e4884109b9526ac645194ba892a74Michal Krol
2524d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul   prog = _mesa_lookup_program(ctx, id);
2532861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!prog) {
2542861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramivNV");
2552861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
2562861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2572861e737e84e4884109b9526ac645194ba892a74Michal Krol
2582861e737e84e4884109b9526ac645194ba892a74Michal Krol   switch (pname) {
2592861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_PROGRAM_TARGET_NV:
2602861e737e84e4884109b9526ac645194ba892a74Michal Krol         *params = prog->Target;
2612861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
2622861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_PROGRAM_LENGTH_NV:
2636258b76c49f49a56a7c713914b798e80c6553b06Karl Schultz         *params = prog->String ?(GLint)_mesa_strlen((char *) prog->String) : 0;
2642861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
2652861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_PROGRAM_RESIDENT_NV:
2662861e737e84e4884109b9526ac645194ba892a74Michal Krol         *params = prog->Resident;
2672861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
2682861e737e84e4884109b9526ac645194ba892a74Michal Krol      default:
2692861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramivNV(pname)");
2702861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
2712861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2722861e737e84e4884109b9526ac645194ba892a74Michal Krol}
2732861e737e84e4884109b9526ac645194ba892a74Michal Krol
2742861e737e84e4884109b9526ac645194ba892a74Michal Krol
2752861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
2762861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get the program source code.
2772861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
2782861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
2792861e737e84e4884109b9526ac645194ba892a74Michal Krol */
2802861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
2812861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetProgramStringNV(GLuint id, GLenum pname, GLubyte *program)
2822861e737e84e4884109b9526ac645194ba892a74Michal Krol{
283122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program *prog;
2842861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
2852861e737e84e4884109b9526ac645194ba892a74Michal Krol
286548be3846db59ad43934a159c051b359db6e56dbBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
2872861e737e84e4884109b9526ac645194ba892a74Michal Krol
2882861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (pname != GL_PROGRAM_STRING_NV) {
2892861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramStringNV(pname)");
2902861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
2912861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2922861e737e84e4884109b9526ac645194ba892a74Michal Krol
2934d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul   prog = _mesa_lookup_program(ctx, id);
2942861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!prog) {
2952861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramStringNV");
2962861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
2972861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2982861e737e84e4884109b9526ac645194ba892a74Michal Krol
2992861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (prog->String) {
3002861e737e84e4884109b9526ac645194ba892a74Michal Krol      MEMCPY(program, prog->String, _mesa_strlen((char *) prog->String));
3012861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3022861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
3032861e737e84e4884109b9526ac645194ba892a74Michal Krol      program[0] = 0;
3042861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3052861e737e84e4884109b9526ac645194ba892a74Michal Krol}
3062861e737e84e4884109b9526ac645194ba892a74Michal Krol
3072861e737e84e4884109b9526ac645194ba892a74Michal Krol
3082861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
3092861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get matrix tracking information.
3102861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
3112861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
3122861e737e84e4884109b9526ac645194ba892a74Michal Krol */
3132861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
3142861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetTrackMatrixivNV(GLenum target, GLuint address,
3152861e737e84e4884109b9526ac645194ba892a74Michal Krol                         GLenum pname, GLint *params)
3162861e737e84e4884109b9526ac645194ba892a74Michal Krol{
3172861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
3182861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
3192861e737e84e4884109b9526ac645194ba892a74Michal Krol
3202861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target == GL_VERTEX_PROGRAM_NV
3212861e737e84e4884109b9526ac645194ba892a74Michal Krol       && ctx->Extensions.NV_vertex_program) {
3222861e737e84e4884109b9526ac645194ba892a74Michal Krol      GLuint i;
3232861e737e84e4884109b9526ac645194ba892a74Michal Krol
3242861e737e84e4884109b9526ac645194ba892a74Michal Krol      if ((address & 0x3) || address >= MAX_NV_VERTEX_PROGRAM_PARAMS) {
3252861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glGetTrackMatrixivNV(address)");
3262861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
3272861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
3282861e737e84e4884109b9526ac645194ba892a74Michal Krol
3292861e737e84e4884109b9526ac645194ba892a74Michal Krol      i = address / 4;
3302861e737e84e4884109b9526ac645194ba892a74Michal Krol
3312861e737e84e4884109b9526ac645194ba892a74Michal Krol      switch (pname) {
3322861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_TRACK_MATRIX_NV:
3332861e737e84e4884109b9526ac645194ba892a74Michal Krol            params[0] = (GLint) ctx->VertexProgram.TrackMatrix[i];
3342861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
3352861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_TRACK_MATRIX_TRANSFORM_NV:
3362861e737e84e4884109b9526ac645194ba892a74Michal Krol            params[0] = (GLint) ctx->VertexProgram.TrackMatrixTransform[i];
3372861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
3382861e737e84e4884109b9526ac645194ba892a74Michal Krol         default:
3392861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_INVALID_ENUM, "glGetTrackMatrixivNV");
3402861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
3412861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
3422861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3432861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
3442861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTrackMatrixivNV");
3452861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
3462861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3472861e737e84e4884109b9526ac645194ba892a74Michal Krol}
3482861e737e84e4884109b9526ac645194ba892a74Michal Krol
3492861e737e84e4884109b9526ac645194ba892a74Michal Krol
3502861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
3512861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a vertex (or vertex array) attribute.
3522861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
3532861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
3542861e737e84e4884109b9526ac645194ba892a74Michal Krol */
3552861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
3562861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble *params)
3572861e737e84e4884109b9526ac645194ba892a74Michal Krol{
358667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul   const struct gl_client_array *array;
3592861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
3602861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
3612861e737e84e4884109b9526ac645194ba892a74Michal Krol
362120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
3632861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)");
3642861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
3652861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3662861e737e84e4884109b9526ac645194ba892a74Michal Krol
367667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul   array = &ctx->Array.ArrayObj->VertexAttrib[index];
368667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul
3692861e737e84e4884109b9526ac645194ba892a74Michal Krol   switch (pname) {
3702861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_SIZE_NV:
371667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->Size;
3722861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
3732861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_STRIDE_NV:
374667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->Stride;
3752861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
3762861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_TYPE_NV:
377667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->Type;
3782861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
3792861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_CURRENT_ATTRIB_NV:
380120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         if (index == 0) {
381120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            _mesa_error(ctx, GL_INVALID_OPERATION,
382120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul                        "glGetVertexAttribdvNV(index == 0)");
383120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            return;
384120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         }
3852861e737e84e4884109b9526ac645194ba892a74Michal Krol	 FLUSH_CURRENT(ctx, 0);
3862861e737e84e4884109b9526ac645194ba892a74Michal Krol         COPY_4V(params, ctx->Current.Attrib[index]);
3872861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
3882861e737e84e4884109b9526ac645194ba892a74Michal Krol      default:
3892861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
3902861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
3912861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3922861e737e84e4884109b9526ac645194ba892a74Michal Krol}
3932861e737e84e4884109b9526ac645194ba892a74Michal Krol
3942861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
3952861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a vertex (or vertex array) attribute.
3962861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
3972861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
3982861e737e84e4884109b9526ac645194ba892a74Michal Krol */
3992861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
4002861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat *params)
4012861e737e84e4884109b9526ac645194ba892a74Michal Krol{
402667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul   const struct gl_client_array *array;
4032861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
4042861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
4052861e737e84e4884109b9526ac645194ba892a74Michal Krol
406120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
4072861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)");
4082861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
4092861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
4102861e737e84e4884109b9526ac645194ba892a74Michal Krol
411667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul   array = &ctx->Array.ArrayObj->VertexAttrib[index];
412667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul
4132861e737e84e4884109b9526ac645194ba892a74Michal Krol   switch (pname) {
4142861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_SIZE_NV:
415667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = (GLfloat) array->Size;
4162861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4172861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_STRIDE_NV:
418667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = (GLfloat) array->Stride;
4192861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4202861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_TYPE_NV:
421667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = (GLfloat) array->Type;
4222861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4232861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_CURRENT_ATTRIB_NV:
424120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         if (index == 0) {
425120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            _mesa_error(ctx, GL_INVALID_OPERATION,
426120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul                        "glGetVertexAttribfvNV(index == 0)");
427120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            return;
428120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         }
4292861e737e84e4884109b9526ac645194ba892a74Michal Krol	 FLUSH_CURRENT(ctx, 0);
4302861e737e84e4884109b9526ac645194ba892a74Michal Krol         COPY_4V(params, ctx->Current.Attrib[index]);
4312861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4322861e737e84e4884109b9526ac645194ba892a74Michal Krol      default:
4332861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
4342861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
4352861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
4362861e737e84e4884109b9526ac645194ba892a74Michal Krol}
4372861e737e84e4884109b9526ac645194ba892a74Michal Krol
4382861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
4392861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a vertex (or vertex array) attribute.
4402861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
4412861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
4422861e737e84e4884109b9526ac645194ba892a74Michal Krol */
4432861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
4442861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetVertexAttribivNV(GLuint index, GLenum pname, GLint *params)
4452861e737e84e4884109b9526ac645194ba892a74Michal Krol{
446667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul   const struct gl_client_array *array;
4472861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
4482861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
4492861e737e84e4884109b9526ac645194ba892a74Michal Krol
450120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
4512861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)");
4522861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
4532861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
4542861e737e84e4884109b9526ac645194ba892a74Michal Krol
455667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul   array = &ctx->Array.ArrayObj->VertexAttrib[index];
456667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul
4572861e737e84e4884109b9526ac645194ba892a74Michal Krol   switch (pname) {
4582861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_SIZE_NV:
459667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->Size;
4602861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4612861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_STRIDE_NV:
462667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->Stride;
4632861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4642861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_TYPE_NV:
465667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->Type;
4662861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4672861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_CURRENT_ATTRIB_NV:
468120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         if (index == 0) {
469120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            _mesa_error(ctx, GL_INVALID_OPERATION,
470120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul                        "glGetVertexAttribivNV(index == 0)");
471120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            return;
472120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         }
4732861e737e84e4884109b9526ac645194ba892a74Michal Krol	 FLUSH_CURRENT(ctx, 0);
4742861e737e84e4884109b9526ac645194ba892a74Michal Krol         params[0] = (GLint) ctx->Current.Attrib[index][0];
4752861e737e84e4884109b9526ac645194ba892a74Michal Krol         params[1] = (GLint) ctx->Current.Attrib[index][1];
4762861e737e84e4884109b9526ac645194ba892a74Michal Krol         params[2] = (GLint) ctx->Current.Attrib[index][2];
4772861e737e84e4884109b9526ac645194ba892a74Michal Krol         params[3] = (GLint) ctx->Current.Attrib[index][3];
4782861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4792861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
480667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->BufferObj->Name;
4812861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4822861e737e84e4884109b9526ac645194ba892a74Michal Krol      default:
4832861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
4842861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
4852861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
4862861e737e84e4884109b9526ac645194ba892a74Michal Krol}
4872861e737e84e4884109b9526ac645194ba892a74Michal Krol
4882861e737e84e4884109b9526ac645194ba892a74Michal Krol
4892861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
4902861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a vertex array attribute pointer.
4912861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
4922861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
4932861e737e84e4884109b9526ac645194ba892a74Michal Krol */
4942861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
4952861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid **pointer)
4962861e737e84e4884109b9526ac645194ba892a74Michal Krol{
4972861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
4982861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
4992861e737e84e4884109b9526ac645194ba892a74Michal Krol
5002861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
5012861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerNV(index)");
5022861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
5032861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
5042861e737e84e4884109b9526ac645194ba892a74Michal Krol
5052861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (pname != GL_ATTRIB_ARRAY_POINTER_NV) {
5062861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerNV(pname)");
5072861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
5082861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
5092861e737e84e4884109b9526ac645194ba892a74Michal Krol
510ee34e6ef716bb630440299ac1efbc2055ef09ffdIan Romanick   *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[index].Ptr;
5112861e737e84e4884109b9526ac645194ba892a74Michal Krol}
5122861e737e84e4884109b9526ac645194ba892a74Michal Krol
513726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholtvoid
514726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt_mesa_emit_nv_temp_initialization(GLcontext *ctx,
515726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt				  struct gl_program *program)
516726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt{
517726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   struct prog_instruction *inst;
51820fbb24b67dda0679774756e4b6d98c2c66c2c42Brian Paul   GLuint i;
519726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt
520726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   if (!ctx->Shader.EmitNVTempInitialization)
521726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      return;
522726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt
523726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   /* We'll swizzle up a zero temporary so we can use it for the
524726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt    * ARL.
525726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt    */
526726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   if (program->NumTemporaries == 0)
527726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      program->NumTemporaries = 1;
5282861e737e84e4884109b9526ac645194ba892a74Michal Krol
529726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   _mesa_insert_instructions(program, 0, program->NumTemporaries + 1);
530726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt
531726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   for (i = 0; i < program->NumTemporaries; i++) {
532726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      struct prog_instruction *inst = &program->Instructions[i];
533726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt
534726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->Opcode = OPCODE_SWZ;
535726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->DstReg.File = PROGRAM_TEMPORARY;
536726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->DstReg.Index = i;
537726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->DstReg.WriteMask = WRITEMASK_XYZW;
538726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->SrcReg[0].File = PROGRAM_TEMPORARY;
539726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->SrcReg[0].Index = 0;
540726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_ZERO,
541726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt					      SWIZZLE_ZERO,
542726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt					      SWIZZLE_ZERO,
543726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt					      SWIZZLE_ZERO);
544726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   }
545726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt
546726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst = &program->Instructions[i];
547726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->Opcode = OPCODE_ARL;
548726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->DstReg.File = PROGRAM_ADDRESS;
549726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->DstReg.Index = 0;
550726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->DstReg.WriteMask = WRITEMASK_XYZW;
551726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->SrcReg[0].File = PROGRAM_TEMPORARY;
552726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->SrcReg[0].Index = 0;
553726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->SrcReg[0].Swizzle = SWIZZLE_XXXX;
554726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt
555726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   if (program->NumAddressRegs == 0)
556726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      program->NumAddressRegs = 1;
557726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt}
5582861e737e84e4884109b9526ac645194ba892a74Michal Krol
559601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholtvoid
560601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt_mesa_setup_nv_temporary_count(GLcontext *ctx, struct gl_program *program)
561601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt{
56220fbb24b67dda0679774756e4b6d98c2c66c2c42Brian Paul   GLuint i;
563601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt
564601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt   program->NumTemporaries = 0;
565601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt   for (i = 0; i < program->NumInstructions; i++) {
566601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      struct prog_instruction *inst = &program->Instructions[i];
567601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt
568601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      if (inst->DstReg.File == PROGRAM_TEMPORARY) {
569601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt	 program->NumTemporaries = MAX2(program->NumTemporaries,
570601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt					inst->DstReg.Index + 1);
571601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      }
572601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      if (inst->SrcReg[0].File == PROGRAM_TEMPORARY) {
573601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt	 program->NumTemporaries = MAX2(program->NumTemporaries,
574601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt					inst->SrcReg[0].Index + 1);
575601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      }
576601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      if (inst->SrcReg[1].File == PROGRAM_TEMPORARY) {
577601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt	 program->NumTemporaries = MAX2(program->NumTemporaries,
578601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt					inst->SrcReg[1].Index + 1);
579601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      }
580601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      if (inst->SrcReg[2].File == PROGRAM_TEMPORARY) {
581601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt	 program->NumTemporaries = MAX2(program->NumTemporaries,
582601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt					inst->SrcReg[2].Index + 1);
583601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      }
584601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt   }
585601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt}
586601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt
5872861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
5882861e737e84e4884109b9526ac645194ba892a74Michal Krol * Load/parse/compile a program.
5892861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
5902861e737e84e4884109b9526ac645194ba892a74Michal Krol */
5912861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
5922861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len,
5932861e737e84e4884109b9526ac645194ba892a74Michal Krol                    const GLubyte *program)
5942861e737e84e4884109b9526ac645194ba892a74Michal Krol{
595122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program *prog;
5962861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
5972861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
5982861e737e84e4884109b9526ac645194ba892a74Michal Krol
5992cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick   if (!ctx->Extensions.NV_vertex_program
6002cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick       && !ctx->Extensions.NV_fragment_program) {
6012cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick      _mesa_error(ctx, GL_INVALID_OPERATION, "glLoadProgramNV()");
6022cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick      return;
6032cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick   }
6042cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick
6052861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (id == 0) {
6062861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glLoadProgramNV(id)");
6072861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
6088a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul   }
6098a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul
6108a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul   if (len < 0) {
6118a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glLoadProgramNV(len)");
6128a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul      return;
6132861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
6142861e737e84e4884109b9526ac645194ba892a74Michal Krol
6152861e737e84e4884109b9526ac645194ba892a74Michal Krol   FLUSH_VERTICES(ctx, _NEW_PROGRAM);
6162861e737e84e4884109b9526ac645194ba892a74Michal Krol
6174d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul   prog = _mesa_lookup_program(ctx, id);
6182861e737e84e4884109b9526ac645194ba892a74Michal Krol
6192861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (prog && prog->Target != 0 && prog->Target != target) {
6202861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glLoadProgramNV(target)");
6212861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
6222861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
6232861e737e84e4884109b9526ac645194ba892a74Michal Krol
6242861e737e84e4884109b9526ac645194ba892a74Michal Krol   if ((target == GL_VERTEX_PROGRAM_NV ||
6252861e737e84e4884109b9526ac645194ba892a74Michal Krol        target == GL_VERTEX_STATE_PROGRAM_NV)
6262861e737e84e4884109b9526ac645194ba892a74Michal Krol       && ctx->Extensions.NV_vertex_program) {
627122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul      struct gl_vertex_program *vprog = (struct gl_vertex_program *) prog;
6289ca83924848070d02a5ac2f0aa4e20444eec2183Brian Paul      if (!vprog || prog == &_mesa_DummyProgram) {
629122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul         vprog = (struct gl_vertex_program *)
6300590786f8af98bb849cee11fffd51be7db04f1b5Brian Paul            ctx->Driver.NewProgram(ctx, target, id);
6312861e737e84e4884109b9526ac645194ba892a74Michal Krol         if (!vprog) {
6322861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV");
6332861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
6342861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
6352861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_HashInsert(ctx->Shared->Programs, id, vprog);
6362861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
6372cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick
6382cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick      if (ctx->Extensions.ARB_vertex_program
6392cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick	  && (strncmp((char *) program, "!!ARB", 5) == 0)) {
6402cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick	 _mesa_parse_arb_vertex_program(ctx, target, program, len, vprog);
6412cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick      } else {
6422cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick	 _mesa_parse_nv_vertex_program(ctx, target, program, len, vprog);
6432cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick      }
6442861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
6452861e737e84e4884109b9526ac645194ba892a74Michal Krol   else if (target == GL_FRAGMENT_PROGRAM_NV
6462861e737e84e4884109b9526ac645194ba892a74Michal Krol            && ctx->Extensions.NV_fragment_program) {
647122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul      struct gl_fragment_program *fprog = (struct gl_fragment_program *) prog;
6489ca83924848070d02a5ac2f0aa4e20444eec2183Brian Paul      if (!fprog || prog == &_mesa_DummyProgram) {
649122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul         fprog = (struct gl_fragment_program *)
6500590786f8af98bb849cee11fffd51be7db04f1b5Brian Paul            ctx->Driver.NewProgram(ctx, target, id);
6512861e737e84e4884109b9526ac645194ba892a74Michal Krol         if (!fprog) {
6522861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV");
6532861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
6542861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
6552861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_HashInsert(ctx->Shared->Programs, id, fprog);
6562861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
6572861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_parse_nv_fragment_program(ctx, target, program, len, fprog);
6582861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
659289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick   else if (target == GL_FRAGMENT_PROGRAM_ARB
660289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick            && ctx->Extensions.ARB_fragment_program) {
661289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick      struct gl_fragment_program *fprog = (struct gl_fragment_program *) prog;
662289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick      if (!fprog || prog == &_mesa_DummyProgram) {
663289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick         fprog = (struct gl_fragment_program *)
664289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick            ctx->Driver.NewProgram(ctx, target, id);
665289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick         if (!fprog) {
666289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV");
667289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick            return;
668289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick         }
669289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick         _mesa_HashInsert(ctx->Shared->Programs, id, fprog);
670289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick      }
671289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick      _mesa_parse_arb_fragment_program(ctx, target, program, len, fprog);
672289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick   }
6732861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
6742861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glLoadProgramNV(target)");
6752861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
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_ProgramParameters4dvNV(GLenum target, GLuint index,
6862861e737e84e4884109b9526ac645194ba892a74Michal Krol                             GLuint num, const GLdouble *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, "glProgramParameters4dvNV");
6952861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
6962861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
6972861e737e84e4884109b9526ac645194ba892a74Michal Krol      for (i = 0; i < num; i++) {
6982861e737e84e4884109b9526ac645194ba892a74Michal Krol         ctx->VertexProgram.Parameters[index + i][0] = (GLfloat) params[0];
6992861e737e84e4884109b9526ac645194ba892a74Michal Krol         ctx->VertexProgram.Parameters[index + i][1] = (GLfloat) params[1];
7002861e737e84e4884109b9526ac645194ba892a74Michal Krol         ctx->VertexProgram.Parameters[index + i][2] = (GLfloat) params[2];
7012861e737e84e4884109b9526ac645194ba892a74Michal Krol         ctx->VertexProgram.Parameters[index + i][3] = (GLfloat) params[3];
7022861e737e84e4884109b9526ac645194ba892a74Michal Krol         params += 4;
7032861e737e84e4884109b9526ac645194ba892a74Michal Krol      };
7042861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
7052861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
7062861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameters4dvNV");
7072861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
7082861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
7092861e737e84e4884109b9526ac645194ba892a74Michal Krol}
7102861e737e84e4884109b9526ac645194ba892a74Michal Krol
7112861e737e84e4884109b9526ac645194ba892a74Michal Krol
7122861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
7132861e737e84e4884109b9526ac645194ba892a74Michal Krol * Set a sequence of program parameter registers.
7142861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
7152861e737e84e4884109b9526ac645194ba892a74Michal Krol */
7162861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
7172861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramParameters4fvNV(GLenum target, GLuint index,
7182861e737e84e4884109b9526ac645194ba892a74Michal Krol                             GLuint num, const GLfloat *params)
7192861e737e84e4884109b9526ac645194ba892a74Michal Krol{
7202861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
7212861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
7222861e737e84e4884109b9526ac645194ba892a74Michal Krol
7232861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) {
7242861e737e84e4884109b9526ac645194ba892a74Michal Krol      GLuint i;
7252861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (index + num > MAX_NV_VERTEX_PROGRAM_PARAMS) {
7262861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameters4fvNV");
7272861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
7282861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
7292861e737e84e4884109b9526ac645194ba892a74Michal Krol      for (i = 0; i < num; i++) {
7302861e737e84e4884109b9526ac645194ba892a74Michal Krol         COPY_4V(ctx->VertexProgram.Parameters[index + i], params);
7312861e737e84e4884109b9526ac645194ba892a74Michal Krol         params += 4;
732daea7176347f15f1c916c4a1131fce0bd1f062bcIan Romanick      }
7332861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
7342861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
7352861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameters4fvNV");
7362861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
7372861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
7382861e737e84e4884109b9526ac645194ba892a74Michal Krol}
7392861e737e84e4884109b9526ac645194ba892a74Michal Krol
7402861e737e84e4884109b9526ac645194ba892a74Michal Krol
7412861e737e84e4884109b9526ac645194ba892a74Michal Krol
7422861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
7432861e737e84e4884109b9526ac645194ba892a74Michal Krol * Setup tracking of matrices into program parameter registers.
7442861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
7452861e737e84e4884109b9526ac645194ba892a74Michal Krol */
7462861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
7472861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_TrackMatrixNV(GLenum target, GLuint address,
7482861e737e84e4884109b9526ac645194ba892a74Michal Krol                    GLenum matrix, GLenum transform)
7492861e737e84e4884109b9526ac645194ba892a74Michal Krol{
7502861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
7512861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
7522861e737e84e4884109b9526ac645194ba892a74Michal Krol
7532861e737e84e4884109b9526ac645194ba892a74Michal Krol   FLUSH_VERTICES(ctx, _NEW_PROGRAM);
7542861e737e84e4884109b9526ac645194ba892a74Michal Krol
7552861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) {
7562861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (address & 0x3) {
7572861e737e84e4884109b9526ac645194ba892a74Michal Krol         /* addr must be multiple of four */
7582861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glTrackMatrixNV(address)");
7592861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
7602861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
7612861e737e84e4884109b9526ac645194ba892a74Michal Krol
7622861e737e84e4884109b9526ac645194ba892a74Michal Krol      switch (matrix) {
7632861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_NONE:
7642861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MODELVIEW:
7652861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_PROJECTION:
7662861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_TEXTURE:
7672861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_COLOR:
7682861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MODELVIEW_PROJECTION_NV:
7692861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX0_NV:
7702861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX1_NV:
7712861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX2_NV:
7722861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX3_NV:
7732861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX4_NV:
7742861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX5_NV:
7752861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX6_NV:
7762861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_MATRIX7_NV:
7772861e737e84e4884109b9526ac645194ba892a74Michal Krol            /* OK, fallthrough */
7782861e737e84e4884109b9526ac645194ba892a74Michal Krol            break;
7792861e737e84e4884109b9526ac645194ba892a74Michal Krol         default:
7802861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(matrix)");
7812861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
7822861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
7832861e737e84e4884109b9526ac645194ba892a74Michal Krol
7842861e737e84e4884109b9526ac645194ba892a74Michal Krol      switch (transform) {
7852861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_IDENTITY_NV:
7862861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_INVERSE_NV:
7872861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_TRANSPOSE_NV:
7882861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_INVERSE_TRANSPOSE_NV:
7892861e737e84e4884109b9526ac645194ba892a74Michal Krol            /* OK, fallthrough */
7902861e737e84e4884109b9526ac645194ba892a74Michal Krol            break;
7912861e737e84e4884109b9526ac645194ba892a74Michal Krol         default:
7922861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(transform)");
7932861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
7942861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
7952861e737e84e4884109b9526ac645194ba892a74Michal Krol
7962861e737e84e4884109b9526ac645194ba892a74Michal Krol      ctx->VertexProgram.TrackMatrix[address / 4] = matrix;
7972861e737e84e4884109b9526ac645194ba892a74Michal Krol      ctx->VertexProgram.TrackMatrixTransform[address / 4] = transform;
7982861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
7992861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
8002861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(target)");
8012861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
8022861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
8032861e737e84e4884109b9526ac645194ba892a74Michal Krol}
8042861e737e84e4884109b9526ac645194ba892a74Michal Krol
8052861e737e84e4884109b9526ac645194ba892a74Michal Krol
8062861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
8072861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte *name,
8082861e737e84e4884109b9526ac645194ba892a74Michal Krol                                GLfloat x, GLfloat y, GLfloat z, GLfloat w)
8092861e737e84e4884109b9526ac645194ba892a74Michal Krol{
810122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program *prog;
811122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_fragment_program *fragProg;
8122861e737e84e4884109b9526ac645194ba892a74Michal Krol   GLfloat *v;
8132861e737e84e4884109b9526ac645194ba892a74Michal Krol
8142861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
8152861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
8162861e737e84e4884109b9526ac645194ba892a74Michal Krol
817027ed1b505a1bf6e3f5ad4412734d7edf337c08bBrian Paul   FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS);
8182861e737e84e4884109b9526ac645194ba892a74Michal Krol
8194d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul   prog = _mesa_lookup_program(ctx, id);
8202861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!prog || prog->Target != GL_FRAGMENT_PROGRAM_NV) {
8212861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glProgramNamedParameterNV");
8222861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
8232861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
8242861e737e84e4884109b9526ac645194ba892a74Michal Krol
8252861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (len <= 0) {
8269ca83924848070d02a5ac2f0aa4e20444eec2183Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glProgramNamedParameterNV(len)");
8272861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
8282861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
8292861e737e84e4884109b9526ac645194ba892a74Michal Krol
830122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   fragProg = (struct gl_fragment_program *) prog;
831de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   v = _mesa_lookup_parameter_value(fragProg->Base.Parameters, len,
832de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul                                    (char *) name);
8332861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (v) {
8342861e737e84e4884109b9526ac645194ba892a74Michal Krol      v[0] = x;
8352861e737e84e4884109b9526ac645194ba892a74Michal Krol      v[1] = y;
8362861e737e84e4884109b9526ac645194ba892a74Michal Krol      v[2] = z;
8372861e737e84e4884109b9526ac645194ba892a74Michal Krol      v[3] = w;
8382861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
8392861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
8402861e737e84e4884109b9526ac645194ba892a74Michal Krol
8419ca83924848070d02a5ac2f0aa4e20444eec2183Brian Paul   _mesa_error(ctx, GL_INVALID_VALUE, "glProgramNamedParameterNV(name)");
8422861e737e84e4884109b9526ac645194ba892a74Michal Krol}
8432861e737e84e4884109b9526ac645194ba892a74Michal Krol
8442861e737e84e4884109b9526ac645194ba892a74Michal Krol
8452861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
8462861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte *name,
8472861e737e84e4884109b9526ac645194ba892a74Michal Krol                                 const float v[])
8482861e737e84e4884109b9526ac645194ba892a74Michal Krol{
8492861e737e84e4884109b9526ac645194ba892a74Michal Krol   _mesa_ProgramNamedParameter4fNV(id, len, name, v[0], v[1], v[2], v[3]);
8502861e737e84e4884109b9526ac645194ba892a74Michal Krol}
8512861e737e84e4884109b9526ac645194ba892a74Michal Krol
8522861e737e84e4884109b9526ac645194ba892a74Michal Krol
8532861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
8542861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte *name,
8552861e737e84e4884109b9526ac645194ba892a74Michal Krol                                GLdouble x, GLdouble y, GLdouble z, GLdouble w)
8562861e737e84e4884109b9526ac645194ba892a74Michal Krol{
8572861e737e84e4884109b9526ac645194ba892a74Michal Krol   _mesa_ProgramNamedParameter4fNV(id, len, name, (GLfloat)x, (GLfloat)y,
8582861e737e84e4884109b9526ac645194ba892a74Michal Krol                                   (GLfloat)z, (GLfloat)w);
8592861e737e84e4884109b9526ac645194ba892a74Michal Krol}
8602861e737e84e4884109b9526ac645194ba892a74Michal Krol
8612861e737e84e4884109b9526ac645194ba892a74Michal Krol
8622861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
8632861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte *name,
8642861e737e84e4884109b9526ac645194ba892a74Michal Krol                                 const double v[])
8652861e737e84e4884109b9526ac645194ba892a74Michal Krol{
8662861e737e84e4884109b9526ac645194ba892a74Michal Krol   _mesa_ProgramNamedParameter4fNV(id, len, name,
8672861e737e84e4884109b9526ac645194ba892a74Michal Krol                                   (GLfloat)v[0], (GLfloat)v[1],
8682861e737e84e4884109b9526ac645194ba892a74Michal Krol                                   (GLfloat)v[2], (GLfloat)v[3]);
8692861e737e84e4884109b9526ac645194ba892a74Michal Krol}
8702861e737e84e4884109b9526ac645194ba892a74Michal Krol
8712861e737e84e4884109b9526ac645194ba892a74Michal Krol
8722861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
8732861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte *name,
8742861e737e84e4884109b9526ac645194ba892a74Michal Krol                                   GLfloat *params)
8752861e737e84e4884109b9526ac645194ba892a74Michal Krol{
876122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program *prog;
877122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_fragment_program *fragProg;
8782861e737e84e4884109b9526ac645194ba892a74Michal Krol   const GLfloat *v;
8792861e737e84e4884109b9526ac645194ba892a74Michal Krol
8802861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
8812861e737e84e4884109b9526ac645194ba892a74Michal Krol
882548be3846db59ad43934a159c051b359db6e56dbBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
8832861e737e84e4884109b9526ac645194ba892a74Michal Krol
8844d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul   prog = _mesa_lookup_program(ctx, id);
8852861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!prog || prog->Target != GL_FRAGMENT_PROGRAM_NV) {
8862861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramNamedParameterNV");
8872861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
8882861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
8892861e737e84e4884109b9526ac645194ba892a74Michal Krol
8902861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (len <= 0) {
8912861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramNamedParameterNV");
8922861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
8932861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
8942861e737e84e4884109b9526ac645194ba892a74Michal Krol
895122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   fragProg = (struct gl_fragment_program *) prog;
896de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   v = _mesa_lookup_parameter_value(fragProg->Base.Parameters,
897de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul                                    len, (char *) name);
8982861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (v) {
8992861e737e84e4884109b9526ac645194ba892a74Michal Krol      params[0] = v[0];
9002861e737e84e4884109b9526ac645194ba892a74Michal Krol      params[1] = v[1];
9012861e737e84e4884109b9526ac645194ba892a74Michal Krol      params[2] = v[2];
9022861e737e84e4884109b9526ac645194ba892a74Michal Krol      params[3] = v[3];
9032861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
9042861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
9052861e737e84e4884109b9526ac645194ba892a74Michal Krol
9062861e737e84e4884109b9526ac645194ba892a74Michal Krol   _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramNamedParameterNV");
9072861e737e84e4884109b9526ac645194ba892a74Michal Krol}
9082861e737e84e4884109b9526ac645194ba892a74Michal Krol
9092861e737e84e4884109b9526ac645194ba892a74Michal Krol
9102861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
9112861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetProgramNamedParameterdvNV(GLuint id, GLsizei len, const GLubyte *name,
9122861e737e84e4884109b9526ac645194ba892a74Michal Krol                                   GLdouble *params)
9132861e737e84e4884109b9526ac645194ba892a74Michal Krol{
9142861e737e84e4884109b9526ac645194ba892a74Michal Krol   GLfloat floatParams[4];
9152861e737e84e4884109b9526ac645194ba892a74Michal Krol   _mesa_GetProgramNamedParameterfvNV(id, len, name, floatParams);
9162861e737e84e4884109b9526ac645194ba892a74Michal Krol   COPY_4V(params, floatParams);
9172861e737e84e4884109b9526ac645194ba892a74Michal Krol}
918