i965/gen9/fast-clear: Handle linear→SRGB conversion
[mesa.git] / src / mesa / drivers / dri / i965 / brw_meta_fast_clear.c
index 1b5479d0315787b022a6f1a5bd516196fe3e8ba0..f1920b2edce40d19e076c25ab734163e57976d07 100644 (file)
@@ -41,6 +41,8 @@
 #include "main/api_validate.h"
 #include "main/state.h"
 
+#include "util/format_srgb.h"
+
 #include "vbo/vbo_context.h"
 
 #include "drivers/common/meta.h"
@@ -57,7 +59,6 @@ struct brw_fast_clear_state {
    struct gl_buffer_object *buf_obj;
    struct gl_vertex_array_object *array_obj;
    GLuint vao;
-   GLuint vbo;
    GLuint shader_prog;
    GLint color_location;
 };
@@ -81,10 +82,11 @@ brw_fast_clear_init(struct brw_context *brw)
    memset(clear, 0, sizeof *clear);
    _mesa_GenVertexArrays(1, &clear->vao);
    _mesa_BindVertexArray(clear->vao);
-   _mesa_CreateBuffers(1, &clear->vbo);
 
-   clear->buf_obj = _mesa_lookup_bufferobj(ctx, clear->vbo);
-   assert(clear->buf_obj != NULL);
+   clear->buf_obj = ctx->Driver.NewBufferObject(ctx, 0xDEADBEEF);
+   if (clear->buf_obj == NULL)
+      return false;
+
    clear->array_obj = _mesa_lookup_vao(ctx, clear->vao);
    assert(clear->array_obj != NULL);
 
@@ -162,7 +164,7 @@ brw_meta_fast_clear_free(struct brw_context *brw)
    _mesa_make_current(&brw->ctx, NULL, NULL);
 
    _mesa_DeleteVertexArrays(1, &clear->vao);
-   _mesa_DeleteBuffers(1, &clear->vbo);
+   _mesa_reference_buffer_object(&brw->ctx, &clear->buf_obj, NULL);
    _mesa_DeleteProgram(clear->shader_prog);
    free(clear);
 
@@ -424,6 +426,15 @@ set_fast_clear_color(struct brw_context *brw,
          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]);
+      }
+   }
+
    if (brw->gen >= 9) {
       mt->gen9_fast_clear_color = override_color;
    } else {
@@ -494,7 +505,6 @@ fast_clear_attachments(struct brw_context *brw,
                        struct rect fast_clear_rect)
 {
    assert(brw->gen >= 9);
-   struct gl_context *ctx = &brw->ctx;
 
    brw_bind_rep_write_shader(brw, (float *) fast_clear_color);
 
@@ -511,7 +521,7 @@ fast_clear_attachments(struct brw_context *brw,
 
       _mesa_meta_drawbuffers_from_bitfield(1 << index);
 
-      brw_draw_rectlist(ctx, &fast_clear_rect, MAX2(1, fb->MaxNumLayers));
+      brw_draw_rectlist(brw, &fast_clear_rect, MAX2(1, fb->MaxNumLayers));
 
       /* Now set the mcs we cleared to INTEL_FAST_CLEAR_STATE_CLEAR so we'll
        * resolve them eventually.