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"
450117da40cd7edd3d165bb28569c289b37eca12b9Vinson Lee#include "main/mtypes.h"
467936e06657bc43de80ae4f56ee9db956e193d880Brian Paul#include "main/nvprogram.h"
47ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/arbprogparse.h"
48ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/nvfragparse.h"
49ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/nvvertparse.h"
50ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/program.h"
51ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_instruction.h"
52ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_parameter.h"
532861e737e84e4884109b9526ac645194ba892a74Michal Krol
542861e737e84e4884109b9526ac645194ba892a74Michal Krol
552861e737e84e4884109b9526ac645194ba892a74Michal Krol
562861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
572861e737e84e4884109b9526ac645194ba892a74Michal Krol * Execute a vertex state program.
582861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
592861e737e84e4884109b9526ac645194ba892a74Michal Krol */
602861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
612861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params)
622861e737e84e4884109b9526ac645194ba892a74Michal Krol{
63122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_vertex_program *vprog;
642861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
652861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
662861e737e84e4884109b9526ac645194ba892a74Michal Krol
672861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target != GL_VERTEX_STATE_PROGRAM_NV) {
682861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glExecuteProgramNV");
692861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
702861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
712861e737e84e4884109b9526ac645194ba892a74Michal Krol
722861e737e84e4884109b9526ac645194ba892a74Michal Krol   FLUSH_VERTICES(ctx, _NEW_PROGRAM);
732861e737e84e4884109b9526ac645194ba892a74Michal Krol
74e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul   vprog = gl_vertex_program(_mesa_lookup_program(ctx, id));
752861e737e84e4884109b9526ac645194ba892a74Michal Krol
762861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!vprog || vprog->Base.Target != GL_VERTEX_STATE_PROGRAM_NV) {
772861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glExecuteProgramNV");
782861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
792861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
802861e737e84e4884109b9526ac645194ba892a74Michal Krol
81740a8b0b66f0e00807f064e3105fd6b045e5a2d0Brian   _mesa_problem(ctx, "glExecuteProgramNV() not supported");
822861e737e84e4884109b9526ac645194ba892a74Michal Krol}
832861e737e84e4884109b9526ac645194ba892a74Michal Krol
842861e737e84e4884109b9526ac645194ba892a74Michal Krol
852861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
862861e737e84e4884109b9526ac645194ba892a74Michal Krol * Determine if a set of programs is resident in hardware.
872861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
882861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
892861e737e84e4884109b9526ac645194ba892a74Michal Krol */
9081968ec49d9e06be0e095fa0084aa61b68b23d75Brian PaulGLboolean GLAPIENTRY
9181968ec49d9e06be0e095fa0084aa61b68b23d75Brian Paul_mesa_AreProgramsResidentNV(GLsizei n, const GLuint *ids,
9281968ec49d9e06be0e095fa0084aa61b68b23d75Brian Paul                            GLboolean *residences)
932861e737e84e4884109b9526ac645194ba892a74Michal Krol{
942861e737e84e4884109b9526ac645194ba892a74Michal Krol   GLint i, j;
952861e737e84e4884109b9526ac645194ba892a74Michal Krol   GLboolean allResident = GL_TRUE;
962861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
972861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE);
982861e737e84e4884109b9526ac645194ba892a74Michal Krol
992861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (n < 0) {
1002861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV(n)");
1012861e737e84e4884109b9526ac645194ba892a74Michal Krol      return GL_FALSE;
1022861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
1032861e737e84e4884109b9526ac645194ba892a74Michal Krol
1042861e737e84e4884109b9526ac645194ba892a74Michal Krol   for (i = 0; i < n; i++) {
105122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul      const struct gl_program *prog;
1062861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (ids[i] == 0) {
1072861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV");
1082861e737e84e4884109b9526ac645194ba892a74Michal Krol         return GL_FALSE;
1092861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1104d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul      prog = _mesa_lookup_program(ctx, ids[i]);
1112861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (!prog) {
1122861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV");
1132861e737e84e4884109b9526ac645194ba892a74Michal Krol         return GL_FALSE;
1142861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1152861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (prog->Resident) {
1162861e737e84e4884109b9526ac645194ba892a74Michal Krol	 if (!allResident)
1172861e737e84e4884109b9526ac645194ba892a74Michal Krol	    residences[i] = GL_TRUE;
1182861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1192861e737e84e4884109b9526ac645194ba892a74Michal Krol      else {
1202861e737e84e4884109b9526ac645194ba892a74Michal Krol         if (allResident) {
1212861e737e84e4884109b9526ac645194ba892a74Michal Krol	    allResident = GL_FALSE;
1222861e737e84e4884109b9526ac645194ba892a74Michal Krol	    for (j = 0; j < i; j++)
1232861e737e84e4884109b9526ac645194ba892a74Michal Krol	       residences[j] = GL_TRUE;
1242861e737e84e4884109b9526ac645194ba892a74Michal Krol	 }
1252861e737e84e4884109b9526ac645194ba892a74Michal Krol	 residences[i] = GL_FALSE;
1262861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1272861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
1282861e737e84e4884109b9526ac645194ba892a74Michal Krol
1292861e737e84e4884109b9526ac645194ba892a74Michal Krol   return allResident;
1302861e737e84e4884109b9526ac645194ba892a74Michal Krol}
1312861e737e84e4884109b9526ac645194ba892a74Michal Krol
1322861e737e84e4884109b9526ac645194ba892a74Michal Krol
1332861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
1342861e737e84e4884109b9526ac645194ba892a74Michal Krol * Request that a set of programs be resident in hardware.
1352861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
1362861e737e84e4884109b9526ac645194ba892a74Michal Krol */
1372861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
1382861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_RequestResidentProgramsNV(GLsizei n, const GLuint *ids)
1392861e737e84e4884109b9526ac645194ba892a74Michal Krol{
1402861e737e84e4884109b9526ac645194ba892a74Michal Krol   GLint i;
1412861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
1422861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
1432861e737e84e4884109b9526ac645194ba892a74Michal Krol
1442861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (n < 0) {
1452861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(n)");
1462861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
1472861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
1482861e737e84e4884109b9526ac645194ba892a74Michal Krol
1492861e737e84e4884109b9526ac645194ba892a74Michal Krol   /* just error checking for now */
1502861e737e84e4884109b9526ac645194ba892a74Michal Krol   for (i = 0; i < n; i++) {
151122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul      struct gl_program *prog;
1522861e737e84e4884109b9526ac645194ba892a74Michal Krol
1532861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (ids[i] == 0) {
1542861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(id)");
1552861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
1562861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1572861e737e84e4884109b9526ac645194ba892a74Michal Krol
1584d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul      prog = _mesa_lookup_program(ctx, ids[i]);
1592861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (!prog) {
1602861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(id)");
1612861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
1622861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1632861e737e84e4884109b9526ac645194ba892a74Michal Krol
1649ca83924848070d02a5ac2f0aa4e20444eec2183Brian Paul      /* XXX this is really a hardware thing we should hook out */
1652861e737e84e4884109b9526ac645194ba892a74Michal Krol      prog->Resident = GL_TRUE;
1662861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
1672861e737e84e4884109b9526ac645194ba892a74Michal Krol}
1682861e737e84e4884109b9526ac645194ba892a74Michal Krol
1692861e737e84e4884109b9526ac645194ba892a74Michal Krol
1702861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
1712861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a program parameter register.
1722861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
1732861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
1742861e737e84e4884109b9526ac645194ba892a74Michal Krol */
1752861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
1762861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetProgramParameterfvNV(GLenum target, GLuint index,
1772861e737e84e4884109b9526ac645194ba892a74Michal Krol                              GLenum pname, GLfloat *params)
1782861e737e84e4884109b9526ac645194ba892a74Michal Krol{
1792861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
1802861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
1812861e737e84e4884109b9526ac645194ba892a74Michal Krol
1822861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target == GL_VERTEX_PROGRAM_NV) {
1832861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (pname == GL_PROGRAM_PARAMETER_NV) {
1842861e737e84e4884109b9526ac645194ba892a74Michal Krol         if (index < MAX_NV_VERTEX_PROGRAM_PARAMS) {
1852861e737e84e4884109b9526ac645194ba892a74Michal Krol            COPY_4V(params, ctx->VertexProgram.Parameters[index]);
1862861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
1872861e737e84e4884109b9526ac645194ba892a74Michal Krol         else {
1882861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_INVALID_VALUE,
1892861e737e84e4884109b9526ac645194ba892a74Michal Krol                        "glGetProgramParameterfvNV(index)");
1902861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
1912861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
1922861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1932861e737e84e4884109b9526ac645194ba892a74Michal Krol      else {
1942861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterfvNV(pname)");
1952861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
1962861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
1972861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
1982861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
1992861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterfvNV(target)");
2002861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
2012861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2022861e737e84e4884109b9526ac645194ba892a74Michal Krol}
2032861e737e84e4884109b9526ac645194ba892a74Michal Krol
2042861e737e84e4884109b9526ac645194ba892a74Michal Krol
2052861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
2062861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a program parameter register.
2072861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
2082861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
2092861e737e84e4884109b9526ac645194ba892a74Michal Krol */
2102861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
2112861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetProgramParameterdvNV(GLenum target, GLuint index,
2122861e737e84e4884109b9526ac645194ba892a74Michal Krol                              GLenum pname, GLdouble *params)
2132861e737e84e4884109b9526ac645194ba892a74Michal Krol{
2142861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
2152861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
2162861e737e84e4884109b9526ac645194ba892a74Michal Krol
2172861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target == GL_VERTEX_PROGRAM_NV) {
2182861e737e84e4884109b9526ac645194ba892a74Michal Krol      if (pname == GL_PROGRAM_PARAMETER_NV) {
2192861e737e84e4884109b9526ac645194ba892a74Michal Krol         if (index < MAX_NV_VERTEX_PROGRAM_PARAMS) {
2202861e737e84e4884109b9526ac645194ba892a74Michal Krol            COPY_4V(params, ctx->VertexProgram.Parameters[index]);
2212861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
2222861e737e84e4884109b9526ac645194ba892a74Michal Krol         else {
2232861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_INVALID_VALUE,
2242861e737e84e4884109b9526ac645194ba892a74Michal Krol                        "glGetProgramParameterdvNV(index)");
2252861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
2262861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
2272861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
2282861e737e84e4884109b9526ac645194ba892a74Michal Krol      else {
2292861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterdvNV(pname)");
2302861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
2312861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
2322861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2332861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
2342861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterdvNV(target)");
2352861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
2362861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2372861e737e84e4884109b9526ac645194ba892a74Michal Krol}
2382861e737e84e4884109b9526ac645194ba892a74Michal Krol
2392861e737e84e4884109b9526ac645194ba892a74Michal Krol
2402861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
2412861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a program attribute.
2422861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
2432861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
2442861e737e84e4884109b9526ac645194ba892a74Michal Krol */
2452861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
2462861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetProgramivNV(GLuint id, GLenum pname, GLint *params)
2472861e737e84e4884109b9526ac645194ba892a74Michal Krol{
248122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program *prog;
2492861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
2502861e737e84e4884109b9526ac645194ba892a74Michal Krol
251548be3846db59ad43934a159c051b359db6e56dbBrian Paul   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:
26421d0c70b4b1c18dc1c3ac7d0fbd8a903d60f8be7Kenneth Graunke         *params = prog->String ?(GLint) 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
287548be3846db59ad43934a159c051b359db6e56dbBrian Paul   ASSERT_OUTSIDE_BEGIN_END(ctx);
2882861e737e84e4884109b9526ac645194ba892a74Michal Krol
2892861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (pname != GL_PROGRAM_STRING_NV) {
2902861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramStringNV(pname)");
2912861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
2922861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2932861e737e84e4884109b9526ac645194ba892a74Michal Krol
2944d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul   prog = _mesa_lookup_program(ctx, id);
2952861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (!prog) {
2962861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramStringNV");
2972861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
2982861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
2992861e737e84e4884109b9526ac645194ba892a74Michal Krol
3002861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (prog->String) {
301e197de56cdb86835f1437688a9161cd909792d80Brian Paul      memcpy(program, prog->String, strlen((char *) prog->String));
3022861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3032861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
3042861e737e84e4884109b9526ac645194ba892a74Michal Krol      program[0] = 0;
3052861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3062861e737e84e4884109b9526ac645194ba892a74Michal Krol}
3072861e737e84e4884109b9526ac645194ba892a74Michal Krol
3082861e737e84e4884109b9526ac645194ba892a74Michal Krol
3092861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
3102861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get matrix tracking information.
3112861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
3122861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
3132861e737e84e4884109b9526ac645194ba892a74Michal Krol */
3142861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
3152861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetTrackMatrixivNV(GLenum target, GLuint address,
3162861e737e84e4884109b9526ac645194ba892a74Michal Krol                         GLenum pname, GLint *params)
3172861e737e84e4884109b9526ac645194ba892a74Michal Krol{
3182861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
3192861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
3202861e737e84e4884109b9526ac645194ba892a74Michal Krol
3212861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (target == GL_VERTEX_PROGRAM_NV
3222861e737e84e4884109b9526ac645194ba892a74Michal Krol       && ctx->Extensions.NV_vertex_program) {
3232861e737e84e4884109b9526ac645194ba892a74Michal Krol      GLuint i;
3242861e737e84e4884109b9526ac645194ba892a74Michal Krol
3252861e737e84e4884109b9526ac645194ba892a74Michal Krol      if ((address & 0x3) || address >= MAX_NV_VERTEX_PROGRAM_PARAMS) {
3262861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_VALUE, "glGetTrackMatrixivNV(address)");
3272861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
3282861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
3292861e737e84e4884109b9526ac645194ba892a74Michal Krol
3302861e737e84e4884109b9526ac645194ba892a74Michal Krol      i = address / 4;
3312861e737e84e4884109b9526ac645194ba892a74Michal Krol
3322861e737e84e4884109b9526ac645194ba892a74Michal Krol      switch (pname) {
3332861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_TRACK_MATRIX_NV:
3342861e737e84e4884109b9526ac645194ba892a74Michal Krol            params[0] = (GLint) ctx->VertexProgram.TrackMatrix[i];
3352861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
3362861e737e84e4884109b9526ac645194ba892a74Michal Krol         case GL_TRACK_MATRIX_TRANSFORM_NV:
3372861e737e84e4884109b9526ac645194ba892a74Michal Krol            params[0] = (GLint) ctx->VertexProgram.TrackMatrixTransform[i];
3382861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
3392861e737e84e4884109b9526ac645194ba892a74Michal Krol         default:
3402861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_INVALID_ENUM, "glGetTrackMatrixivNV");
3412861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
3422861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
3432861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3442861e737e84e4884109b9526ac645194ba892a74Michal Krol   else {
3452861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glGetTrackMatrixivNV");
3462861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
3472861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3482861e737e84e4884109b9526ac645194ba892a74Michal Krol}
3492861e737e84e4884109b9526ac645194ba892a74Michal Krol
3502861e737e84e4884109b9526ac645194ba892a74Michal Krol
3512861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
3522861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a vertex (or vertex array) attribute.
3532861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
3542861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
3552861e737e84e4884109b9526ac645194ba892a74Michal Krol */
3562861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
3572861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble *params)
3582861e737e84e4884109b9526ac645194ba892a74Michal Krol{
359667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul   const struct gl_client_array *array;
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
368762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)];
369667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul
3702861e737e84e4884109b9526ac645194ba892a74Michal Krol   switch (pname) {
3712861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_SIZE_NV:
372667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->Size;
3732861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
3742861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_STRIDE_NV:
375667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->Stride;
3762861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
3772861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_TYPE_NV:
378667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->Type;
3792861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
3802861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_CURRENT_ATTRIB_NV:
381120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         if (index == 0) {
382120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            _mesa_error(ctx, GL_INVALID_OPERATION,
383120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul                        "glGetVertexAttribdvNV(index == 0)");
384120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            return;
385120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         }
3862861e737e84e4884109b9526ac645194ba892a74Michal Krol	 FLUSH_CURRENT(ctx, 0);
3872861e737e84e4884109b9526ac645194ba892a74Michal Krol         COPY_4V(params, ctx->Current.Attrib[index]);
3882861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
3892861e737e84e4884109b9526ac645194ba892a74Michal Krol      default:
3902861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
3912861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
3922861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
3932861e737e84e4884109b9526ac645194ba892a74Michal Krol}
3942861e737e84e4884109b9526ac645194ba892a74Michal Krol
3952861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
3962861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a vertex (or vertex array) attribute.
3972861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
3982861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
3992861e737e84e4884109b9526ac645194ba892a74Michal Krol */
4002861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
4012861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat *params)
4022861e737e84e4884109b9526ac645194ba892a74Michal Krol{
403667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul   const struct gl_client_array *array;
4042861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
4052861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
4062861e737e84e4884109b9526ac645194ba892a74Michal Krol
407120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
4082861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)");
4092861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
4102861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
4112861e737e84e4884109b9526ac645194ba892a74Michal Krol
412762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)];
413667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul
4142861e737e84e4884109b9526ac645194ba892a74Michal Krol   switch (pname) {
4152861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_SIZE_NV:
416667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = (GLfloat) array->Size;
4172861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4182861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_STRIDE_NV:
419667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = (GLfloat) array->Stride;
4202861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4212861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_TYPE_NV:
422667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = (GLfloat) array->Type;
4232861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4242861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_CURRENT_ATTRIB_NV:
425120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         if (index == 0) {
426120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            _mesa_error(ctx, GL_INVALID_OPERATION,
427120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul                        "glGetVertexAttribfvNV(index == 0)");
428120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            return;
429120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         }
4302861e737e84e4884109b9526ac645194ba892a74Michal Krol	 FLUSH_CURRENT(ctx, 0);
4312861e737e84e4884109b9526ac645194ba892a74Michal Krol         COPY_4V(params, ctx->Current.Attrib[index]);
4322861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4332861e737e84e4884109b9526ac645194ba892a74Michal Krol      default:
4342861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
4352861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
4362861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
4372861e737e84e4884109b9526ac645194ba892a74Michal Krol}
4382861e737e84e4884109b9526ac645194ba892a74Michal Krol
4392861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
4402861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a vertex (or vertex array) attribute.
4412861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
4422861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
4432861e737e84e4884109b9526ac645194ba892a74Michal Krol */
4442861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
4452861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetVertexAttribivNV(GLuint index, GLenum pname, GLint *params)
4462861e737e84e4884109b9526ac645194ba892a74Michal Krol{
447667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul   const struct gl_client_array *array;
4482861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
4492861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
4502861e737e84e4884109b9526ac645194ba892a74Michal Krol
451120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
4522861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)");
4532861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
4542861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
4552861e737e84e4884109b9526ac645194ba892a74Michal Krol
456762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)];
457667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul
4582861e737e84e4884109b9526ac645194ba892a74Michal Krol   switch (pname) {
4592861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_SIZE_NV:
460667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->Size;
4612861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4622861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_STRIDE_NV:
463667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->Stride;
4642861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4652861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_ATTRIB_ARRAY_TYPE_NV:
466667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->Type;
4672861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4682861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_CURRENT_ATTRIB_NV:
469120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         if (index == 0) {
470120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            _mesa_error(ctx, GL_INVALID_OPERATION,
471120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul                        "glGetVertexAttribivNV(index == 0)");
472120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul            return;
473120584a1e650c5c72c889666a82624af4f5df1c1Brian Paul         }
4742861e737e84e4884109b9526ac645194ba892a74Michal Krol	 FLUSH_CURRENT(ctx, 0);
4752861e737e84e4884109b9526ac645194ba892a74Michal Krol         params[0] = (GLint) ctx->Current.Attrib[index][0];
4762861e737e84e4884109b9526ac645194ba892a74Michal Krol         params[1] = (GLint) ctx->Current.Attrib[index][1];
4772861e737e84e4884109b9526ac645194ba892a74Michal Krol         params[2] = (GLint) ctx->Current.Attrib[index][2];
4782861e737e84e4884109b9526ac645194ba892a74Michal Krol         params[3] = (GLint) ctx->Current.Attrib[index][3];
4792861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4802861e737e84e4884109b9526ac645194ba892a74Michal Krol      case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB:
481667a4037fac4fd154ebfa7513b3bbba935077241Brian Paul         params[0] = array->BufferObj->Name;
4822861e737e84e4884109b9526ac645194ba892a74Michal Krol         break;
4832861e737e84e4884109b9526ac645194ba892a74Michal Krol      default:
4842861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV");
4852861e737e84e4884109b9526ac645194ba892a74Michal Krol         return;
4862861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
4872861e737e84e4884109b9526ac645194ba892a74Michal Krol}
4882861e737e84e4884109b9526ac645194ba892a74Michal Krol
4892861e737e84e4884109b9526ac645194ba892a74Michal Krol
4902861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
4912861e737e84e4884109b9526ac645194ba892a74Michal Krol * Get a vertex array attribute pointer.
4922861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Not compiled into display lists.
4932861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
4942861e737e84e4884109b9526ac645194ba892a74Michal Krol */
4952861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
4962861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_GetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid **pointer)
4972861e737e84e4884109b9526ac645194ba892a74Michal Krol{
4982861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
4992861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
5002861e737e84e4884109b9526ac645194ba892a74Michal Krol
5012861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) {
5022861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerNV(index)");
5032861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
5042861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
5052861e737e84e4884109b9526ac645194ba892a74Michal Krol
5062861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (pname != GL_ATTRIB_ARRAY_POINTER_NV) {
5072861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerNV(pname)");
5082861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
5092861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
5102861e737e84e4884109b9526ac645194ba892a74Michal Krol
511762c9766c93697af8d7fbaa729aed118789dbe8eMathias Fröhlich   *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr;
5122861e737e84e4884109b9526ac645194ba892a74Michal Krol}
5132861e737e84e4884109b9526ac645194ba892a74Michal Krol
514726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholtvoid
515f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_emit_nv_temp_initialization(struct gl_context *ctx,
516726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt				  struct gl_program *program)
517726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt{
518726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   struct prog_instruction *inst;
51920fbb24b67dda0679774756e4b6d98c2c66c2c42Brian Paul   GLuint i;
5206d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri   struct gl_shader_compiler_options* options =
5216d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri         &ctx->ShaderCompilerOptions[_mesa_program_target_to_index(program->Target)];
522726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt
5236d3a2c97f4a78e85545286e0e126cd3a27bd1cbdLuca Barbieri   if (!options->EmitNVTempInitialization)
524726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      return;
525726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt
526726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   /* We'll swizzle up a zero temporary so we can use it for the
527726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt    * ARL.
528726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt    */
529726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   if (program->NumTemporaries == 0)
530726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      program->NumTemporaries = 1;
5312861e737e84e4884109b9526ac645194ba892a74Michal Krol
532726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   _mesa_insert_instructions(program, 0, program->NumTemporaries + 1);
533726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt
534726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   for (i = 0; i < program->NumTemporaries; i++) {
535726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      struct prog_instruction *inst = &program->Instructions[i];
536726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt
537726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->Opcode = OPCODE_SWZ;
538726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->DstReg.File = PROGRAM_TEMPORARY;
539726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->DstReg.Index = i;
540726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->DstReg.WriteMask = WRITEMASK_XYZW;
541726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->SrcReg[0].File = PROGRAM_TEMPORARY;
542726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->SrcReg[0].Index = 0;
543726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      inst->SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_ZERO,
544726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt					      SWIZZLE_ZERO,
545726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt					      SWIZZLE_ZERO,
546726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt					      SWIZZLE_ZERO);
547726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   }
548726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt
549726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst = &program->Instructions[i];
550726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->Opcode = OPCODE_ARL;
551726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->DstReg.File = PROGRAM_ADDRESS;
552726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->DstReg.Index = 0;
553726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->DstReg.WriteMask = WRITEMASK_XYZW;
554726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->SrcReg[0].File = PROGRAM_TEMPORARY;
555726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->SrcReg[0].Index = 0;
556726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   inst->SrcReg[0].Swizzle = SWIZZLE_XXXX;
557726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt
558726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt   if (program->NumAddressRegs == 0)
559726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt      program->NumAddressRegs = 1;
560726a04a2cd1bf159a6c40584b4b2b9bc5948a82eEric Anholt}
5612861e737e84e4884109b9526ac645194ba892a74Michal Krol
562601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholtvoid
563e12b4752ef3cbc181d84c1eba672760f120ad346Ian Romanick_mesa_setup_nv_temporary_count(struct gl_program *program)
564601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt{
56520fbb24b67dda0679774756e4b6d98c2c66c2c42Brian Paul   GLuint i;
566601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt
567601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt   program->NumTemporaries = 0;
568601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt   for (i = 0; i < program->NumInstructions; i++) {
569601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      struct prog_instruction *inst = &program->Instructions[i];
570601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt
571601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      if (inst->DstReg.File == PROGRAM_TEMPORARY) {
572601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt	 program->NumTemporaries = MAX2(program->NumTemporaries,
573601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt					inst->DstReg.Index + 1);
574601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      }
575601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      if (inst->SrcReg[0].File == PROGRAM_TEMPORARY) {
576b30898f4ab533085d97a33638ad0a1cf9ddb1d67Karl Schultz	 program->NumTemporaries = MAX2((GLint)program->NumTemporaries,
577601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt					inst->SrcReg[0].Index + 1);
578601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      }
579601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      if (inst->SrcReg[1].File == PROGRAM_TEMPORARY) {
580b30898f4ab533085d97a33638ad0a1cf9ddb1d67Karl Schultz	 program->NumTemporaries = MAX2((GLint)program->NumTemporaries,
581601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt					inst->SrcReg[1].Index + 1);
582601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      }
583601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      if (inst->SrcReg[2].File == PROGRAM_TEMPORARY) {
584b30898f4ab533085d97a33638ad0a1cf9ddb1d67Karl Schultz	 program->NumTemporaries = MAX2((GLint)program->NumTemporaries,
585601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt					inst->SrcReg[2].Index + 1);
586601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt      }
587601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt   }
588601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt}
589601769a2c0071e23ade32de4e8911d75d7f324d2Eric Anholt
5902861e737e84e4884109b9526ac645194ba892a74Michal Krol/**
5912861e737e84e4884109b9526ac645194ba892a74Michal Krol * Load/parse/compile a program.
5922861e737e84e4884109b9526ac645194ba892a74Michal Krol * \note Called from the GL API dispatcher.
5932861e737e84e4884109b9526ac645194ba892a74Michal Krol */
5942861e737e84e4884109b9526ac645194ba892a74Michal Krolvoid GLAPIENTRY
5952861e737e84e4884109b9526ac645194ba892a74Michal Krol_mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len,
5962861e737e84e4884109b9526ac645194ba892a74Michal Krol                    const GLubyte *program)
5972861e737e84e4884109b9526ac645194ba892a74Michal Krol{
598122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul   struct gl_program *prog;
5992861e737e84e4884109b9526ac645194ba892a74Michal Krol   GET_CURRENT_CONTEXT(ctx);
6002861e737e84e4884109b9526ac645194ba892a74Michal Krol   ASSERT_OUTSIDE_BEGIN_END(ctx);
6012861e737e84e4884109b9526ac645194ba892a74Michal Krol
6022cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick   if (!ctx->Extensions.NV_vertex_program
6032cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick       && !ctx->Extensions.NV_fragment_program) {
6042cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick      _mesa_error(ctx, GL_INVALID_OPERATION, "glLoadProgramNV()");
6052cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick      return;
6062cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick   }
6072cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick
6082861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (id == 0) {
6092861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_VALUE, "glLoadProgramNV(id)");
6102861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
6118a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul   }
6128a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul
6138a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul   if (len < 0) {
6148a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul      _mesa_error(ctx, GL_INVALID_VALUE, "glLoadProgramNV(len)");
6158a97946e0a25aff2d56bbaf3ed20ba1588129993Brian Paul      return;
6162861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
6172861e737e84e4884109b9526ac645194ba892a74Michal Krol
6182861e737e84e4884109b9526ac645194ba892a74Michal Krol   FLUSH_VERTICES(ctx, _NEW_PROGRAM);
6192861e737e84e4884109b9526ac645194ba892a74Michal Krol
6204d12a05e6c11ca8d7325503131b2594dfe304164Brian Paul   prog = _mesa_lookup_program(ctx, id);
6212861e737e84e4884109b9526ac645194ba892a74Michal Krol
6222861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (prog && prog->Target != 0 && prog->Target != target) {
6232861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_error(ctx, GL_INVALID_OPERATION, "glLoadProgramNV(target)");
6242861e737e84e4884109b9526ac645194ba892a74Michal Krol      return;
6252861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
6262861e737e84e4884109b9526ac645194ba892a74Michal Krol
6272861e737e84e4884109b9526ac645194ba892a74Michal Krol   if ((target == GL_VERTEX_PROGRAM_NV ||
6282861e737e84e4884109b9526ac645194ba892a74Michal Krol        target == GL_VERTEX_STATE_PROGRAM_NV)
6292861e737e84e4884109b9526ac645194ba892a74Michal Krol       && ctx->Extensions.NV_vertex_program) {
630e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul      struct gl_vertex_program *vprog = gl_vertex_program(prog);
6319ca83924848070d02a5ac2f0aa4e20444eec2183Brian Paul      if (!vprog || prog == &_mesa_DummyProgram) {
632e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul         vprog = gl_vertex_program(ctx->Driver.NewProgram(ctx, target, id));
6332861e737e84e4884109b9526ac645194ba892a74Michal Krol         if (!vprog) {
6342861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV");
6352861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
6362861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
6372861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_HashInsert(ctx->Shared->Programs, id, vprog);
6382861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
6392cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick
6402cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick      if (ctx->Extensions.ARB_vertex_program
6412cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick	  && (strncmp((char *) program, "!!ARB", 5) == 0)) {
6422cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick	 _mesa_parse_arb_vertex_program(ctx, target, program, len, vprog);
6432cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick      } else {
6442cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick	 _mesa_parse_nv_vertex_program(ctx, target, program, len, vprog);
6452cda507fa170c040e207190dee44d1be5e8572f7Ian Romanick      }
6462861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
6472861e737e84e4884109b9526ac645194ba892a74Michal Krol   else if (target == GL_FRAGMENT_PROGRAM_NV
6482861e737e84e4884109b9526ac645194ba892a74Michal Krol            && ctx->Extensions.NV_fragment_program) {
649e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul      struct gl_fragment_program *fprog = gl_fragment_program(prog);
6509ca83924848070d02a5ac2f0aa4e20444eec2183Brian Paul      if (!fprog || prog == &_mesa_DummyProgram) {
651e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul         fprog = gl_fragment_program(ctx->Driver.NewProgram(ctx, target, id));
6522861e737e84e4884109b9526ac645194ba892a74Michal Krol         if (!fprog) {
6532861e737e84e4884109b9526ac645194ba892a74Michal Krol            _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV");
6542861e737e84e4884109b9526ac645194ba892a74Michal Krol            return;
6552861e737e84e4884109b9526ac645194ba892a74Michal Krol         }
6562861e737e84e4884109b9526ac645194ba892a74Michal Krol         _mesa_HashInsert(ctx->Shared->Programs, id, fprog);
6572861e737e84e4884109b9526ac645194ba892a74Michal Krol      }
6582861e737e84e4884109b9526ac645194ba892a74Michal Krol      _mesa_parse_nv_fragment_program(ctx, target, program, len, fprog);
6592861e737e84e4884109b9526ac645194ba892a74Michal Krol   }
660289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick   else if (target == GL_FRAGMENT_PROGRAM_ARB
661289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick            && ctx->Extensions.ARB_fragment_program) {
662e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul      struct gl_fragment_program *fprog = gl_fragment_program(prog);
663289db82b2d42b0d79fd0c01781612bd4e69a9474Ian Romanick      if (!fprog || prog == &_mesa_DummyProgram) {
664e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul         fprog = gl_fragment_program(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,
68648af60b46540a30c3754f0e59801a62dfb1a146dBrian Paul                             GLsizei 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) {
69248af60b46540a30c3754f0e59801a62dfb1a146dBrian Paul      GLint 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,
71848af60b46540a30c3754f0e59801a62dfb1a146dBrian Paul                             GLsizei 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) {
72448af60b46540a30c3754f0e59801a62dfb1a146dBrian Paul      GLint 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;
812a0eb83401ef599e597b72e70c8856e1bc0f59dccBrian Paul   gl_constant_value *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
830e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul   fragProg = gl_fragment_program(prog);
831de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   v = _mesa_lookup_parameter_value(fragProg->Base.Parameters, len,
832de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul                                    (char *) name);
8332861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (v) {
834a0eb83401ef599e597b72e70c8856e1bc0f59dccBrian Paul      v[0].f = x;
835a0eb83401ef599e597b72e70c8856e1bc0f59dccBrian Paul      v[1].f = y;
836a0eb83401ef599e597b72e70c8856e1bc0f59dccBrian Paul      v[2].f = z;
837a0eb83401ef599e597b72e70c8856e1bc0f59dccBrian Paul      v[3].f = 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;
878a0eb83401ef599e597b72e70c8856e1bc0f59dccBrian Paul   const gl_constant_value *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
895e4f8d33aea7e0112dfbf3a38fdc36d11b2e7be10Brian Paul   fragProg = gl_fragment_program(prog);
896de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul   v = _mesa_lookup_parameter_value(fragProg->Base.Parameters,
897de99760bf3511d05185799c4fb4347f9e5f420f4Brian Paul                                    len, (char *) name);
8982861e737e84e4884109b9526ac645194ba892a74Michal Krol   if (v) {
899a0eb83401ef599e597b72e70c8856e1bc0f59dccBrian Paul      params[0] = v[0].f;
900a0eb83401ef599e597b72e70c8856e1bc0f59dccBrian Paul      params[1] = v[1].f;
901a0eb83401ef599e597b72e70c8856e1bc0f59dccBrian Paul      params[2] = v[2].f;
902a0eb83401ef599e597b72e70c8856e1bc0f59dccBrian Paul      params[3] = v[3].f;
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