/*
* Mesa 3-D graphics library
- * Version: 6.2
+ * Version: 6.5
*
- * Copyright (C) 1999-2004 Brian Paul All Rights Reserved.
+ * Copyright (C) 1999-2005 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"),
*/
#include "glheader.h"
-#include "context.h"
#include "imports.h"
-#include "macros.h"
-#include "mtypes.h"
#include "program.h"
#include "arbprogparse.h"
#include "arbfragparse.h"
-void
-_mesa_debug_fp_inst(GLint num, struct fp_instruction *fp)
-{
- GLint a;
-
- static const char *opcode_string[] = {
- "ABS", /* ARB_f_p only */
- "ADD",
- "CMP", /* ARB_f_p only */
- "COS",
- "DDX", /* NV_f_p only */
- "DDY", /* NV_f_p only */
- "DP3",
- "DP4",
- "DPH", /* ARB_f_p only */
- "DST",
- "END", /* private opcode */
- "EX2",
- "FLR",
- "FRC",
- "KIL", /* ARB_f_p only */
- "KIL_NV", /* NV_f_p only */
- "LG2",
- "LIT",
- "LRP",
- "MAD",
- "MAX",
- "MIN",
- "MOV",
- "MUL",
- "PK2H", /* NV_f_p only */
- "PK2US", /* NV_f_p only */
- "PK4B", /* NV_f_p only */
- "PK4UB", /* NV_f_p only */
- "POW",
- "PRINT", /* Mesa only */
- "RCP",
- "RFL", /* NV_f_p only */
- "RSQ",
- "SCS", /* ARB_f_p only */
- "SEQ", /* NV_f_p only */
- "SFL", /* NV_f_p only */
- "SGE", /* NV_f_p only */
- "SGT", /* NV_f_p only */
- "SIN",
- "SLE", /* NV_f_p only */
- "SLT",
- "SNE", /* NV_f_p only */
- "STR", /* NV_f_p only */
- "SUB",
- "SWZ", /* ARB_f_p only */
- "TEX",
- "TXB", /* ARB_f_p only */
- "TXD", /* NV_f_p only */
- "TXP", /* ARB_f_p only */
- "TXP_NV", /* NV_f_p only */
- "UP2H", /* NV_f_p only */
- "UP2US", /* NV_f_p only */
- "UP4B", /* NV_f_p only */
- "UP4UB", /* NV_f_p only */
- "X2D", /* NV_f_p only - 2d mat mul */
- "XPD", /* ARB_f_p only - cross product */
- };
-
- static const char *file_string[] = {
- "TEMP",
- "INPUT",
- "OUTPUT",
- "LOCAL",
- "ENV",
- "NAMED",
- "STATE",
- "WRITE_ONLY",
- "ADDR"
- };
-
- static const char swz[] = "xyzw01??";
-
- for (a=0; a<num; a++) {
- _mesa_printf("%s", opcode_string[fp[a].Opcode]);
-
- if (fp[a].Saturate)
- _mesa_printf("_SAT");
-
- if (fp[a].DstReg.File != 0xf) {
- if (fp[a].DstReg.WriteMask != 0xf)
- _mesa_printf(" %s[%d].%s%s%s%s ", file_string[fp[a].DstReg.File], fp[a].DstReg.Index,
- GET_BIT(fp[a].DstReg.WriteMask, 0) ? "x" : "",
- GET_BIT(fp[a].DstReg.WriteMask, 1) ? "y" : "",
- GET_BIT(fp[a].DstReg.WriteMask, 2) ? "z" : "",
- GET_BIT(fp[a].DstReg.WriteMask, 3) ? "w" : "");
- else
- _mesa_printf(" %s[%d] ", file_string[fp[a].DstReg.File], fp[a].DstReg.Index);
- }
-
- /* Examine each bit of negatebase here as this may be a SWZ instruction
- */
- if (fp[a].SrcReg[0].File != 0xf) {
- if (fp[a].SrcReg[0].Swizzle != SWIZZLE_NOOP ||
- fp[a].SrcReg[0].NegateBase)
- _mesa_printf("%s[%d].%s%c%s%c%s%c%s%c ", file_string[fp[a].SrcReg[0].File], fp[a].SrcReg[0].Index,
- GET_BIT(fp[a].SrcReg[0].NegateBase, 0) ? "-" : "",
- swz[GET_SWZ(fp[a].SrcReg[0].Swizzle, 0)],
- GET_BIT(fp[a].SrcReg[0].NegateBase, 0) ? "-" : "",
- swz[GET_SWZ(fp[a].SrcReg[0].Swizzle, 1)],
- GET_BIT(fp[a].SrcReg[0].NegateBase, 0) ? "-" : "",
- swz[GET_SWZ(fp[a].SrcReg[0].Swizzle, 2)],
- GET_BIT(fp[a].SrcReg[0].NegateBase, 0) ? "-" : "",
- swz[GET_SWZ(fp[a].SrcReg[0].Swizzle, 3)]);
- else
- _mesa_printf("%s[%d] ", file_string[fp[a].SrcReg[0].File], fp[a].SrcReg[0].Index);
- }
-
- if (fp[a].SrcReg[1].File != 0xf) {
- if (fp[a].SrcReg[1].Swizzle != SWIZZLE_NOOP ||
- fp[a].SrcReg[1].NegateBase)
- _mesa_printf("%s[%d].%s%c%c%c%c ", file_string[fp[a].SrcReg[1].File], fp[a].SrcReg[1].Index,
- fp[a].SrcReg[1].NegateBase ? "-" : "",
- swz[GET_SWZ(fp[a].SrcReg[1].Swizzle, 0)],
- swz[GET_SWZ(fp[a].SrcReg[1].Swizzle, 1)],
- swz[GET_SWZ(fp[a].SrcReg[1].Swizzle, 2)],
- swz[GET_SWZ(fp[a].SrcReg[1].Swizzle, 3)]);
- else
- _mesa_printf("%s[%d] ", file_string[fp[a].SrcReg[1].File], fp[a].SrcReg[1].Index);
- }
-
- if (fp[a].SrcReg[2].File != 0xf) {
- if (fp[a].SrcReg[2].Swizzle != SWIZZLE_NOOP ||
- fp[a].SrcReg[2].NegateBase)
- _mesa_printf("%s[%d].%s%c%c%c%c ", file_string[fp[a].SrcReg[2].File], fp[a].SrcReg[2].Index,
- fp[a].SrcReg[1].NegateBase ? "-" : "",
- swz[GET_SWZ(fp[a].SrcReg[2].Swizzle, 0)],
- swz[GET_SWZ(fp[a].SrcReg[2].Swizzle, 1)],
- swz[GET_SWZ(fp[a].SrcReg[2].Swizzle, 2)],
- swz[GET_SWZ(fp[a].SrcReg[2].Swizzle, 3)]);
- else
- _mesa_printf("%s[%d] ", file_string[fp[a].SrcReg[2].File], fp[a].SrcReg[2].Index);
- }
-
- _mesa_printf("\n");
- }
-}
-
void
_mesa_parse_arb_fragment_program(GLcontext * ctx, GLenum target,
{
GLuint i;
struct arb_program ap;
+ struct prog_instruction *newInstructions;
(void) target;
/* set the program target before parsing */
/* Copy the relevant contents of the arb_program struct into the
* fragment_program struct.
*/
+ /* copy instruction buffer */
+ newInstructions = (struct prog_instruction *)
+ _mesa_malloc(ap.Base.NumInstructions * sizeof(struct prog_instruction));
+ if (!newInstructions) {
+ _mesa_error(ctx, GL_OUT_OF_MEMORY, "glProgramStringARB");
+ return;
+ }
+ _mesa_memcpy(newInstructions, ap.FPInstructions,
+ ap.Base.NumInstructions * sizeof(struct prog_instruction));
+ if (program->Base.Instructions)
+ _mesa_free(program->Base.Instructions);
+ program->Base.Instructions = newInstructions;
program->Base.String = ap.Base.String;
program->Base.NumInstructions = ap.Base.NumInstructions;
program->Base.NumTemporaries = ap.Base.NumTemporaries;
program->Base.NumParameters = ap.Base.NumParameters;
program->Base.NumAttributes = ap.Base.NumAttributes;
program->Base.NumAddressRegs = ap.Base.NumAddressRegs;
- program->NumAluInstructions = ap.NumAluInstructions;
- program->NumTexInstructions = ap.NumTexInstructions;
- program->NumTexIndirections = ap.NumTexIndirections;
-
- program->InputsRead = ap.InputsRead;
- program->OutputsWritten = ap.OutputsWritten;
+ program->NumAluInstructions = ap.NumAluInstructions;
+ program->NumTexInstructions = ap.NumTexInstructions;
+ program->NumTexIndirections = ap.NumTexIndirections;
+ program->Base.InputsRead = ap.Base.InputsRead;
+ program->Base.OutputsWritten = ap.Base.OutputsWritten;
for (i = 0; i < MAX_TEXTURE_IMAGE_UNITS; i++)
program->TexturesUsed[i] = ap.TexturesUsed[i];
- if (program->Parameters) {
+ if (program->Base.Parameters) {
/* free previous program's parameters */
- _mesa_free_parameter_list(program->Parameters);
+ _mesa_free_parameter_list(program->Base.Parameters);
}
- program->Parameters = ap.Parameters;
+ program->Base.Parameters = ap.Base.Parameters;
program->FogOption = ap.FogOption;
#if DEBUG_FP
- _mesa_debug_fp_inst(ap.Base.NumInstructions, ap.FPInstructions);
+ _mesa_print_program(&program.Base);
#endif
-
- program->Instructions = ap.FPInstructions;
}