diff options
author | Brian Paul <[email protected]> | 2017-11-01 06:17:03 -0600 |
---|---|---|
committer | Brian Paul <[email protected]> | 2017-11-01 11:06:02 -0600 |
commit | eedecb4ecae36c5b01968fe668b894f573fbee10 (patch) | |
tree | f21a72e9fbee615504fea15bfe4ee93aa49a766a /src/gallium/include | |
parent | 5d4ffb997059fc22bd0463e648831322f939ade6 (diff) |
gallium: increase pipe_sampler_view::target bitfield size for MSVC
MSVC treats enums as being signed. The 4-bit target field isn't large
enough to correctly store the value 8 (for PIPE_TEXTURE_CUBE_ARRAY).
The bitfield value 0x8 was being interpreted as -8 so matching the
target with PIPE_TEXTURE_CUBE_ARRAY in switch statements, etc. was
failing.
To keep the structure size the same, we reduce the format field from
16 bits to 15. There don't appear to be any other enum bitfields
which need to be adjusted.
This fixes a number of Piglit cube map array tests.
Reviewed-by: Marek Olšák <[email protected]>
Reviewed-by: Roland Scheidegger <[email protected]>
Reviewed-by: Charmaine Lee <[email protected]>
Diffstat (limited to 'src/gallium/include')
-rw-r--r-- | src/gallium/include/pipe/p_state.h | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/src/gallium/include/pipe/p_state.h b/src/gallium/include/pipe/p_state.h index 10bf678652d..90dc5616f50 100644 --- a/src/gallium/include/pipe/p_state.h +++ b/src/gallium/include/pipe/p_state.h @@ -34,6 +34,10 @@ * Basic notes: * 1. Want compact representations, so we use bitfields. * 2. Put bitfields before other (GLfloat) fields. + * 3. enum bitfields need to be at least one bit extra in size so the most + * significant bit is zero. MSVC treats enums as signed so if the high + * bit is set, the value will be interpreted as a negative number. + * That causes trouble in various places. */ @@ -436,8 +440,8 @@ struct pipe_surface struct pipe_sampler_view { struct pipe_reference reference; - enum pipe_format format:16; /**< typed PIPE_FORMAT_x */ - enum pipe_texture_target target:4; /**< PIPE_TEXTURE_x */ + enum pipe_format format:15; /**< typed PIPE_FORMAT_x */ + enum pipe_texture_target target:5; /**< PIPE_TEXTURE_x */ unsigned swizzle_r:3; /**< PIPE_SWIZZLE_x for red component */ unsigned swizzle_g:3; /**< PIPE_SWIZZLE_x for green component */ unsigned swizzle_b:3; /**< PIPE_SWIZZLE_x for blue component */ |