On 19.05.2017 18:52, Samuel Pitoiset wrote:
The ARB_bindless_texture spec says:

    "When a sampler or image uniform's value is queried via any
     of the GetUniform* commands, the returned value will reflect
     the most recently set value through either UniformHandle* or
     Uniform1i*, converted to the requested type."

This is probably unnecessary, depending on what happens with the previous patch.

Cheers,
Nicolai


Signed-off-by: Samuel Pitoiset <samuel.pitoi...@gmail.com>
---
  src/compiler/glsl/ir_uniform.h     |  6 ++++++
  src/compiler/glsl/shader_cache.cpp |  2 ++
  src/mesa/main/uniform_query.cpp    | 22 +++++++++++++++++-----
  3 files changed, 25 insertions(+), 5 deletions(-)

diff --git a/src/compiler/glsl/ir_uniform.h b/src/compiler/glsl/ir_uniform.h
index 9841df8cde..f375d8359d 100644
--- a/src/compiler/glsl/ir_uniform.h
+++ b/src/compiler/glsl/ir_uniform.h
@@ -207,6 +207,12 @@ struct gl_uniform_storage {
      * layout qualifier as specified by ARB_bindless_texture.
      */
     bool is_bindless;
+
+   /**
+    * Whether this uniform variable is declared with the bindless_sampler or
+    * bindless_image and used with a texture/image handle.
+    */
+   bool is_bindless_handle;
  };
#ifdef __cplusplus
diff --git a/src/compiler/glsl/shader_cache.cpp 
b/src/compiler/glsl/shader_cache.cpp
index 6811cb2f50..3fe3135bd7 100644
--- a/src/compiler/glsl/shader_cache.cpp
+++ b/src/compiler/glsl/shader_cache.cpp
@@ -579,6 +579,7 @@ write_uniforms(struct blob *metadata, struct 
gl_shader_program *prog)
        blob_write_uint32(metadata, 
prog->data->UniformStorage[i].matrix_stride);
        blob_write_uint32(metadata, prog->data->UniformStorage[i].row_major);
        blob_write_uint32(metadata, prog->data->UniformStorage[i].is_bindless);
+      blob_write_uint32(metadata, 
prog->data->UniformStorage[i].is_bindless_handle);
        blob_write_uint32(metadata,
                          
prog->data->UniformStorage[i].num_compatible_subroutines);
        blob_write_uint32(metadata,
@@ -644,6 +645,7 @@ read_uniforms(struct blob_reader *metadata, struct 
gl_shader_program *prog)
        uniforms[i].matrix_stride = blob_read_uint32(metadata);
        uniforms[i].row_major = blob_read_uint32(metadata);
        uniforms[i].is_bindless = blob_read_uint32(metadata);
+      uniforms[i].is_bindless_handle = blob_read_uint32(metadata);
        uniforms[i].num_compatible_subroutines = blob_read_uint32(metadata);
        uniforms[i].top_level_array_size = blob_read_uint32(metadata);
        uniforms[i].top_level_array_stride = blob_read_uint32(metadata);
diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
index be04e48d53..78a852377d 100644
--- a/src/mesa/main/uniform_query.cpp
+++ b/src/mesa/main/uniform_query.cpp
@@ -322,12 +322,20 @@ _mesa_get_uniform(struct gl_context *ctx, GLuint program, 
GLint location,
{
        unsigned elements = uni->type->components();
-      /* XXX: Remove the sampler/image check workarounds when bindless is fully
-       * implemented.
-       */
-      const int dmul =
-         (uni->type->is_64bit() && !uni->type->is_sampler() && 
!uni->type->is_image()) ? 2 : 1;
        const int rmul = glsl_base_type_is_64bit(returnType) ? 2 : 1;
+      int dmul = uni->type->is_64bit() ? 2 : 1;
+
+      if ((uni->type->is_sampler() || uni->type->is_image()) &&
+          !uni->is_bindless_handle) {
+         /* The ARB_bindless_texture spec says:
+          *
+          * "When a sampler or image uniform's value is queried via any of the
+          *  GetUniform* commands, the returned value will reflect the most
+          *  recently set value through either UniformHandle* or Uniform1i*,
+          *  converted to the requested type."
+          */
+         dmul = 1;
+      }
/* Calculate the source base address *BEFORE* modifying elements to
         * account for the size of the user's buffer.
@@ -1007,6 +1015,7 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid 
*values,
                 }
                 sampler->bound = true;
                 sh->Program->sh.HasBoundBindlessSampler = true;
+               uni->is_bindless_handle = false;
              } else {
                 if (sh->Program->SamplerUnits[unit] != value) {
                    sh->Program->SamplerUnits[unit] = value;
@@ -1053,6 +1062,7 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid 
*values,
                 image->unit = value;
                 image->bound = true;
                 sh->Program->sh.HasBoundBindlessImage = true;
+               uni->is_bindless_handle = false;
              } else {
                 sh->Program->sh.ImageUnits[unit] = value;
              }
@@ -1318,6 +1328,7 @@ _mesa_uniform_handle(GLint location, GLsizei count, const 
GLvoid *values,
                 &sh->Program->sh.BindlessSamplers[unit];
sampler->bound = false;
+            uni->is_bindless_handle = true;
           }
update_bound_bindless_sampler_flag(sh->Program);
@@ -1341,6 +1352,7 @@ _mesa_uniform_handle(GLint location, GLsizei count, const 
GLvoid *values,
                 &sh->Program->sh.BindlessImages[unit];
image->bound = false;
+            uni->is_bindless_handle = true;
           }
update_bound_bindless_image_flag(sh->Program);



--
Lerne, wie die Welt wirklich ist,
Aber vergiss niemals, wie sie sein sollte.
_______________________________________________
mesa-dev mailing list
mesa-dev@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/mesa-dev

Reply via email to