glsl: avoid calling base_alignment when samplers are involved

Earlier commit 53bf7c8fd2 changed the logic to always call
base_alignment on structs. 1ec715ce8b hacked the function to return 0
for sampler fields, but didn't handle sampler arrays. Instead of
extending the hack, avoid calling base_alignment in the first place on
non-UBO uniforms.

Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=89726
Signed-off-by: Ilia Mirkin <imirkin@alum.mit.edu>
Reviewed-by: Tapani Palli <tapani.palli@intel.com>
This commit is contained in:
Ilia Mirkin 2015-03-23 06:32:08 -04:00
parent 43277fcd59
commit baa22c8825
2 changed files with 4 additions and 9 deletions

View file

@ -1077,15 +1077,6 @@ glsl_type::std140_base_alignment(bool row_major) const
return base_alignment;
}
/* A sampler may never occur in a UBO (without bindless of some sort),
* however it is convenient to use this alignment function even with
* regular uniforms. This allows use of this function on uniform structs
* that contain samplers.
*/
if (this->is_sampler()) {
return 0;
}
assert(!"not reached");
return -1;
}

View file

@ -547,6 +547,8 @@ private:
virtual void enter_record(const glsl_type *type, const char *name,
bool row_major) {
assert(type->is_record());
if (this->ubo_block_index == -1)
return;
this->ubo_byte_offset = glsl_align(
this->ubo_byte_offset, type->std140_base_alignment(row_major));
}
@ -554,6 +556,8 @@ private:
virtual void leave_record(const glsl_type *type, const char *name,
bool row_major) {
assert(type->is_record());
if (this->ubo_block_index == -1)
return;
this->ubo_byte_offset = glsl_align(
this->ubo_byte_offset, type->std140_base_alignment(row_major));
}