From 1f40343e9a2a7113d2ee406ceda267975b8e7c5b Mon Sep 17 00:00:00 2001 From: Samuel Pitoiset Date: Thu, 20 Apr 2017 14:42:49 +0200 Subject: [PATCH] glsl: make component_slots() returns 2 for samplers/images MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Bindless samplers/images are 64-bit unsigned integers, which means they consume two components as specified by ARB_bindless_texture. It looks like we are not wasting uniform storage by changing this because default-block uniforms are not packed. So, if we use N uint uniforms, they occupy N * 16 bytes in the constant buffer. This is something that could be improved. Though, count_uniform_size needs to be adjusted to not count a sampler (or image) twice. As a side effect, this will probably break the cache if you have one because it will consider sampler/image types as two components. v3: - update the comments Signed-off-by: Samuel Pitoiset Reviewed-by: Nicolai Hähnle Reviewed-by: Timothy Arceri --- src/compiler/glsl/link_uniforms.cpp | 8 ++++++-- src/compiler/glsl_types.cpp | 2 ++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/compiler/glsl/link_uniforms.cpp b/src/compiler/glsl/link_uniforms.cpp index c195e767e25..f6335b0f9eb 100644 --- a/src/compiler/glsl/link_uniforms.cpp +++ b/src/compiler/glsl/link_uniforms.cpp @@ -340,9 +340,13 @@ private: if (type->contains_subroutine()) { this->num_shader_subroutines += values; } else if (type->contains_sampler()) { - this->num_shader_samplers += values; + /* Samplers (bound or bindless) are counted as two components as + * specified by ARB_bindless_texture. */ + this->num_shader_samplers += values / 2; } else if (type->contains_image()) { - this->num_shader_images += values; + /* Images (bound or bindless) are counted as two components as + * specified by ARB_bindless_texture. */ + this->num_shader_images += values / 2; /* As drivers are likely to represent image uniforms as * scalar indices, count them against the limit of uniform diff --git a/src/compiler/glsl_types.cpp b/src/compiler/glsl_types.cpp index 22a54d06eff..8fa626bba96 100644 --- a/src/compiler/glsl_types.cpp +++ b/src/compiler/glsl_types.cpp @@ -1293,6 +1293,8 @@ glsl_type::component_slots() const case GLSL_TYPE_SAMPLER: case GLSL_TYPE_IMAGE: + return 2; + case GLSL_TYPE_SUBROUTINE: return 1; -- 2.30.2