Mesa (master): glsl: make minimum struct size = 2, not 1
Brian Paul
brianp at kemper.freedesktop.org
Fri Jan 9 17:03:52 UTC 2009
Module: Mesa
Branch: master
Commit: ca03e881a8d8fa3e36a601238559c20311373633
URL: http://cgit.freedesktop.org/mesa/mesa/commit/?id=ca03e881a8d8fa3e36a601238559c20311373633
Author: Brian Paul <brianp at vmware.com>
Date: Fri Jan 9 09:59:49 2009 -0700
glsl: make minimum struct size = 2, not 1
1-component structs such as "struct foo { float x; }" could get placed at
any position within a register. This caused some trouble computing the
field offset which assumed all struct objects were placed at R.x.
It would be unusual to hit this case in normal shaders.
---
src/mesa/shader/slang/slang_codegen.c | 9 ++++++++-
1 files changed, 8 insertions(+), 1 deletions(-)
diff --git a/src/mesa/shader/slang/slang_codegen.c b/src/mesa/shader/slang/slang_codegen.c
index ba1c955..f5c5cbd 100644
--- a/src/mesa/shader/slang/slang_codegen.c
+++ b/src/mesa/shader/slang/slang_codegen.c
@@ -228,7 +228,14 @@ _slang_sizeof_type_specifier(const slang_type_specifier *spec)
break;
case SLANG_SPEC_STRUCT:
sz = _slang_field_offset(spec, 0); /* special use */
- if (sz > 4) {
+ if (sz == 1) {
+ /* 1-float structs are actually troublesome to deal with since they
+ * might get placed at R.x, R.y, R.z or R.z. Return size=2 to
+ * ensure the object is placed at R.x
+ */
+ sz = 2;
+ }
+ else if (sz > 4) {
sz = (sz + 3) & ~0x3; /* round up to multiple of four */
}
break;
More information about the mesa-commit
mailing list