diff options
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_meta_fast_clear.c | 75 | ||||
-rw-r--r-- | src/mesa/drivers/dri/i965/brw_meta_util.c | 74 |
2 files changed, 74 insertions, 75 deletions
diff --git a/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c b/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c index 2d42d51bd68..245125d48ea 100644 --- a/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c +++ b/src/mesa/drivers/dri/i965/brw_meta_fast_clear.c @@ -44,8 +44,6 @@ #include "main/api_validate.h" #include "main/state.h" -#include "util/format_srgb.h" - #include "vbo/vbo_context.h" #include "drivers/common/meta.h" @@ -216,79 +214,6 @@ brw_draw_rectlist(struct brw_context *brw, struct rect *rect, int num_instances) NULL, 0, NULL); } -/** - * Convert the given color to a bitfield suitable for ORing into DWORD 7 of - * SURFACE_STATE (DWORD 12-15 on SKL+). - * - * Returned boolean tells if the given color differs from the stored. - */ -bool -brw_meta_set_fast_clear_color(struct brw_context *brw, - struct intel_mipmap_tree *mt, - const union gl_color_union *color) -{ - union gl_color_union override_color = *color; - - /* The sampler doesn't look at the format of the surface when the fast - * clear color is used so we need to implement luminance, intensity and - * missing components manually. - */ - switch (_mesa_get_format_base_format(mt->format)) { - case GL_INTENSITY: - override_color.ui[3] = override_color.ui[0]; - /* flow through */ - case GL_LUMINANCE: - case GL_LUMINANCE_ALPHA: - override_color.ui[1] = override_color.ui[0]; - override_color.ui[2] = override_color.ui[0]; - break; - default: - for (int i = 0; i < 3; i++) { - if (!_mesa_format_has_color_component(mt->format, i)) - override_color.ui[i] = 0; - } - break; - } - - if (!_mesa_format_has_color_component(mt->format, 3)) { - if (_mesa_is_format_integer_color(mt->format)) - override_color.ui[3] = 1; - else - override_color.f[3] = 1.0f; - } - - /* Handle linear→SRGB conversion */ - if (brw->ctx.Color.sRGBEnabled && - _mesa_get_srgb_format_linear(mt->format) != mt->format) { - for (int i = 0; i < 3; i++) { - override_color.f[i] = - util_format_linear_to_srgb_float(override_color.f[i]); - } - } - - bool updated; - if (brw->gen >= 9) { - updated = memcmp(&mt->gen9_fast_clear_color, &override_color, - sizeof(mt->gen9_fast_clear_color)); - mt->gen9_fast_clear_color = override_color; - } else { - const uint32_t old_color_value = mt->fast_clear_color_value; - - mt->fast_clear_color_value = 0; - for (int i = 0; i < 4; i++) { - /* Testing for non-0 works for integer and float colors */ - if (override_color.f[i] != 0.0f) { - mt->fast_clear_color_value |= - 1 << (GEN7_SURFACE_CLEAR_COLOR_SHIFT + (3 - i)); - } - } - - updated = (old_color_value != mt->fast_clear_color_value); - } - - return updated; -} - static const uint32_t fast_clear_color[4] = { ~0, ~0, ~0, ~0 }; static void diff --git a/src/mesa/drivers/dri/i965/brw_meta_util.c b/src/mesa/drivers/dri/i965/brw_meta_util.c index a5d7b11bd28..77c6b83c269 100644 --- a/src/mesa/drivers/dri/i965/brw_meta_util.c +++ b/src/mesa/drivers/dri/i965/brw_meta_util.c @@ -27,6 +27,7 @@ #include "brw_state.h" #include "main/blend.h" #include "main/fbobject.h" +#include "util/format_srgb.h" /** * Helper function for handling mirror image blits. @@ -367,6 +368,79 @@ brw_is_color_fast_clear_compatible(struct brw_context *brw, return true; } +/** + * Convert the given color to a bitfield suitable for ORing into DWORD 7 of + * SURFACE_STATE (DWORD 12-15 on SKL+). + * + * Returned boolean tells if the given color differs from the stored. + */ +bool +brw_meta_set_fast_clear_color(struct brw_context *brw, + struct intel_mipmap_tree *mt, + const union gl_color_union *color) +{ + union gl_color_union override_color = *color; + + /* The sampler doesn't look at the format of the surface when the fast + * clear color is used so we need to implement luminance, intensity and + * missing components manually. + */ + switch (_mesa_get_format_base_format(mt->format)) { + case GL_INTENSITY: + override_color.ui[3] = override_color.ui[0]; + /* flow through */ + case GL_LUMINANCE: + case GL_LUMINANCE_ALPHA: + override_color.ui[1] = override_color.ui[0]; + override_color.ui[2] = override_color.ui[0]; + break; + default: + for (int i = 0; i < 3; i++) { + if (!_mesa_format_has_color_component(mt->format, i)) + override_color.ui[i] = 0; + } + break; + } + + if (!_mesa_format_has_color_component(mt->format, 3)) { + if (_mesa_is_format_integer_color(mt->format)) + override_color.ui[3] = 1; + else + override_color.f[3] = 1.0f; + } + + /* Handle linear→SRGB conversion */ + if (brw->ctx.Color.sRGBEnabled && + _mesa_get_srgb_format_linear(mt->format) != mt->format) { + for (int i = 0; i < 3; i++) { + override_color.f[i] = + util_format_linear_to_srgb_float(override_color.f[i]); + } + } + + bool updated; + if (brw->gen >= 9) { + updated = memcmp(&mt->gen9_fast_clear_color, &override_color, + sizeof(mt->gen9_fast_clear_color)); + mt->gen9_fast_clear_color = override_color; + } else { + const uint32_t old_color_value = mt->fast_clear_color_value; + + mt->fast_clear_color_value = 0; + for (int i = 0; i < 4; i++) { + /* Testing for non-0 works for integer and float colors */ + if (override_color.f[i] != 0.0f) { + mt->fast_clear_color_value |= + 1 << (GEN7_SURFACE_CLEAR_COLOR_SHIFT + (3 - i)); + } + } + + updated = (old_color_value != mt->fast_clear_color_value); + } + + return updated; +} + void brw_get_fast_clear_rect(const struct brw_context *brw, const struct gl_framebuffer *fb, |