#include "main/api_validate.h"
#include "main/state.h"
-#include "util/format_srgb.h"
-
#include "vbo/vbo_context.h"
#include "drivers/common/meta.h"
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
#include "brw_state.h"
#include "main/blend.h"
#include "main/fbobject.h"
+#include "util/format_srgb.h"
/**
* Helper function for handling mirror image blits.
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,