diff options
Diffstat (limited to 'mesalib/src/mesa/state_tracker/st_atom_texture.c')
-rw-r--r-- | mesalib/src/mesa/state_tracker/st_atom_texture.c | 99 |
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); } |