- /*printf("%s su=%u non-null\n", __FUNCTION__, su);*/
- cso_single_sampler(st->cso_context, su, sampler);
- if (su < st->ctx->Const.MaxVertexTextureImageUnits) {
- cso_single_vertex_sampler(st->cso_context, su, sampler);
- }
+/**
+ * Update the gallium driver's sampler state for fragment, vertex or
+ * geometry shader stage.
+ */
+static void
+update_shader_samplers(struct st_context *st,
+ unsigned shader_stage,
+ const struct gl_program *prog,
+ unsigned max_units,
+ struct pipe_sampler_state *samplers,
+ unsigned *num_samplers)
+{
+ GLuint unit;
+ GLbitfield samplers_used;
+ const GLuint old_max = *num_samplers;
+
+ samplers_used = prog->SamplersUsed;
+
+ if (*num_samplers == 0 && samplers_used == 0x0)
+ return;
+
+ *num_samplers = 0;
+
+ /* loop over sampler units (aka tex image units) */
+ for (unit = 0; unit < max_units; unit++, samplers_used >>= 1) {
+ struct pipe_sampler_state *sampler = samplers + unit;
+
+ if (samplers_used & 1) {
+ const GLuint texUnit = prog->SamplerUnits[unit];
+
+ convert_sampler(st, sampler, texUnit);
+
+ *num_samplers = unit + 1;
+
+ cso_single_sampler(st->cso_context, shader_stage, unit, sampler);
+ }
+ else if (samplers_used != 0 || unit < old_max) {
+ cso_single_sampler(st->cso_context, shader_stage, unit, NULL);