aboutsummaryrefslogtreecommitdiff
path: root/mesalib/src/mesa/state_tracker/st_atom_texture.c
diff options
context:
space:
mode:
authormarha <marha@users.sourceforge.net>2012-08-07 07:51:02 +0200
committermarha <marha@users.sourceforge.net>2012-08-07 07:51:02 +0200
commitf8e35ebbe71eed74ccf68af8ccda4182f1edc7f0 (patch)
tree0451299b4aaaaf6d2423d1faf07dc9f35c9f80d8 /mesalib/src/mesa/state_tracker/st_atom_texture.c
parent18e75aa6ae27a6e44d93babd96afbbe0cd6077c8 (diff)
downloadvcxsrv-f8e35ebbe71eed74ccf68af8ccda4182f1edc7f0.tar.gz
vcxsrv-f8e35ebbe71eed74ccf68af8ccda4182f1edc7f0.tar.bz2
vcxsrv-f8e35ebbe71eed74ccf68af8ccda4182f1edc7f0.zip
mesa xserver xkeyboard-config git update 7 Aug 2012
Diffstat (limited to 'mesalib/src/mesa/state_tracker/st_atom_texture.c')
-rw-r--r--mesalib/src/mesa/state_tracker/st_atom_texture.c99
1 files changed, 48 insertions, 51 deletions
diff --git a/mesalib/src/mesa/state_tracker/st_atom_texture.c b/mesalib/src/mesa/state_tracker/st_atom_texture.c
index fefa59860..e88675d4e 100644
--- a/mesalib/src/mesa/state_tracker/st_atom_texture.c
+++ b/mesalib/src/mesa/state_tracker/st_atom_texture.c
@@ -254,84 +254,81 @@ update_single_texture(struct st_context *st,
}
+
static void
-update_vertex_textures(struct st_context *st)
+update_textures(struct st_context *st,
+ unsigned shader_stage,
+ const struct gl_program *prog,
+ unsigned max_units,
+ struct pipe_sampler_view **sampler_views,
+ unsigned *num_textures)
{
- const struct gl_context *ctx = st->ctx;
- struct gl_vertex_program *vprog = ctx->VertexProgram._Current;
- GLuint su;
+ const GLuint old_max = *num_textures;
+ GLbitfield samplers_used = prog->SamplersUsed;
+ GLuint unit;
- if (!vprog->Base.SamplersUsed && st->state.num_vertex_textures == 0)
+ if (samplers_used == 0x0 && old_max == 0)
return;
- st->state.num_vertex_textures = 0;
+ *num_textures = 0;
/* loop over sampler units (aka tex image units) */
- for (su = 0; su < ctx->Const.MaxTextureImageUnits; su++) {
+ for (unit = 0; unit < max_units; unit++, samplers_used >>= 1) {
struct pipe_sampler_view *sampler_view = NULL;
- if (vprog->Base.SamplersUsed & (1 << su)) {
- GLboolean retval;
- GLuint texUnit;
- texUnit = vprog->Base.SamplerUnits[su];
+ if (samplers_used & 1) {
+ const GLuint texUnit = prog->SamplerUnits[unit];
+ GLboolean retval;
retval = update_single_texture(st, &sampler_view, texUnit);
if (retval == GL_FALSE)
continue;
- st->state.num_vertex_textures = su + 1;
+ *num_textures = unit + 1;
+ }
+ else if (samplers_used == 0 && unit >= old_max) {
+ /* if we've reset all the old views and we have no more new ones */
+ break;
}
- pipe_sampler_view_reference(&st->state.sampler_vertex_views[su],
- sampler_view);
- }
- if (ctx->Const.MaxVertexTextureImageUnits > 0) {
- GLuint numUnits = MIN2(st->state.num_vertex_textures,
- ctx->Const.MaxVertexTextureImageUnits);
- cso_set_vertex_sampler_views(st->cso_context,
- numUnits,
- st->state.sampler_vertex_views);
+ pipe_sampler_view_reference(&(sampler_views[unit]), sampler_view);
}
+
+ cso_set_sampler_views(st->cso_context,
+ shader_stage,
+ MIN2(*num_textures, max_units),
+ sampler_views);
}
+
static void
-update_fragment_textures(struct st_context *st)
+update_vertex_textures(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
- struct gl_fragment_program *fprog = ctx->FragmentProgram._Current;
- GLuint su;
- int old_max = st->state.num_textures;
- GLbitfield samplers_used = fprog->Base.SamplersUsed;
-
- st->state.num_textures = 0;
-
- /* loop over sampler units (aka tex image units) */
- for (su = 0; su < ctx->Const.MaxTextureImageUnits; su++, samplers_used >>= 1) {
- struct pipe_sampler_view *sampler_view = NULL;
-
- if (samplers_used & 1) {
- GLboolean retval;
- GLuint texUnit;
- texUnit = fprog->Base.SamplerUnits[su];
-
- retval = update_single_texture(st, &sampler_view, texUnit);
- if (retval == GL_FALSE)
- continue;
+ if (ctx->Const.MaxVertexTextureImageUnits > 0) {
+ update_textures(st,
+ PIPE_SHADER_VERTEX,
+ &ctx->VertexProgram._Current->Base,
+ ctx->Const.MaxVertexTextureImageUnits,
+ st->state.vertex_sampler_views,
+ &st->state.num_vertex_textures);
+ }
+}
- st->state.num_textures = su + 1;
- } else if (samplers_used == 0 && su >= old_max) {
- /* if we've reset all the old views and we have no more new ones */
- break;
- }
- pipe_sampler_view_reference(&st->state.sampler_views[su], sampler_view);
- }
+static void
+update_fragment_textures(struct st_context *st)
+{
+ const struct gl_context *ctx = st->ctx;
- cso_set_fragment_sampler_views(st->cso_context,
- st->state.num_textures,
- st->state.sampler_views);
+ update_textures(st,
+ PIPE_SHADER_FRAGMENT,
+ &ctx->FragmentProgram._Current->Base,
+ ctx->Const.MaxTextureImageUnits,
+ st->state.fragment_sampler_views,
+ &st->state.num_fragment_textures);
}