st/dri: always copy new DRI front and back buffers to corresponding MSAA buffers
authorMarek Olšák <maraeo@gmail.com>
Fri, 31 May 2013 19:52:01 +0000 (21:52 +0200)
committerMarek Olšák <maraeo@gmail.com>
Thu, 13 Jun 2013 01:54:14 +0000 (03:54 +0200)
This commit fixes these piglit tests with an MSAA visual forced on:
- read-front
- glx-copy-sub-buffer

Reviewed-by: Brian Paul <brianp@vmware.com>
src/gallium/state_trackers/dri/drm/dri2.c

index 50628a618e7258626a74604972ea078343b614a2..a0b29d3a5409db34429d123e6e2d441a96163d73 100644 (file)
@@ -180,6 +180,8 @@ dri2_drawable_process_buffers(struct dri_drawable *drawable,
    struct winsys_handle whandle;
    boolean alloc_depthstencil = FALSE;
    unsigned i, j, bind;
+   struct pipe_screen *pscreen = screen->base.screen;
+   struct pipe_context *pipe = NULL;
 
    if (drawable->old_num == buffer_count &&
        drawable->old_w == dri_drawable->w &&
@@ -296,6 +298,26 @@ dri2_drawable_process_buffers(struct dri_drawable *drawable,
                   screen->base.screen->resource_create(screen->base.screen,
                                                        &templ);
                assert(drawable->msaa_textures[att]);
+
+               /* If there are any MSAA resources, we should initialize them
+                * such that they contain the same data as the single-sample
+                * resources we just got from the X server.
+                *
+                * The reason for this is that the state tracker (and
+                * therefore the app) can access the MSAA resources only.
+                * The single-sample resources are not exposed
+                * to the state tracker.
+                *
+                * We don't have a context here, so create one temporarily.
+                * We may need to create a persistent context if creation and
+                * destruction of the context becomes a bottleneck.
+                */
+               if (!pipe)
+                  pipe = pscreen->context_create(pscreen, NULL);
+
+               dri_pipe_blit(pipe,
+                             drawable->msaa_textures[att],
+                             drawable->textures[att]);
             }
          }
          else {
@@ -349,6 +371,11 @@ dri2_drawable_process_buffers(struct dri_drawable *drawable,
    drawable->old_w = dri_drawable->w;
    drawable->old_h = dri_drawable->h;
    memcpy(drawable->old, buffers, sizeof(__DRIbuffer) * buffer_count);
+
+   if (pipe) {
+      pipe->flush(pipe, NULL, 0);
+      pipe->destroy(pipe);
+   }
 }
 
 static __DRIbuffer *