Move stuff common to vertex/fragment_program into the base class, including:
[mesa.git] / src / mesa / shader / arbfragparse.c
index 7b9abec1c948344e715ff15fc4c5585d74892149..e6470be9fe70cb3b42f8d60135b2f9a04b193021 100644 (file)
@@ -1,8 +1,8 @@
 /*
  * 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,
@@ -190,6 +44,7 @@ _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 */
@@ -203,31 +58,40 @@ _mesa_parse_arb_fragment_program(GLcontext * ctx, GLenum target,
    /* 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;
 }