st/mesa: don't set sampler states for TBOs
authorMarek Olšák <marek.olsak@amd.com>
Thu, 15 Jun 2017 01:00:59 +0000 (03:00 +0200)
committerMarek Olšák <marek.olsak@amd.com>
Wed, 21 Jun 2017 23:51:02 +0000 (01:51 +0200)
Reviewed-by: Nicolai Hähnle <nicolai.haehnle@amd.com>
src/mesa/state_tracker/st_atom_sampler.c
src/mesa/state_tracker/st_texture.c

index 2481a72a55bf2e945ed13142ee26bdbfc097a052..a10a46995ba9a574771ce5238b058a7a34e99cd2 100644 (file)
@@ -223,6 +223,7 @@ st_convert_sampler_from_unit(const struct st_context *st,
 
    texobj = ctx->Texture.Unit[texUnit]._Current;
    assert(texobj);
+   assert(texobj->Target != GL_TEXTURE_BUFFER);
 
    msamp = _mesa_get_samplerobj(ctx, texUnit);
 
@@ -244,6 +245,7 @@ update_shader_samplers(struct st_context *st,
                        struct pipe_sampler_state *samplers,
                        unsigned *out_num_samplers)
 {
+   struct gl_context *ctx = st->ctx;
    GLbitfield samplers_used = prog->SamplersUsed;
    GLbitfield free_slots = ~prog->SamplersUsed;
    GLbitfield external_samplers_used = prog->ExternalSamplersUsed;
@@ -258,9 +260,14 @@ update_shader_samplers(struct st_context *st,
    /* loop over sampler units (aka tex image units) */
    for (unit = 0; samplers_used; unit++, samplers_used >>= 1) {
       struct pipe_sampler_state *sampler = samplers + unit;
+      unsigned tex_unit = prog->SamplerUnits[unit];
 
-      if (samplers_used & 1) {
-         st_convert_sampler_from_unit(st, sampler, prog->SamplerUnits[unit]);
+      /* Don't update the sampler for TBOs. cso_context will not bind sampler
+       * states that are NULL.
+       */
+      if (samplers_used & 1 &&
+          ctx->Texture.Unit[tex_unit]._Current->Target != GL_TEXTURE_BUFFER) {
+         st_convert_sampler_from_unit(st, sampler, tex_unit);
          states[unit] = sampler;
       } else {
          states[unit] = NULL;
index 58636286eefbe4431a3fa12ecb8e1dc0165a532b..cf8fe225a2d6dc48577adf83c1fb0bf0985e3519 100644 (file)
@@ -510,12 +510,13 @@ st_create_texture_handle_from_unit(struct st_context *st,
 {
    struct pipe_context *pipe = st->pipe;
    struct pipe_sampler_view *view;
-   struct pipe_sampler_state sampler;
+   struct pipe_sampler_state sampler = {0};
 
    if (!st_update_single_texture(st, &view, texUnit, prog->sh.data->Version))
       return 0;
 
-   st_convert_sampler_from_unit(st, &sampler, texUnit);
+   if (view->target != PIPE_BUFFER)
+      st_convert_sampler_from_unit(st, &sampler, texUnit);
 
    assert(st->ctx->Texture.Unit[texUnit]._Current);