mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-05 09:38:07 +02:00
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:
parent
36529f670f
commit
a32315bd19
2 changed files with 74 additions and 75 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue