glsl: make minimum struct size = 2, not 1
authorBrian Paul <brianp@vmware.com>
Fri, 9 Jan 2009 16:59:49 +0000 (09:59 -0700)
committerBrian Paul <brianp@vmware.com>
Fri, 9 Jan 2009 16:59:49 +0000 (09:59 -0700)
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

index ba1c955a1aedcf533bcb4e5d4ba7b22556ee7553..f5c5cbdd484c6a1dfdda6d66cdeefcbca3972c30 100644 (file)
@@ -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;