#include "st_nir.h"
typedef struct {
- struct shader_info *info;
+ struct nir_shader *shader;
unsigned lower_2plane;
unsigned lower_3plane;
unsigned char sampler_map[PIPE_MAX_SAMPLERS][2];
} lower_tex_src_state;
+static nir_variable *
+find_sampler(lower_tex_src_state *state, unsigned samp)
+{
+ /* NOTE: arrays of samplerExternalOES do not appear to be allowed: */
+ nir_foreach_variable(var, &state->shader->uniforms)
+ if (var->data.binding == samp)
+ return var;
+ return NULL;
+}
+
+static void
+add_sampler(lower_tex_src_state *state, unsigned orig_binding,
+ unsigned new_binding, const char *ext)
+{
+ const struct glsl_type *samplerExternalOES =
+ glsl_sampler_type(GLSL_SAMPLER_DIM_EXTERNAL, false, false, GLSL_TYPE_FLOAT);
+ nir_variable *new_sampler, *orig_sampler =
+ find_sampler(state, orig_binding);
+ char *name;
+
+ asprintf(&name, "%s:%s", orig_sampler->name, ext);
+ new_sampler = nir_variable_create(state->shader, nir_var_uniform,
+ samplerExternalOES, name);
+ free(name);
+
+ new_sampler->data.binding = new_binding;
+}
+
static void
assign_extra_samplers(lower_tex_src_state *state, unsigned free_slots)
{
while (mask) {
unsigned extra, y_samp = u_bit_scan(&mask);
- extra = u_bit_scan(&free_slots);
- state->sampler_map[y_samp][0] = extra;
-
if (state->lower_3plane & (1 << y_samp)) {
+ /* two additional planes (U and V): */
+ extra = u_bit_scan(&free_slots);
+ state->sampler_map[y_samp][0] = extra;
+
+ add_sampler(state, y_samp, extra, "u");
+
extra = u_bit_scan(&free_slots);
state->sampler_map[y_samp][1] = extra;
+
+ add_sampler(state, y_samp, extra, "v");
+ } else {
+ /* single additional UV plane: */
+ extra = u_bit_scan(&free_slots);
+ state->sampler_map[y_samp][0] = extra;
+
+ add_sampler(state, y_samp, extra, "uv");
}
}
}
tex->texture_index = tex->sampler_index =
state->sampler_map[y_samp][plane[0].i32 - 1];
- state->info->textures_used |= 1u << tex->texture_index;
+ state->shader->info.textures_used |= 1u << tex->texture_index;
}
nir_tex_instr_remove_src(tex, plane_index);
{
lower_tex_src_state state = {0};
- state.info = &shader->info;
+ state.shader = shader;
state.lower_2plane = lower_2plane;
state.lower_3plane = lower_3plane;