Mesa (master): glsl: make minimum struct size = 2, not 1

Brian Paul brianp at kemper.freedesktop.org
Fri Jan 9 09:03:52 PST 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