summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--progs/fp/.gitignore1
-rw-r--r--progs/tests/mipmap_view.c5
-rw-r--r--progs/vpglsl/.gitignore1
-rw-r--r--src/glu/.gitignore1
-rw-r--r--src/mesa/shader/arbprogparse.c39
-rw-r--r--src/mesa/state_tracker/st_cb_texture.c11
-rw-r--r--src/mesa/state_tracker/st_mesa_to_tgsi.c10
7 files changed, 56 insertions, 12 deletions
diff --git a/progs/fp/.gitignore b/progs/fp/.gitignore
index b265f1fed7..aa51f76c9b 100644
--- a/progs/fp/.gitignore
+++ b/progs/fp/.gitignore
@@ -40,3 +40,4 @@ tri-swz
tri-swz2
tri-tex
tri-xpd
+fp-tri
diff --git a/progs/tests/mipmap_view.c b/progs/tests/mipmap_view.c
index 117e201718..54607b8939 100644
--- a/progs/tests/mipmap_view.c
+++ b/progs/tests/mipmap_view.c
@@ -21,6 +21,8 @@ static int TexWidth = 256, TexHeight = 256;
static int WinWidth = 1044, WinHeight = 900;
static GLfloat Bias = 0.0;
static GLboolean ScaleQuads = GL_FALSE;
+static GLint Win = 0;
+
static void
@@ -145,6 +147,7 @@ Key(unsigned char key, int x, int y)
ScaleQuads = !ScaleQuads;
break;
case 27:
+ glutDestroyWindow(Win);
exit(0);
break;
}
@@ -238,7 +241,7 @@ main(int argc, char *argv[])
glutInitWindowPosition(0, 0);
glutInitWindowSize(WinWidth, WinHeight);
glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE);
- glutCreateWindow(argv[0]);
+ Win = glutCreateWindow(argv[0]);
glutReshapeFunc(Reshape);
glutKeyboardFunc(Key);
glutDisplayFunc(Display);
diff --git a/progs/vpglsl/.gitignore b/progs/vpglsl/.gitignore
new file mode 100644
index 0000000000..a5ff993525
--- /dev/null
+++ b/progs/vpglsl/.gitignore
@@ -0,0 +1 @@
+vp-tris
diff --git a/src/glu/.gitignore b/src/glu/.gitignore
new file mode 100644
index 0000000000..279ea7d434
--- /dev/null
+++ b/src/glu/.gitignore
@@ -0,0 +1 @@
+exptmp
diff --git a/src/mesa/shader/arbprogparse.c b/src/mesa/shader/arbprogparse.c
index d1c3cd7214..f499499eb3 100644
--- a/src/mesa/shader/arbprogparse.c
+++ b/src/mesa/shader/arbprogparse.c
@@ -30,6 +30,27 @@
* \author Karl Rasche
*/
+/**
+Notes on program parameters, etc.
+
+The instructions we emit will use six kinds of source registers:
+
+ PROGRAM_INPUT - input registers
+ PROGRAM_TEMPORARY - temp registers
+ PROGRAM_ADDRESS - address/indirect register
+ PROGRAM_SAMPLER - texture sampler
+ PROGRAM_CONSTANT - indexes into program->Parameters, a known constant/literal
+ PROGRAM_STATE_VAR - indexes into program->Parameters, and may actually be:
+ + a state variable, like "state.fog.color", or
+ + a pointer to a "program.local[k]" parameter, or
+ + a pointer to a "program.env[k]" parameter
+
+Basically, all the program.local[] and program.env[] values will get mapped
+into the unified gl_program->Parameters array. This solves the problem of
+having three separate program parameter arrays.
+*/
+
+
#include "main/glheader.h"
#include "main/imports.h"
#include "main/context.h"
@@ -1871,7 +1892,11 @@ parse_param_elements (GLcontext * ctx, const GLubyte ** inst,
const_values, 4);
if (param_var->param_binding_begin == ~0U)
param_var->param_binding_begin = idx;
- param_var->param_binding_type = PROGRAM_CONSTANT;
+ param_var->param_binding_type = PROGRAM_STATE_VAR;
+ /* Note: when we reference this parameter in an instruction later,
+ * we'll check if it's really a constant/immediate and set the
+ * instruction register type appropriately.
+ */
param_var->param_binding_length++;
Program->Base.NumParameters++;
break;
@@ -2578,6 +2603,18 @@ parse_src_reg (GLcontext * ctx, const GLubyte ** inst,
return 1;
}
+ if (*File == PROGRAM_STATE_VAR) {
+ enum register_file file;
+
+ /* If we're referencing the Program->Parameters[] array, check if the
+ * parameter is really a constant/literal. If so, set File to CONSTANT.
+ */
+ assert(*Index < Program->Base.Parameters->NumParameters);
+ file = Program->Base.Parameters->Parameters[*Index].Type;
+ if (file == PROGRAM_CONSTANT)
+ *File = PROGRAM_CONSTANT;
+ }
+
/* Add attributes to InputsRead only if they are used the program.
* This avoids the handling of unused ATTRIB declarations in the drivers. */
if (*File == PROGRAM_INPUT)
diff --git a/src/mesa/state_tracker/st_cb_texture.c b/src/mesa/state_tracker/st_cb_texture.c
index 2e1ad93942..958f88bf2c 100644
--- a/src/mesa/state_tracker/st_cb_texture.c
+++ b/src/mesa/state_tracker/st_cb_texture.c
@@ -481,8 +481,15 @@ st_TexImage(GLcontext * ctx,
if (!stObj->pt) {
guess_and_alloc_texture(ctx->st, stObj, stImage);
if (!stObj->pt) {
- _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
- return;
+ /* Probably out of memory.
+ * Try flushing any pending rendering, then retry.
+ */
+ st_finish(ctx->st);
+ guess_and_alloc_texture(ctx->st, stObj, stImage);
+ if (!stObj->pt) {
+ _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage");
+ return;
+ }
}
}
diff --git a/src/mesa/state_tracker/st_mesa_to_tgsi.c b/src/mesa/state_tracker/st_mesa_to_tgsi.c
index b9807bb807..524d8890b5 100644
--- a/src/mesa/state_tracker/st_mesa_to_tgsi.c
+++ b/src/mesa/state_tracker/st_mesa_to_tgsi.c
@@ -77,6 +77,7 @@ map_register_file(
case PROGRAM_CONSTANT:
if (indirectAccess)
return TGSI_FILE_CONSTANT;
+ assert(immediateMapping[index] != ~0);
return TGSI_FILE_IMMEDIATE;
case PROGRAM_INPUT:
return TGSI_FILE_INPUT;
@@ -118,6 +119,7 @@ map_register_file_index(
case TGSI_FILE_IMMEDIATE:
if (indirectAccess)
return index;
+ assert(immediateMapping[index] != ~0);
return immediateMapping[index];
default:
@@ -242,14 +244,6 @@ compile_instruction(
immediateMapping,
indirectAccess );
- /**
- * This not at all the correct solution.
- * FIXME: Roll this up in the above map functions
- */
- if (fullsrc->SrcRegister.File == TGSI_FILE_IMMEDIATE && fullsrc->SrcRegister.Index == ~0) {
- fullsrc->SrcRegister.File = TGSI_FILE_CONSTANT;
- fullsrc->SrcRegister.Index = inst->SrcReg[i].Index;
- }
/* swizzle (ext swizzle also depends on negation) */
{