[Mesa-dev] [PATCH 08/24] st/mesa: simplify update_shader_samplers
Marek Olšák
maraeo at gmail.com
Mon Jun 12 18:18:39 UTC 2017
From: Marek Olšák <marek.olsak at amd.com>
---
src/mesa/state_tracker/st_atom_sampler.c | 24 ++++++++----------------
1 file changed, 8 insertions(+), 16 deletions(-)
diff --git a/src/mesa/state_tracker/st_atom_sampler.c b/src/mesa/state_tracker/st_atom_sampler.c
index 52ff9b6..9e5d940 100644
--- a/src/mesa/state_tracker/st_atom_sampler.c
+++ b/src/mesa/state_tracker/st_atom_sampler.c
@@ -253,52 +253,43 @@ convert_sampler_from_unit(const struct st_context *st,
/**
* Update the gallium driver's sampler state for fragment, vertex or
* geometry shader stage.
*/
static void
update_shader_samplers(struct st_context *st,
enum pipe_shader_type shader_stage,
const struct gl_program *prog,
struct pipe_sampler_state *samplers,
- unsigned *num_samplers)
+ unsigned *out_num_samplers)
{
GLbitfield samplers_used = prog->SamplersUsed;
GLbitfield free_slots = ~prog->SamplersUsed;
GLbitfield external_samplers_used = prog->ExternalSamplersUsed;
- GLuint unit;
- const GLuint old_max = *num_samplers;
+ unsigned unit, num_samplers;
const struct pipe_sampler_state *states[PIPE_MAX_SAMPLERS];
if (samplers_used == 0x0)
return;
- *num_samplers = 0;
+ num_samplers = util_last_bit(samplers_used);
/* loop over sampler units (aka tex image units) */
for (unit = 0; samplers_used; unit++, samplers_used >>= 1) {
struct pipe_sampler_state *sampler = samplers + unit;
if (samplers_used & 1) {
- const GLuint texUnit = prog->SamplerUnits[unit];
-
- convert_sampler_from_unit(st, sampler, texUnit);
+ convert_sampler_from_unit(st, sampler, prog->SamplerUnits[unit]);
states[unit] = sampler;
- *num_samplers = unit + 1;
- }
- else if (samplers_used != 0 || unit < old_max) {
+ } else {
states[unit] = NULL;
}
- else {
- /* if we've reset all the old samplers and we have no more new ones */
- break;
- }
}
/* For any external samplers with multiplaner YUV, stuff the additional
* sampler states we need at the end.
*
* Just re-use the existing sampler-state from the primary slot.
*/
while (unlikely(external_samplers_used)) {
GLuint unit = u_bit_scan(&external_samplers_used);
GLuint extra = 0;
@@ -319,24 +310,25 @@ update_shader_samplers(struct st_context *st,
/* we need two additional samplers: */
extra = u_bit_scan(&free_slots);
states[extra] = sampler;
extra = u_bit_scan(&free_slots);
states[extra] = sampler;
break;
default:
break;
}
- *num_samplers = MAX2(*num_samplers, extra + 1);
+ num_samplers = MAX2(num_samplers, extra + 1);
}
- cso_set_samplers(st->cso_context, shader_stage, *num_samplers, states);
+ cso_set_samplers(st->cso_context, shader_stage, num_samplers, states);
+ *out_num_samplers = num_samplers;
}
void
st_update_vertex_samplers(struct st_context *st)
{
const struct gl_context *ctx = st->ctx;
update_shader_samplers(st,
PIPE_SHADER_VERTEX,
--
2.7.4
More information about the mesa-dev
mailing list