i965: move brw_meta_set_fast_clear_color to brw_meta_util.c

Reviewed-by: Topi Pohjolainen <topi.pohjolainen@intel.com>
This commit is contained in:
Jason Ekstrand 2016-05-12 15:24:40 -07:00
parent 36529f670f
commit a32315bd19
2 changed files with 74 additions and 75 deletions

View file

@ -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

View file

@ -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,