diff options
author | Brian Paul <[email protected]> | 2009-01-09 09:59:49 -0700 |
---|---|---|
committer | Brian Paul <[email protected]> | 2009-01-09 09:59:49 -0700 |
commit | ca03e881a8d8fa3e36a601238559c20311373633 (patch) | |
tree | 4d33d0bd8366babbac96e0d3f744c8e8ab46fa76 | |
parent | 4497a5a57d0fdb5c5ec15750e477aeb49f5e453d (diff) |
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.
-rw-r--r-- | 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 ba1c955a1ae..f5c5cbdd484 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; |