From 2aac0d145a3f03572f19fd913bed2e951d543030 Mon Sep 17 00:00:00 2001 From: Brian Paul Date: Mon, 6 Aug 2012 08:35:20 -0600 Subject: [PATCH] st/mesa: merge fragment/vertex texture update code MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Reviewed-by: José Fonseca --- src/mesa/state_tracker/st_atom_texture.c | 100 +++++++++++++------------------ 1 file changed, 42 insertions(+), 58 deletions(-) diff --git a/src/mesa/state_tracker/st_atom_texture.c b/src/mesa/state_tracker/st_atom_texture.c index b35f470..e88675d 100644 --- a/src/mesa/state_tracker/st_atom_texture.c +++ b/src/mesa/state_tracker/st_atom_texture.c @@ -254,97 +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 = st->state.num_vertex_textures; - GLbitfield samplers_used = vprog->Base.SamplersUsed; + const GLuint old_max = *num_textures; + GLbitfield samplers_used = prog->SamplersUsed; + GLuint unit; 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.MaxVertexTextureImageUnits; su++, samplers_used >>= 1) { + for (unit = 0; unit < max_units; unit++, samplers_used >>= 1) { struct pipe_sampler_view *sampler_view = NULL; if (samplers_used & 1) { + const GLuint texUnit = prog->SamplerUnits[unit]; GLboolean retval; - GLuint texUnit; - - texUnit = vprog->Base.SamplerUnits[su]; retval = update_single_texture(st, &sampler_view, texUnit); if (retval == GL_FALSE) continue; - st->state.num_vertex_textures = su + 1; - } else if (samplers_used == 0 && su >= old_max) { + *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.vertex_sampler_views[su], - sampler_view); + pipe_sampler_view_reference(&(sampler_views[unit]), sampler_view); } - if (ctx->Const.MaxVertexTextureImageUnits > 0) { - GLuint numUnits = MIN2(st->state.num_vertex_textures, - ctx->Const.MaxVertexTextureImageUnits); - cso_set_sampler_views(st->cso_context, - PIPE_SHADER_VERTEX, - numUnits, - st->state.vertex_sampler_views); - } + 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; - const GLuint old_max = st->state.num_fragment_textures; - GLbitfield samplers_used = fprog->Base.SamplersUsed; - - if (samplers_used == 0x0 && old_max == 0) - return; - - st->state.num_fragment_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_fragment_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.fragment_sampler_views[su], - sampler_view); - } +static void +update_fragment_textures(struct st_context *st) +{ + const struct gl_context *ctx = st->ctx; - cso_set_sampler_views(st->cso_context, - PIPE_SHADER_FRAGMENT, - st->state.num_fragment_textures, - st->state.fragment_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); } -- 2.7.4