[Mesa-dev] [PATCH v2 24/64] mesa: fix setting uniform variables for bindless samplers/images
Samuel Pitoiset
samuel.pitoiset at gmail.com
Tue May 30 20:35:55 UTC 2017
This fixes a 64-bit vs 32-bit mismatch when setting an array
of bindless samplers. Also, we need to unconditionally set
size_mul to 2 when the underlying uniform is bindless.
Signed-off-by: Samuel Pitoiset <samuel.pitoiset at gmail.com>
---
src/mesa/main/uniform_query.cpp | 29 +++++++++++++++++++++++------
1 file changed, 23 insertions(+), 6 deletions(-)
diff --git a/src/mesa/main/uniform_query.cpp b/src/mesa/main/uniform_query.cpp
index 7bd04e1935..42ca93a6f5 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) {
+ /* 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.
@@ -955,9 +963,18 @@ _mesa_uniform(GLint location, GLsizei count, const GLvoid *values,
/* Store the data in the "actual type" backing storage for the uniform.
*/
- if (!uni->type->is_boolean()) {
+ if (!uni->type->is_boolean() && !uni->is_bindless) {
memcpy(&uni->storage[size_mul * components * offset], values,
sizeof(uni->storage[0]) * components * count * size_mul);
+ } else if (uni->is_bindless) {
+ const union gl_constant_value *src =
+ (const union gl_constant_value *) values;
+ GLuint64 *dst = (GLuint64 *)&uni->storage[components * offset].i;
+ const unsigned elems = components * count;
+
+ for (unsigned i = 0; i < elems; i++) {
+ dst[i] = src[i].i;
+ }
} else {
const union gl_constant_value *src =
(const union gl_constant_value *) values;
--
2.13.0
More information about the mesa-dev
mailing list