arbprogparse.c revision f9995b30756140724f41daf963fa06167912be7f
140322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen/* 240322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * Mesa 3-D graphics library 3ab31a3a7647ca1b1567dbc58c6093c523173c988Brian * Version: 7.1 440322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * 57d2b6a0466038ebefa4ac4d139cec4987f60d585Brian * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 640322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * 740322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * Permission is hereby granted, free of charge, to any person obtaining a 840322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * copy of this software and associated documentation files (the "Software"), 940322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * to deal in the Software without restriction, including without limitation 1040322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * the rights to use, copy, modify, merge, publish, distribute, sublicense, 1140322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * and/or sell copies of the Software, and to permit persons to whom the 1240322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * Software is furnished to do so, subject to the following conditions: 1340322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * 1440322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * The above copyright notice and this permission notice shall be included 1540322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * in all copies or substantial portions of the Software. 1640322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * 1740322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 1840322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 1940322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 2040322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 2140322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 2240322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2340322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen */ 2440322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen 2540322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen#define DEBUG_PARSING 0 2640322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen 2740322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen/** 2840322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * \file arbprogparse.c 2940322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * ARB_*_program parser core 3040322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen * \author Karl Rasche 3140322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen */ 3240322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen 330576e837f18ad9925d732f883f4922c907d7bafbBrian Paul/** 340576e837f18ad9925d732f883f4922c907d7bafbBrian PaulNotes on program parameters, etc. 350576e837f18ad9925d732f883f4922c907d7bafbBrian Paul 360576e837f18ad9925d732f883f4922c907d7bafbBrian PaulThe instructions we emit will use six kinds of source registers: 370576e837f18ad9925d732f883f4922c907d7bafbBrian Paul 380576e837f18ad9925d732f883f4922c907d7bafbBrian Paul PROGRAM_INPUT - input registers 390576e837f18ad9925d732f883f4922c907d7bafbBrian Paul PROGRAM_TEMPORARY - temp registers 400576e837f18ad9925d732f883f4922c907d7bafbBrian Paul PROGRAM_ADDRESS - address/indirect register 410576e837f18ad9925d732f883f4922c907d7bafbBrian Paul PROGRAM_SAMPLER - texture sampler 420576e837f18ad9925d732f883f4922c907d7bafbBrian Paul PROGRAM_CONSTANT - indexes into program->Parameters, a known constant/literal 430576e837f18ad9925d732f883f4922c907d7bafbBrian Paul PROGRAM_STATE_VAR - indexes into program->Parameters, and may actually be: 440576e837f18ad9925d732f883f4922c907d7bafbBrian Paul + a state variable, like "state.fog.color", or 450576e837f18ad9925d732f883f4922c907d7bafbBrian Paul + a pointer to a "program.local[k]" parameter, or 460576e837f18ad9925d732f883f4922c907d7bafbBrian Paul + a pointer to a "program.env[k]" parameter 470576e837f18ad9925d732f883f4922c907d7bafbBrian Paul 480576e837f18ad9925d732f883f4922c907d7bafbBrian PaulBasically, all the program.local[] and program.env[] values will get mapped 490576e837f18ad9925d732f883f4922c907d7bafbBrian Paulinto the unified gl_program->Parameters array. This solves the problem of 500576e837f18ad9925d732f883f4922c907d7bafbBrian Paulhaving three separate program parameter arrays. 510576e837f18ad9925d732f883f4922c907d7bafbBrian Paul*/ 520576e837f18ad9925d732f883f4922c907d7bafbBrian Paul 530576e837f18ad9925d732f883f4922c907d7bafbBrian Paul 54c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/glheader.h" 55c223c6b663cd5db39ba19c2be74b88cc3b8f53f3Brian#include "main/imports.h" 56bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/context.h" 57bbd287103dad776d8a45c87c4e51fbc26d9b80d5Brian Paul#include "main/mtypes.h" 5840322e1dfa3366a779ba3f4a6ec4418ab9227715Jouk Jansen#include "arbprogparse.h" 59c0ef16647424452ba60e165c82c59f5ff64f12d4Brian Paul#include "programopt.h" 60c0551f0a465b577a17698ede46370a17e29b3df7Brian#include "prog_parameter.h" 61c0551f0a465b577a17698ede46370a17e29b3df7Brian#include "prog_statevars.h" 62c0551f0a465b577a17698ede46370a17e29b3df7Brian#include "prog_instruction.h" 63770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick#include "program_parser.h" 648c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 658c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 668c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paulvoid 67f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_parse_arb_fragment_program(struct gl_context* ctx, GLenum target, 688c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul const GLvoid *str, GLsizei len, 69122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul struct gl_fragment_program *program) 708c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul{ 71770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct gl_program prog; 72770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_parser_state state; 738c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul GLuint i; 748c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 758c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul ASSERT(target == GL_FRAGMENT_PROGRAM_ARB); 76770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 77770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(&prog, 0, sizeof(prog)); 78770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(&state, 0, sizeof(state)); 79770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state.prog = &prog; 80770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 81770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len, 82770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick &state)) { 838c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul /* Error in the program. Just return. */ 848c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul return; 858c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul } 868c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 87d8e256f9236d3e9dfd433c3a59718f0fdf1ca79aIan Romanick if (program->Base.String != NULL) 8832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(program->Base.String); 89d8e256f9236d3e9dfd433c3a59718f0fdf1ca79aIan Romanick 908c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul /* Copy the relevant contents of the arb_program struct into the 918c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul * fragment_program struct. 928c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul */ 93770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.String = prog.String; 94770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumInstructions = prog.NumInstructions; 95770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumTemporaries = prog.NumTemporaries; 96770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumParameters = prog.NumParameters; 97770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumAttributes = prog.NumAttributes; 98770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumAddressRegs = prog.NumAddressRegs; 99770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumNativeInstructions = prog.NumNativeInstructions; 100770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumNativeTemporaries = prog.NumNativeTemporaries; 101770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumNativeParameters = prog.NumNativeParameters; 102770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumNativeAttributes = prog.NumNativeAttributes; 103770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumNativeAddressRegs = prog.NumNativeAddressRegs; 104770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumAluInstructions = prog.NumAluInstructions; 105770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumTexInstructions = prog.NumTexInstructions; 106770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumTexIndirections = prog.NumTexIndirections; 107770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumNativeAluInstructions = prog.NumAluInstructions; 108770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumNativeTexInstructions = prog.NumTexInstructions; 109770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumNativeTexIndirections = prog.NumTexIndirections; 110770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.InputsRead = prog.InputsRead; 111770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.OutputsWritten = prog.OutputsWritten; 11256643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul program->Base.IndirectRegisterFiles = prog.IndirectRegisterFiles; 1131af2b14514146d5f0d48a45165a579e88cc7a867Brian Paul for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++) { 1146f8214cae613bc3bead215214e092c07793975e7Ian Romanick program->Base.TexturesUsed[i] = prog.TexturesUsed[i]; 1156f8214cae613bc3bead215214e092c07793975e7Ian Romanick if (prog.TexturesUsed[i]) 1161af2b14514146d5f0d48a45165a579e88cc7a867Brian Paul program->Base.SamplersUsed |= (1 << i); 1171af2b14514146d5f0d48a45165a579e88cc7a867Brian Paul } 1186f8214cae613bc3bead215214e092c07793975e7Ian Romanick program->Base.ShadowSamplers = prog.ShadowSamplers; 119770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick switch (state.option.Fog) { 120770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case OPTION_FOG_EXP: program->FogOption = GL_EXP; break; 121770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case OPTION_FOG_EXP2: program->FogOption = GL_EXP2; break; 122770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick case OPTION_FOG_LINEAR: program->FogOption = GL_LINEAR; break; 123770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick default: program->FogOption = GL_NONE; break; 124770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick } 125e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri program->OriginUpperLeft = state.option.OriginUpperLeft; 126e59353f592ef587d34279f0735f06053e289a7b4Luca Barbieri program->PixelCenterInteger = state.option.PixelCenterInteger; 127770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 128770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->UsesKill = state.fragment.UsesKill; 1298c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 130f8baad2d255c77c47dddeddcaf719e163e9556fbBrian Paul if (program->FogOption) 131f8baad2d255c77c47dddeddcaf719e163e9556fbBrian Paul program->Base.InputsRead |= FRAG_BIT_FOGC; 132b3e8e1cd4c1584f735e35914861ae2e8ae5b6b2bKeith Whitwell 1338c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul if (program->Base.Instructions) 13432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(program->Base.Instructions); 135770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.Instructions = prog.Instructions; 1368c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 1378c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul if (program->Base.Parameters) 1388c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul _mesa_free_parameter_list(program->Base.Parameters); 139770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.Parameters = prog.Parameters; 1408c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 141c0ef16647424452ba60e165c82c59f5ff64f12d4Brian Paul /* Append fog instructions now if the program has "OPTION ARB_fog_exp" 142c0ef16647424452ba60e165c82c59f5ff64f12d4Brian Paul * or similar. We used to leave this up to drivers, but it appears 143c0ef16647424452ba60e165c82c59f5ff64f12d4Brian Paul * there's no hardware that wants to do fog in a discrete stage separate 144c0ef16647424452ba60e165c82c59f5ff64f12d4Brian Paul * from the fragment shader. 145c0ef16647424452ba60e165c82c59f5ff64f12d4Brian Paul */ 146c0ef16647424452ba60e165c82c59f5ff64f12d4Brian Paul if (program->FogOption != GL_NONE) { 147c0ef16647424452ba60e165c82c59f5ff64f12d4Brian Paul _mesa_append_fog_code(ctx, program); 148c0ef16647424452ba60e165c82c59f5ff64f12d4Brian Paul program->FogOption = GL_NONE; 149c0ef16647424452ba60e165c82c59f5ff64f12d4Brian Paul } 150c0ef16647424452ba60e165c82c59f5ff64f12d4Brian Paul 1518c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul#if DEBUG_FP 152298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("____________Fragment program %u ________\n", program->Base.Id); 15311a54c38f7d9c84da591ff084590c9928ac4ee0dBrian Paul _mesa_print_program(&program->Base); 1548c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul#endif 1558c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul} 1568c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 1578c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 1588c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 1598c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul/** 1608c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul * Parse the vertex program string. If success, update the given 1618c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul * vertex_program object with the new program. Else, leave the vertex_program 1628c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul * object unchanged. 1638c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul */ 1648c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paulvoid 165f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_parse_arb_vertex_program(struct gl_context *ctx, GLenum target, 1668c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul const GLvoid *str, GLsizei len, 167122629f27925a9dc50029bebc5079f87f416a7e1Brian Paul struct gl_vertex_program *program) 1688c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul{ 169770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct gl_program prog; 170770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick struct asm_parser_state state; 1718c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 1728c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul ASSERT(target == GL_VERTEX_PROGRAM_ARB); 1738c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 174770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(&prog, 0, sizeof(prog)); 175770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick memset(&state, 0, sizeof(state)); 176770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick state.prog = &prog; 177770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick 178770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len, 179770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick &state)) { 1803075f267cd8ea3d434ecd33357c45cd4b37be151Brian _mesa_error(ctx, GL_INVALID_OPERATION, "glProgramString(bad program)"); 1818c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul return; 1828c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul } 1838c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 184d8e256f9236d3e9dfd433c3a59718f0fdf1ca79aIan Romanick if (program->Base.String != NULL) 18532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(program->Base.String); 186d8e256f9236d3e9dfd433c3a59718f0fdf1ca79aIan Romanick 1878c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul /* Copy the relevant contents of the arb_program struct into the 1888c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul * vertex_program struct. 1898c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul */ 190770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.String = prog.String; 191770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumInstructions = prog.NumInstructions; 192770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumTemporaries = prog.NumTemporaries; 193770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumParameters = prog.NumParameters; 194770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumAttributes = prog.NumAttributes; 195770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumAddressRegs = prog.NumAddressRegs; 196770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumNativeInstructions = prog.NumNativeInstructions; 197770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumNativeTemporaries = prog.NumNativeTemporaries; 198770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumNativeParameters = prog.NumNativeParameters; 199770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumNativeAttributes = prog.NumNativeAttributes; 200770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.NumNativeAddressRegs = prog.NumNativeAddressRegs; 201770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.InputsRead = prog.InputsRead; 202770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.OutputsWritten = prog.OutputsWritten; 20356643096f1eb01eefa1a532ac096b32d23b6b8baBrian Paul program->Base.IndirectRegisterFiles = prog.IndirectRegisterFiles; 204770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->IsPositionInvariant = (state.option.PositionInvariant) 205770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick ? GL_TRUE : GL_FALSE; 2068c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 2078c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul if (program->Base.Instructions) 20832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(program->Base.Instructions); 209770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.Instructions = prog.Instructions; 2108c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 2118c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul if (program->Base.Parameters) 2128c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul _mesa_free_parameter_list(program->Base.Parameters); 213770cebbc29863ae944a31463ee4bdeb789105abaIan Romanick program->Base.Parameters = prog.Parameters; 2148c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul 215ea8db5c3329bdee6ea0ca9b347730ec348d7c0afIan Romanick#if DEBUG_VP 216298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("____________Vertex program %u __________\n", program->Base.Id); 2178c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul _mesa_print_program(&program->Base); 2188c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul#endif 2198c41a14c5ef0b8d2b0f1a1cd094f5abc41fa48f8Brian Paul} 220