1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.1 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008 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#define DEBUG_PARSING 0 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file arbprogparse.c 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ARB_*_program parser core 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \author Karl Rasche 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgNotes on program parameters, etc. 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgThe instructions we emit will use six kinds of source registers: 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROGRAM_INPUT - input registers 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROGRAM_TEMPORARY - temp registers 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROGRAM_ADDRESS - address/indirect register 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROGRAM_SAMPLER - texture sampler 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROGRAM_CONSTANT - indexes into program->Parameters, a known constant/literal 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org PROGRAM_STATE_VAR - indexes into program->Parameters, and may actually be: 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org + a state variable, like "state.fog.color", or 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org + a pointer to a "program.local[k]" parameter, or 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org + a pointer to a "program.env[k]" parameter 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgBasically, all the program.local[] and program.env[] values will get mapped 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orginto the unified gl_program->Parameters array. This solves the problem of 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orghaving three separate program parameter arrays. 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org*/ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/glheader.h" 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/imports.h" 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/context.h" 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "main/mtypes.h" 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "arbprogparse.h" 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "programopt.h" 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "prog_parameter.h" 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "prog_statevars.h" 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "prog_instruction.h" 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "program_parser.h" 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_parse_arb_fragment_program(struct gl_context* ctx, GLenum target, 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *str, GLsizei len, 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_fragment_program *program) 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program prog; 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct asm_parser_state state; 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(target == GL_FRAGMENT_PROGRAM_ARB); 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&prog, 0, sizeof(prog)); 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&state, 0, sizeof(state)); 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.prog = &prog; 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len, 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &state)) { 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Error in the program. Just return. */ 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (program->Base.String != NULL) 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(program->Base.String); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Copy the relevant contents of the arb_program struct into the 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fragment_program struct. 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.String = prog.String; 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumInstructions = prog.NumInstructions; 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumTemporaries = prog.NumTemporaries; 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumParameters = prog.NumParameters; 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumAttributes = prog.NumAttributes; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumAddressRegs = prog.NumAddressRegs; 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumNativeInstructions = prog.NumNativeInstructions; 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumNativeTemporaries = prog.NumNativeTemporaries; 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumNativeParameters = prog.NumNativeParameters; 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumNativeAttributes = prog.NumNativeAttributes; 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumNativeAddressRegs = prog.NumNativeAddressRegs; 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumAluInstructions = prog.NumAluInstructions; 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumTexInstructions = prog.NumTexInstructions; 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumTexIndirections = prog.NumTexIndirections; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumNativeAluInstructions = prog.NumAluInstructions; 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumNativeTexInstructions = prog.NumTexInstructions; 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumNativeTexIndirections = prog.NumTexIndirections; 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.InputsRead = prog.InputsRead; 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.OutputsWritten = prog.OutputsWritten; 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.IndirectRegisterFiles = prog.IndirectRegisterFiles; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++) { 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.TexturesUsed[i] = prog.TexturesUsed[i]; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prog.TexturesUsed[i]) 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.SamplersUsed |= (1 << i); 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.ShadowSamplers = prog.ShadowSamplers; 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->OriginUpperLeft = state.option.OriginUpperLeft; 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->PixelCenterInteger = state.option.PixelCenterInteger; 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->UsesKill = state.fragment.UsesKill; 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->UsesDFdy = state.fragment.UsesDFdy; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (program->Base.Instructions) 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(program->Base.Instructions); 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.Instructions = prog.Instructions; 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (program->Base.Parameters) 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_free_parameter_list(program->Base.Parameters); 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.Parameters = prog.Parameters; 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Append fog instructions now if the program has "OPTION ARB_fog_exp" 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * or similar. We used to leave this up to drivers, but it appears 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * there's no hardware that wants to do fog in a discrete stage separate 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * from the fragment shader. 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (state.option.Fog != OPTION_NONE) { 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const GLenum fog_modes[4] = { 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_NONE, GL_EXP, GL_EXP2, GL_LINEAR 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX: we should somehow recompile this to remove clamping if disabled 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * On the ATI driver, this is unclampled if fragment clamping is disabled 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_append_fog_code(ctx, program, fog_modes[state.option.Fog], GL_TRUE); 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DEBUG_FP 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("____________Fragment program %u ________\n", program->Base.Id); 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_print_program(&program->Base); 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Parse the vertex program string. If success, update the given 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vertex_program object with the new program. Else, leave the vertex_program 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * object unchanged. 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_parse_arb_vertex_program(struct gl_context *ctx, GLenum target, 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *str, GLsizei len, 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_vertex_program *program) 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_program prog; 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct asm_parser_state state; 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(target == GL_VERTEX_PROGRAM_ARB); 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&prog, 0, sizeof(prog)); 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memset(&state, 0, sizeof(state)); 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org state.prog = &prog; 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_mesa_parse_arb_program(ctx, target, (const GLubyte*) str, len, 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &state)) { 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glProgramString(bad program)"); 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (program->Base.String != NULL) 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(program->Base.String); 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Copy the relevant contents of the arb_program struct into the 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * vertex_program struct. 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.String = prog.String; 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumInstructions = prog.NumInstructions; 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumTemporaries = prog.NumTemporaries; 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumParameters = prog.NumParameters; 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumAttributes = prog.NumAttributes; 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumAddressRegs = prog.NumAddressRegs; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumNativeInstructions = prog.NumNativeInstructions; 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumNativeTemporaries = prog.NumNativeTemporaries; 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumNativeParameters = prog.NumNativeParameters; 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumNativeAttributes = prog.NumNativeAttributes; 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.NumNativeAddressRegs = prog.NumNativeAddressRegs; 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.InputsRead = prog.InputsRead; 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.OutputsWritten = prog.OutputsWritten; 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.IndirectRegisterFiles = prog.IndirectRegisterFiles; 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->IsPositionInvariant = (state.option.PositionInvariant) 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? GL_TRUE : GL_FALSE; 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (program->Base.Instructions) 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(program->Base.Instructions); 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.Instructions = prog.Instructions; 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (program->Base.Parameters) 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_free_parameter_list(program->Base.Parameters); 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org program->Base.Parameters = prog.Parameters; 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if DEBUG_VP 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("____________Vertex program %u __________\n", program->Base.Id); 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_print_program(&program->Base); 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 218