1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 6.5.2 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file nvprogram.c 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NVIDIA vertex/fragment program state management functions. 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \author Brian Paul 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Regarding GL_NV_fragment/vertex_program, GL_NV_vertex_program1_1, etc: 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Portions of this software may use or implement intellectual 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * property owned and licensed by NVIDIA Corporation. NVIDIA disclaims 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * any and all warranties with respect to such intellectual property, 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * including any use thereof or modifications thereto. 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/hash.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/macros.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/nvprogram.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program/arbprogparse.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program/nvfragparse.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program/nvvertparse.h" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program/program.h" 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program/prog_instruction.h" 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program/prog_parameter.h" 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Execute a vertex state program. 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ExecuteProgramNV(GLenum target, GLuint id, const GLfloat *params) 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_vertex_program *vprog; 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target != GL_VERTEX_STATE_PROGRAM_NV) { 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glExecuteProgramNV"); 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_PROGRAM); 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vprog = gl_vertex_program(_mesa_lookup_program(ctx, id)); 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vprog || vprog->Base.Target != GL_VERTEX_STATE_PROGRAM_NV) { 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glExecuteProgramNV"); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "glExecuteProgramNV() not supported"); 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Determine if a set of programs is resident in hardware. 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Not compiled into display lists. 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean GLAPIENTRY 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_AreProgramsResidentNV(GLsizei n, const GLuint *ids, 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean *residences) 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i, j; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean allResident = GL_TRUE; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_WITH_RETVAL(ctx, GL_FALSE); 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (n < 0) { 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV(n)"); 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_program *prog; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ids[i] == 0) { 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV"); 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog = _mesa_lookup_program(ctx, ids[i]); 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog) { 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glAreProgramsResidentNV"); 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog->Resident) { 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!allResident) 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org residences[i] = GL_TRUE; 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (allResident) { 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org allResident = GL_FALSE; 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < i; j++) 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org residences[j] = GL_TRUE; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org residences[i] = GL_FALSE; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return allResident; 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Request that a set of programs be resident in hardware. 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_RequestResidentProgramsNV(GLsizei n, const GLuint *ids) 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (n < 0) { 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(n)"); 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* just error checking for now */ 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program *prog; 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ids[i] == 0) { 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(id)"); 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog = _mesa_lookup_program(ctx, ids[i]); 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog) { 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glRequestResidentProgramsNV(id)"); 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX this is really a hardware thing we should hook out */ 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog->Resident = GL_TRUE; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get a program parameter register. 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Not compiled into display lists. 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetProgramParameterfvNV(GLenum target, GLuint index, 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum pname, GLfloat *params) 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == GL_VERTEX_PROGRAM_NV) { 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_PROGRAM_PARAMETER_NV) { 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index < MAX_NV_VERTEX_PROGRAM_PARAMS) { 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(params, ctx->VertexProgram.Parameters[index]); 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glGetProgramParameterfvNV(index)"); 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterfvNV(pname)"); 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterfvNV(target)"); 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get a program parameter register. 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Not compiled into display lists. 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetProgramParameterdvNV(GLenum target, GLuint index, 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum pname, GLdouble *params) 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == GL_VERTEX_PROGRAM_NV) { 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname == GL_PROGRAM_PARAMETER_NV) { 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index < MAX_NV_VERTEX_PROGRAM_PARAMS) { 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(params, ctx->VertexProgram.Parameters[index]); 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glGetProgramParameterdvNV(index)"); 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterdvNV(pname)"); 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramParameterdvNV(target)"); 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get a program attribute. 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Not compiled into display lists. 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetProgramivNV(GLuint id, GLenum pname, GLint *params) 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program *prog; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog = _mesa_lookup_program(ctx, id); 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog) { 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramivNV"); 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROGRAM_TARGET_NV: 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *params = prog->Target; 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROGRAM_LENGTH_NV: 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *params = prog->String ?(GLint) strlen((char *) prog->String) : 0; 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROGRAM_RESIDENT_NV: 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *params = prog->Resident; 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramivNV(pname)"); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the program source code. 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Not compiled into display lists. 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetProgramStringNV(GLuint id, GLenum pname, GLubyte *program) 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program *prog; 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname != GL_PROGRAM_STRING_NV) { 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetProgramStringNV(pname)"); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog = _mesa_lookup_program(ctx, id); 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog) { 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramStringNV"); 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog->String) { 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(program, prog->String, strlen((char *) prog->String)); 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program[0] = 0; 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get matrix tracking information. 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Not compiled into display lists. 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetTrackMatrixivNV(GLenum target, GLuint address, 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum pname, GLint *params) 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == GL_VERTEX_PROGRAM_NV 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ctx->Extensions.NV_vertex_program) { 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((address & 0x3) || address >= MAX_NV_VERTEX_PROGRAM_PARAMS) { 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glGetTrackMatrixivNV(address)"); 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org i = address / 4; 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TRACK_MATRIX_NV: 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = (GLint) ctx->VertexProgram.TrackMatrix[i]; 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TRACK_MATRIX_TRANSFORM_NV: 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = (GLint) ctx->VertexProgram.TrackMatrixTransform[i]; 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetTrackMatrixivNV"); 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetTrackMatrixivNV"); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get a vertex (or vertex array) attribute. 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Not compiled into display lists. 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribdvNV(GLuint index, GLenum pname, GLdouble *params) 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_client_array *array; 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)"); 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ATTRIB_ARRAY_SIZE_NV: 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = array->Size; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ATTRIB_ARRAY_STRIDE_NV: 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = array->Stride; 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ATTRIB_ARRAY_TYPE_NV: 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = array->Type; 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CURRENT_ATTRIB_NV: 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index == 0) { 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glGetVertexAttribdvNV(index == 0)"); 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_CURRENT(ctx, 0); 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(params, ctx->Current.Attrib[index]); 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV"); 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get a vertex (or vertex array) attribute. 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Not compiled into display lists. 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribfvNV(GLuint index, GLenum pname, GLfloat *params) 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_client_array *array; 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)"); 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ATTRIB_ARRAY_SIZE_NV: 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = (GLfloat) array->Size; 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ATTRIB_ARRAY_STRIDE_NV: 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = (GLfloat) array->Stride; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ATTRIB_ARRAY_TYPE_NV: 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = (GLfloat) array->Type; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CURRENT_ATTRIB_NV: 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index == 0) { 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glGetVertexAttribfvNV(index == 0)"); 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_CURRENT(ctx, 0); 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(params, ctx->Current.Attrib[index]); 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV"); 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get a vertex (or vertex array) attribute. 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Not compiled into display lists. 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribivNV(GLuint index, GLenum pname, GLint *params) 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_client_array *array; 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribdvNV(index)"); 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org array = &ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)]; 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (pname) { 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ATTRIB_ARRAY_SIZE_NV: 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = array->Size; 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ATTRIB_ARRAY_STRIDE_NV: 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = array->Stride; 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ATTRIB_ARRAY_TYPE_NV: 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = array->Type; 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_CURRENT_ATTRIB_NV: 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index == 0) { 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glGetVertexAttribivNV(index == 0)"); 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_CURRENT(ctx, 0); 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = (GLint) ctx->Current.Attrib[index][0]; 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[1] = (GLint) ctx->Current.Attrib[index][1]; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[2] = (GLint) ctx->Current.Attrib[index][2]; 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[3] = (GLint) ctx->Current.Attrib[index][3]; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB: 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = array->BufferObj->Name; 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribdvNV"); 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get a vertex array attribute pointer. 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Not compiled into display lists. 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetVertexAttribPointervNV(GLuint index, GLenum pname, GLvoid **pointer) 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index >= MAX_NV_VERTEX_PROGRAM_INPUTS) { 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glGetVertexAttribPointerNV(index)"); 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (pname != GL_ATTRIB_ARRAY_POINTER_NV) { 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glGetVertexAttribPointerNV(pname)"); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *pointer = (GLvoid *) ctx->Array.ArrayObj->VertexAttrib[VERT_ATTRIB_GENERIC(index)].Ptr; 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_emit_nv_temp_initialization(struct gl_context *ctx, 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program *program) 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct prog_instruction *inst; 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_shader_compiler_options* options = 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &ctx->ShaderCompilerOptions[_mesa_program_target_to_index(program->Target)]; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!options->EmitNVTempInitialization) 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* We'll swizzle up a zero temporary so we can use it for the 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ARL. 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (program->NumTemporaries == 0) 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->NumTemporaries = 1; 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_insert_instructions(program, 0, program->NumTemporaries + 1); 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < program->NumTemporaries; i++) { 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct prog_instruction *inst = &program->Instructions[i]; 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Opcode = OPCODE_SWZ; 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->DstReg.File = PROGRAM_TEMPORARY; 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->DstReg.Index = i; 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->DstReg.WriteMask = WRITEMASK_XYZW; 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->SrcReg[0].File = PROGRAM_TEMPORARY; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->SrcReg[0].Index = 0; 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->SrcReg[0].Swizzle = MAKE_SWIZZLE4(SWIZZLE_ZERO, 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWIZZLE_ZERO, 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWIZZLE_ZERO, 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWIZZLE_ZERO); 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst = &program->Instructions[i]; 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->Opcode = OPCODE_ARL; 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->DstReg.File = PROGRAM_ADDRESS; 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->DstReg.Index = 0; 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->DstReg.WriteMask = WRITEMASK_XYZW; 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->SrcReg[0].File = PROGRAM_TEMPORARY; 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->SrcReg[0].Index = 0; 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->SrcReg[0].Swizzle = SWIZZLE_XXXX; 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (program->NumAddressRegs == 0) 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->NumAddressRegs = 1; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_setup_nv_temporary_count(struct gl_program *program) 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->NumTemporaries = 0; 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < program->NumInstructions; i++) { 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct prog_instruction *inst = &program->Instructions[i]; 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->DstReg.File == PROGRAM_TEMPORARY) { 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->NumTemporaries = MAX2(program->NumTemporaries, 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->DstReg.Index + 1); 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->SrcReg[0].File == PROGRAM_TEMPORARY) { 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->NumTemporaries = MAX2((GLint)program->NumTemporaries, 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->SrcReg[0].Index + 1); 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->SrcReg[1].File == PROGRAM_TEMPORARY) { 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->NumTemporaries = MAX2((GLint)program->NumTemporaries, 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->SrcReg[1].Index + 1); 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (inst->SrcReg[2].File == PROGRAM_TEMPORARY) { 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->NumTemporaries = MAX2((GLint)program->NumTemporaries, 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inst->SrcReg[2].Index + 1); 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Load/parse/compile a program. 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_LoadProgramNV(GLenum target, GLuint id, GLsizei len, 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *program) 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program *prog; 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.NV_vertex_program 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && !ctx->Extensions.NV_fragment_program) { 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glLoadProgramNV()"); 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (id == 0) { 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glLoadProgramNV(id)"); 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (len < 0) { 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glLoadProgramNV(len)"); 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_PROGRAM); 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog = _mesa_lookup_program(ctx, id); 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog && prog->Target != 0 && prog->Target != target) { 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glLoadProgramNV(target)"); 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((target == GL_VERTEX_PROGRAM_NV || 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target == GL_VERTEX_STATE_PROGRAM_NV) 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ctx->Extensions.NV_vertex_program) { 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_vertex_program *vprog = gl_vertex_program(prog); 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vprog || prog == &_mesa_DummyProgram) { 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org vprog = gl_vertex_program(ctx->Driver.NewProgram(ctx, target, id)); 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!vprog) { 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV"); 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_HashInsert(ctx->Shared->Programs, id, vprog); 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ARB_vertex_program 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && (strncmp((char *) program, "!!ARB", 5) == 0)) { 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_parse_arb_vertex_program(ctx, target, program, len, vprog); 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_parse_nv_vertex_program(ctx, target, program, len, vprog); 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (target == GL_FRAGMENT_PROGRAM_NV 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ctx->Extensions.NV_fragment_program) { 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_fragment_program *fprog = gl_fragment_program(prog); 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fprog || prog == &_mesa_DummyProgram) { 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprog = gl_fragment_program(ctx->Driver.NewProgram(ctx, target, id)); 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fprog) { 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV"); 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_HashInsert(ctx->Shared->Programs, id, fprog); 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_parse_nv_fragment_program(ctx, target, program, len, fprog); 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (target == GL_FRAGMENT_PROGRAM_ARB 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ctx->Extensions.ARB_fragment_program) { 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_fragment_program *fprog = gl_fragment_program(prog); 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fprog || prog == &_mesa_DummyProgram) { 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fprog = gl_fragment_program(ctx->Driver.NewProgram(ctx, target, id)); 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!fprog) { 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "glLoadProgramNV"); 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_HashInsert(ctx->Shared->Programs, id, fprog); 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_parse_arb_fragment_program(ctx, target, program, len, fprog); 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glLoadProgramNV(target)"); 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set a sequence of program parameter registers. 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ProgramParameters4dvNV(GLenum target, GLuint index, 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei num, const GLdouble *params) 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) { 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index + num > MAX_NV_VERTEX_PROGRAM_PARAMS) { 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameters4dvNV"); 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num; i++) { 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->VertexProgram.Parameters[index + i][0] = (GLfloat) params[0]; 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->VertexProgram.Parameters[index + i][1] = (GLfloat) params[1]; 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->VertexProgram.Parameters[index + i][2] = (GLfloat) params[2]; 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->VertexProgram.Parameters[index + i][3] = (GLfloat) params[3]; 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params += 4; 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameters4dvNV"); 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set a sequence of program parameter registers. 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ProgramParameters4fvNV(GLenum target, GLuint index, 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei num, const GLfloat *params) 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) { 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (index + num > MAX_NV_VERTEX_PROGRAM_PARAMS) { 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glProgramParameters4fvNV"); 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < num; i++) { 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(ctx->VertexProgram.Parameters[index + i], params); 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params += 4; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glProgramParameters4fvNV"); 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Setup tracking of matrices into program parameter registers. 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \note Called from the GL API dispatcher. 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TrackMatrixNV(GLenum target, GLuint address, 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum matrix, GLenum transform) 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_PROGRAM); 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == GL_VERTEX_PROGRAM_NV && ctx->Extensions.NV_vertex_program) { 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (address & 0x3) { 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* addr must be multiple of four */ 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glTrackMatrixNV(address)"); 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (matrix) { 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_NONE: 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MODELVIEW: 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROJECTION: 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE: 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COLOR: 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MODELVIEW_PROJECTION_NV: 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MATRIX0_NV: 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MATRIX1_NV: 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MATRIX2_NV: 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MATRIX3_NV: 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MATRIX4_NV: 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MATRIX5_NV: 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MATRIX6_NV: 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_MATRIX7_NV: 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* OK, fallthrough */ 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(matrix)"); 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (transform) { 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_IDENTITY_NV: 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INVERSE_NV: 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TRANSPOSE_NV: 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INVERSE_TRANSPOSE_NV: 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* OK, fallthrough */ 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(transform)"); 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->VertexProgram.TrackMatrix[address / 4] = matrix; 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->VertexProgram.TrackMatrixTransform[address / 4] = transform; 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glTrackMatrixNV(target)"); 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ProgramNamedParameter4fNV(GLuint id, GLsizei len, const GLubyte *name, 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat x, GLfloat y, GLfloat z, GLfloat w) 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program *prog; 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_fragment_program *fragProg; 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_constant_value *v; 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org FLUSH_VERTICES(ctx, _NEW_PROGRAM_CONSTANTS); 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog = _mesa_lookup_program(ctx, id); 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog || prog->Target != GL_FRAGMENT_PROGRAM_NV) { 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glProgramNamedParameterNV"); 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (len <= 0) { 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glProgramNamedParameterNV(len)"); 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fragProg = gl_fragment_program(prog); 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v = _mesa_lookup_parameter_value(fragProg->Base.Parameters, len, 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (char *) name); 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v) { 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[0].f = x; 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[1].f = y; 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[2].f = z; 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v[3].f = w; 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glProgramNamedParameterNV(name)"); 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ProgramNamedParameter4fvNV(GLuint id, GLsizei len, const GLubyte *name, 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const float v[]) 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_ProgramNamedParameter4fNV(id, len, name, v[0], v[1], v[2], v[3]); 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ProgramNamedParameter4dNV(GLuint id, GLsizei len, const GLubyte *name, 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLdouble x, GLdouble y, GLdouble z, GLdouble w) 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_ProgramNamedParameter4fNV(id, len, name, (GLfloat)x, (GLfloat)y, 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (GLfloat)z, (GLfloat)w); 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_ProgramNamedParameter4dvNV(GLuint id, GLsizei len, const GLubyte *name, 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const double v[]) 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_ProgramNamedParameter4fNV(id, len, name, 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (GLfloat)v[0], (GLfloat)v[1], 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (GLfloat)v[2], (GLfloat)v[3]); 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetProgramNamedParameterfvNV(GLuint id, GLsizei len, const GLubyte *name, 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *params) 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program *prog; 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_fragment_program *fragProg; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const gl_constant_value *v; 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END(ctx); 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prog = _mesa_lookup_program(ctx, id); 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!prog || prog->Target != GL_FRAGMENT_PROGRAM_NV) { 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glGetProgramNamedParameterNV"); 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (len <= 0) { 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramNamedParameterNV"); 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fragProg = gl_fragment_program(prog); 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org v = _mesa_lookup_parameter_value(fragProg->Base.Parameters, 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org len, (char *) name); 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (v) { 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[0] = v[0].f; 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[1] = v[1].f; 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[2] = v[2].f; 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org params[3] = v[3].f; 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glGetProgramNamedParameterNV"); 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_GetProgramNamedParameterdvNV(GLuint id, GLsizei len, const GLubyte *name, 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLdouble *params) 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat floatParams[4]; 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_GetProgramNamedParameterfvNV(id, len, name, floatParams); 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4V(params, floatParams); 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 918