gallium: allow choosing which colorbuffers to clear
authorMarek Olšák <marek.olsak@amd.com>
Tue, 3 Dec 2013 23:56:24 +0000 (00:56 +0100)
committerMarek Olšák <marek.olsak@amd.com>
Thu, 12 Dec 2013 17:48:04 +0000 (18:48 +0100)
Required for glClearBuffer, which only clears one colorbuffer attachment.

Example:
   If the first colorbuffer is float and the second one is int:
      pipe->clear(pipe, PIPE_CLEAR_COLOR0, float_clear_color, ...);
      pipe->clear(pipe, PIPE_CLEAR_COLOR1, int_clear_color, ...);

This doesn't need any driver changes yet, because all drivers just use:
  if (flags & PIPE_CLEAR_COLOR) ..

The drivers which support GL 3.0 will have to implement it properly though.

src/gallium/auxiliary/postprocess/pp_mlaa.c
src/gallium/auxiliary/postprocess/pp_run.c
src/gallium/auxiliary/util/u_clear.h
src/gallium/drivers/r300/r300_blit.c
src/gallium/include/pipe/p_defines.h
src/gallium/state_trackers/vega/api_masks.c

index 92bd11c5980d3b12acab54076b7b25b2dc10cd0d..4f0c156f0b8b490daa09da611b12633bcfcfdc7b 100644 (file)
@@ -138,7 +138,7 @@ pp_jimenezmlaa_run(struct pp_queue_t *ppq, struct pipe_resource *in,
    pp_filter_set_fb(p);
    pp_filter_misc_state(p);
    cso_set_depth_stencil_alpha(p->cso, &mstencil);
-   p->pipe->clear(p->pipe, PIPE_CLEAR_STENCIL | PIPE_CLEAR_COLOR,
+   p->pipe->clear(p->pipe, PIPE_CLEAR_STENCIL | PIPE_CLEAR_COLOR0,
                   &p->clear_color, 0, 0);
 
    cso_single_sampler(p->cso, PIPE_SHADER_FRAGMENT, 0, &p->sampler_point);
index 5c6dfa11cdec8ab8807867c7bd9795a9d29954e7..a4dc75dd71c5e07fa57b84686e2333be168c5f4b 100644 (file)
@@ -309,5 +309,5 @@ void
 pp_filter_set_clear_fb(struct pp_program *p)
 {
    cso_set_framebuffer(p->cso, &p->framebuffer);
-   p->pipe->clear(p->pipe, PIPE_CLEAR_COLOR, &p->clear_color, 0, 0);
+   p->pipe->clear(p->pipe, PIPE_CLEAR_COLOR0, &p->clear_color, 0, 0);
 }
index e9fd874b1fc892a60c8ef133d6673ad0a892023d..75047c16b93f30cb2ba993688830aa2b579d6862 100644 (file)
@@ -42,9 +42,10 @@ util_clear(struct pipe_context *pipe,
            struct pipe_framebuffer_state *framebuffer, unsigned buffers,
            const union pipe_color_union *color, double depth, unsigned stencil)
 {
-   if (buffers & PIPE_CLEAR_COLOR) {
-      unsigned i;
-      for (i = 0; i < framebuffer->nr_cbufs; i++) {
+   unsigned i;
+
+   for (i = 0; i < framebuffer->nr_cbufs; i++) {
+      if (buffers & (PIPE_CLEAR_COLOR0 << i)) {
          struct pipe_surface *ps = framebuffer->cbufs[i];
          pipe->clear_render_target(pipe, ps, color, 0, 0, ps->width, ps->height);
       }
index 42410fe7daefcd5ce72b96ec514492b4300db711..a0b4573d0bd3a50727ba6badae803c97e12044ab 100644 (file)
@@ -130,7 +130,7 @@ static boolean r300_cbzb_clear_allowed(struct r300_context *r300,
         (struct pipe_framebuffer_state*)r300->fb_state.state;
 
     /* Only color clear allowed, and only one colorbuffer. */
-    if (clear_buffers != PIPE_CLEAR_COLOR || fb->nr_cbufs != 1)
+    if ((clear_buffers & ~PIPE_CLEAR_COLOR) != 0 || fb->nr_cbufs != 1)
         return FALSE;
 
     return r300_surface(fb->cbufs[0])->cbzb_allowed;
index 06a9edd27143c57621a3db3e584c44cdffe126af..982f52969cf6ffd77ed77f7610964ca85b785c7e 100644 (file)
@@ -188,11 +188,22 @@ enum pipe_texture_target {
 /**
  * Clear buffer bits
  */
+#define PIPE_CLEAR_DEPTH        (1 << 0)
+#define PIPE_CLEAR_STENCIL      (1 << 1)
+#define PIPE_CLEAR_COLOR0       (1 << 2)
+#define PIPE_CLEAR_COLOR1       (1 << 3)
+#define PIPE_CLEAR_COLOR2       (1 << 4)
+#define PIPE_CLEAR_COLOR3       (1 << 5)
+#define PIPE_CLEAR_COLOR4       (1 << 6)
+#define PIPE_CLEAR_COLOR5       (1 << 7)
+#define PIPE_CLEAR_COLOR6       (1 << 8)
+#define PIPE_CLEAR_COLOR7       (1 << 9)
+/** Combined flags */
 /** All color buffers currently bound */
-#define PIPE_CLEAR_COLOR        (1 << 0)
-#define PIPE_CLEAR_DEPTH        (1 << 1)
-#define PIPE_CLEAR_STENCIL      (1 << 2)
-/** Depth/stencil combined */
+#define PIPE_CLEAR_COLOR        (PIPE_CLEAR_COLOR0 | PIPE_CLEAR_COLOR1 | \
+                                 PIPE_CLEAR_COLOR2 | PIPE_CLEAR_COLOR3 | \
+                                 PIPE_CLEAR_COLOR4 | PIPE_CLEAR_COLOR5 | \
+                                 PIPE_CLEAR_COLOR6 | PIPE_CLEAR_COLOR7)
 #define PIPE_CLEAR_DEPTHSTENCIL (PIPE_CLEAR_DEPTH | PIPE_CLEAR_STENCIL)
 
 /**
index 0ddcdfb75c13c83167fba85b5ad258b8fcd1eb0b..48dc8445c02858a2cbca8c3875093249378ca42a 100644 (file)
@@ -97,7 +97,7 @@ void vegaClear(VGint x, VGint y,
       clear_color.f[1] = ctx->state.vg.clear_color[1];
       clear_color.f[2] = ctx->state.vg.clear_color[2];
       clear_color.f[3] = ctx->state.vg.clear_color[3];
-      ctx->pipe->clear(ctx->pipe, PIPE_CLEAR_COLOR | PIPE_CLEAR_DEPTHSTENCIL,
+      ctx->pipe->clear(ctx->pipe, PIPE_CLEAR_COLOR0 | PIPE_CLEAR_DEPTHSTENCIL,
                        &clear_color, 1., 0);
    } else if (renderer_clear_begin(ctx->renderer)) {
       /* XXX verify coord round-off */