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