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