diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_meta_util.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_meta_util.c b/src/mesa/drivers/dri/i965/brw_meta_util.c index 575f437750b..f9fd3509184 100644 --- a/src/mesa/drivers/dri/i965/brw_meta_util.c +++ b/src/mesa/drivers/dri/i965/brw_meta_util.c @@ -364,6 +364,46 @@ brw_meta_convert_fast_clear_color(const struct brw_context *brw, break; } + switch (_mesa_get_format_datatype(mt->format)) { + case GL_UNSIGNED_NORMALIZED: + for (int i = 0; i < 4; i++) + override_color.f32[i] = CLAMP(override_color.f32[i], 0.0f, 1.0f); + break; + + case GL_SIGNED_NORMALIZED: + for (int i = 0; i < 4; i++) + override_color.f32[i] = CLAMP(override_color.f32[i], -1.0f, 1.0f); + break; + + case GL_UNSIGNED_INT: + for (int i = 0; i < 4; i++) { + unsigned bits = _mesa_get_format_bits(mt->format, GL_RED_BITS + i); + if (bits < 32) { + uint32_t max = (1u << bits) - 1; + override_color.u32[i] = MIN2(override_color.u32[i], max); + } + } + break; + + case GL_INT: + for (int i = 0; i < 4; i++) { + unsigned bits = _mesa_get_format_bits(mt->format, GL_RED_BITS + i); + if (bits < 32) { + int32_t max = (1 << (bits - 1)) - 1; + int32_t min = -(1 << (bits - 1)); + override_color.i32[i] = CLAMP(override_color.i32[i], min, max); + } + } + break; + + case GL_FLOAT: + if (!_mesa_is_format_signed(mt->format)) { + for (int i = 0; i < 4; i++) + override_color.f32[i] = MAX2(override_color.f32[i], 0.0f); + } + break; + } + if (!_mesa_format_has_color_component(mt->format, 3)) { if (_mesa_is_format_integer_color(mt->format)) override_color.u32[3] = 1; |