From 70f2573103298b0bc6857a3d5d372ca9c1cede97 Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 11 May 2017 17:29:53 +0200 Subject: [PATCH] mesa: update textures for bindless samplers bound to texture units MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit This is analogous to the existing SamplerUnits and SamplerTargets, but it loops over bindless samplers bound to texture units. Signed-off-by: Samuel Pitoiset Reviewed-by: Nicolai Hähnle --- src/mesa/main/texstate.c | 18 +++++++++++++++++- src/mesa/main/uniforms.c | 17 ++++++++++++++++- 2 files changed, 33 insertions(+), 2 deletions(-) diff --git a/src/mesa/main/texstate.c b/src/mesa/main/texstate.c index 59b96481663..b3411a87ef9 100644 --- a/src/mesa/main/texstate.c +++ b/src/mesa/main/texstate.c @@ -704,6 +704,7 @@ update_program_texture_state(struct gl_context *ctx, struct gl_program **prog, for (i = 0; i < MESA_SHADER_STAGES; i++) { GLbitfield mask; + GLuint s; if (!prog[i]) continue; @@ -711,12 +712,27 @@ update_program_texture_state(struct gl_context *ctx, struct gl_program **prog, mask = prog[i]->SamplersUsed; while (mask) { - const int s = u_bit_scan(&mask); + s = u_bit_scan(&mask); update_single_program_texture_state(ctx, prog[i], prog[i]->SamplerUnits[s], enabled_texture_units); } + + if (unlikely(prog[i]->sh.HasBoundBindlessSampler)) { + /* Loop over bindless samplers bound to texture units. + */ + for (s = 0; s < prog[i]->sh.NumBindlessSamplers; s++) { + struct gl_bindless_sampler *sampler = + &prog[i]->sh.BindlessSamplers[s]; + + if (!sampler->bound) + continue; + + update_single_program_texture_state(ctx, prog[i], sampler->unit, + enabled_texture_units); + } + } } if (prog[MESA_SHADER_FRAGMENT]) { diff --git a/src/mesa/main/uniforms.c b/src/mesa/main/uniforms.c index 6706f794d7e..91c3bf66f8d 100644 --- a/src/mesa/main/uniforms.c +++ b/src/mesa/main/uniforms.c @@ -105,18 +105,33 @@ _mesa_update_shader_textures_used(struct gl_shader_program *shProg, gl_shader_stage prog_stage = _mesa_program_enum_to_shader_stage(prog->Target); struct gl_linked_shader *shader = shProg->_LinkedShaders[prog_stage]; + GLuint s; assert(shader); memset(prog->TexturesUsed, 0, sizeof(prog->TexturesUsed)); while (mask) { - const int s = u_bit_scan(&mask); + s = u_bit_scan(&mask); update_single_shader_texture_used(shProg, prog, prog->SamplerUnits[s], prog->sh.SamplerTargets[s]); } + + if (unlikely(prog->sh.HasBoundBindlessSampler)) { + /* Loop over bindless samplers bound to texture units. + */ + for (s = 0; s < prog->sh.NumBindlessSamplers; s++) { + struct gl_bindless_sampler *sampler = &prog->sh.BindlessSamplers[s]; + + if (!sampler->bound) + continue; + + update_single_shader_texture_used(shProg, prog, sampler->unit, + sampler->target); + } + } } /** -- 2.30.2