summaryrefslogtreecommitdiffstats
path: root/src/mesa/pipe/i915simple
diff options
context:
space:
mode:
authorBrian <[email protected]>2007-10-26 19:19:09 -0600
committerBrian <[email protected]>2007-10-26 19:19:51 -0600
commit8fed2466e4056668a76a87cf935b5fbff8ae15ca (patch)
tree81345e5b5ee66dc2dd299f5b9ce29314f2e52735 /src/mesa/pipe/i915simple
parent789d248558061fe4d65f664d6770a12b90fa2e34 (diff)
Re-implement GLSL texture sampler variables.
GLSL sampler variables indicate which texture unit to use for TEX instructions. Previously, this was baked into the fragment/vertex program and couldn't be readily changed once set. Now, SamplerUnits[] array indicates which texture unit is to be used for each sampler variable. These values are set with glUniform1i(). This is extra state that must be passed to the fragment/vertex program executor at runtime.
Diffstat (limited to 'src/mesa/pipe/i915simple')
-rw-r--r--src/mesa/pipe/i915simple/i915_context.h1
-rw-r--r--src/mesa/pipe/i915simple/i915_state.c10
2 files changed, 11 insertions, 0 deletions
diff --git a/src/mesa/pipe/i915simple/i915_context.h b/src/mesa/pipe/i915simple/i915_context.h
index a3dd392e755..5a3ecedad2b 100644
--- a/src/mesa/pipe/i915simple/i915_context.h
+++ b/src/mesa/pipe/i915simple/i915_context.h
@@ -173,6 +173,7 @@ struct i915_context
struct pipe_framebuffer_state framebuffer;
struct pipe_poly_stipple poly_stipple;
struct pipe_scissor_state scissor;
+ uint sampler_units[PIPE_MAX_SAMPLERS];
struct pipe_mipmap_tree *texture[PIPE_MAX_SAMPLERS];
struct pipe_viewport_state viewport;
struct pipe_vertex_buffer vertex_buffer[PIPE_ATTRIB_MAX];
diff --git a/src/mesa/pipe/i915simple/i915_state.c b/src/mesa/pipe/i915simple/i915_state.c
index 8da5662e3fe..05f8a6e1fd8 100644
--- a/src/mesa/pipe/i915simple/i915_state.c
+++ b/src/mesa/pipe/i915simple/i915_state.c
@@ -446,6 +446,15 @@ static void i915_set_polygon_stipple( struct pipe_context *pipe,
{
}
+static void i915_set_sampler_units(struct pipe_context *pipe,
+ uint numSamplers, const uint *units)
+{
+ struct i915_context *i915 = i915_context(pipe);
+ uint i;
+ for (i = 0; i < numSamplers; i++)
+ i915->sampler_units[i] = units[i];
+}
+
static void * i915_create_fs_state(struct pipe_context *pipe,
const struct pipe_shader_state *templ)
{
@@ -765,6 +774,7 @@ i915_init_state_functions( struct i915_context *i915 )
i915->pipe.set_feedback_buffer = i915_set_feedback_buffer;
i915->pipe.set_polygon_stipple = i915_set_polygon_stipple;
+ i915->pipe.set_sampler_units = i915_set_sampler_units;
i915->pipe.set_scissor_state = i915_set_scissor_state;
i915->pipe.set_texture_state = i915_set_texture_state;
i915->pipe.set_viewport_state = i915_set_viewport_state;