/*
 * Mesa 3-D graphics library
 * Version:  7.0.3
 *
 * Copyright (C) 1999-2007  Brian Paul   All Rights Reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#ifndef PROG_EXECUTE_H
#define PROG_EXECUTE_H

#include "main/config.h"
#include "main/mtypes.h"


typedef void (*FetchTexelLodFunc)(struct gl_context *ctx, const GLfloat texcoord[4],
                                  GLfloat lambda, GLuint unit, GLfloat color[4]);

typedef void (*FetchTexelDerivFunc)(struct gl_context *ctx, const GLfloat texcoord[4],
                                    const GLfloat texdx[4],
                                    const GLfloat texdy[4],
                                    GLfloat lodBias,
                                    GLuint unit, GLfloat color[4]);


/** NOTE: This must match SWRAST_MAX_WIDTH */
#define PROG_MAX_WIDTH 16384


/**
 * Virtual machine state used during execution of vertex/fragment programs.
 */
struct gl_program_machine
{
   const struct gl_program *CurProgram;

   /** Fragment Input attributes */
   GLfloat (*Attribs)[PROG_MAX_WIDTH][4];
   GLfloat (*DerivX)[4];
   GLfloat (*DerivY)[4];
   GLuint NumDeriv; /**< Max index into DerivX/Y arrays */
   GLuint CurElement; /**< Index into Attribs arrays */

   /** Vertex Input attribs */
   GLfloat VertAttribs[VERT_ATTRIB_MAX][4];

   GLfloat Temporaries[MAX_PROGRAM_TEMPS][4];
   GLfloat Outputs[MAX_PROGRAM_OUTPUTS][4];
   GLfloat (*EnvParams)[4]; /**< Vertex or Fragment env parameters */
   GLuint CondCodes[4];  /**< COND_* value for x/y/z/w */
   GLint AddressReg[MAX_PROGRAM_ADDRESS_REGS][4];
   GLfloat SystemValues[SYSTEM_VALUE_MAX][4];

   const GLubyte *Samplers;  /** Array mapping sampler var to tex unit */

   GLuint CallStack[MAX_PROGRAM_CALL_DEPTH]; /**< For CAL/RET instructions */
   GLuint StackDepth; /**< Index/ptr to top of CallStack[] */

   /** Texture fetch functions */
   FetchTexelLodFunc FetchTexelLod;
   FetchTexelDerivFunc FetchTexelDeriv;
};


extern void
_mesa_get_program_register(struct gl_context *ctx, gl_register_file file,
                           GLuint index, GLfloat val[4]);

extern GLboolean
_mesa_execute_program(struct gl_context *ctx,
                      const struct gl_program *program,
                      struct gl_program_machine *machine);


#endif /* PROG_EXECUTE_H */
