u_blitter: add a msaa parameter to util_blitter_clear
[mesa.git] / src / gallium / drivers / svga / svga_pipe_blit.c
index 55eee9220bf5485bb093d7bee7ef1dad45b9c73a..da7899ff4321546a6ec6e26c74c2463dab9159d8 100644 (file)
@@ -69,7 +69,6 @@ build_blit_info(struct pipe_resource *dst_tex,
             src_box->depth, &blit->dst.box);
 }
 
-
 /**
  * Copy when src texture and dst texture are same with IntraSurfaceCopy
  * command.
@@ -85,6 +84,12 @@ intra_surface_copy(struct svga_context *svga, struct pipe_resource *tex,
    SVGA3dCopyBox box;
    struct svga_texture *stex;
 
+   /*
+    * Makes sure we have flushed all buffered draw operations and also
+    * synchronizes all surfaces with any emulated surface views.
+    */
+   svga_surfaces_flush(svga);
+
    stex = svga_texture(tex);
 
    box.x = dst_x;
@@ -122,7 +127,6 @@ copy_region_vgpu10(struct svga_context *svga, struct pipe_resource *src_tex,
                     unsigned dst_level, unsigned dst_layer_face,
                     unsigned width, unsigned height, unsigned depth)
 {
-   enum pipe_error ret;
    uint32 srcSubResource, dstSubResource;
    struct svga_texture *dtex, *stex;
 
@@ -235,7 +239,8 @@ is_blending_enabled(struct svga_context *svga,
    if (svga->curr.blend) {
       if (svga->curr.blend->independent_blend_enable) {
          for (i = 0; i < PIPE_MAX_COLOR_BUFS; i++) {
-            if (svga->curr.framebuffer.cbufs[i]->texture == blit->dst.resource) {
+            struct pipe_surface *cbuf = svga->curr.framebuffer.cbufs[i];
+            if (cbuf && (cbuf->texture == blit->dst.resource)) {
                if (svga->curr.blend->rt[i].blend_enable) {
                   blend_enable = true;
                }
@@ -251,7 +256,6 @@ is_blending_enabled(struct svga_context *svga,
    return blend_enable;
 }
 
-
 /**
  * If GL_FRAMEBUFFER_SRGB is enabled, then output colorspace is
  * expected to be sRGB if blending is not enabled.
@@ -339,13 +343,15 @@ can_blit_via_svga_copy_region(struct svga_context *svga,
    return check_blending_and_srgb_cond(svga, blit_info);
 }
 
-
+/**
+ * Check whether we can blit using the intra_surface_copy command.
+ */
 static bool
 can_blit_via_intra_surface_copy(struct svga_context *svga,
                                 const struct pipe_blit_info *blit_info)
 {
-   struct svga_texture *dtex, *stex;
    struct svga_winsys_screen *sws = svga_screen(svga->pipe.screen)->sws;
+   struct svga_texture *dtex, *stex;
 
    if (!svga_have_vgpu10(svga))
       return false;
@@ -357,10 +363,7 @@ can_blit_via_intra_surface_copy(struct svga_context *svga,
    if (!sws->have_intra_surface_copy)
       return false;
 
-   stex = svga_texture(blit_info->src.resource);
-   dtex = svga_texture(blit_info->dst.resource);
-
-   if (stex->handle != dtex->handle)
+   if (svga->render_condition && blit_info->render_condition_enable)
       return false;
 
    if (blit_info->src.level != blit_info->dst.level)
@@ -371,25 +374,10 @@ can_blit_via_intra_surface_copy(struct svga_context *svga,
          return false;
    }
 
-   /* check that the blit src/dst regions are same size, no flipping, etc. */
-   if (blit_info->src.box.width != blit_info->dst.box.width ||
-       blit_info->src.box.height != blit_info->dst.box.height)
-      return false;
-
-   /* For depth+stencil formats, copy with mask != PIPE_MASK_ZS is not
-    * supported
-    */
-   if (util_format_is_depth_and_stencil(blit_info->src.format) &&
-      blit_info->mask != (PIPE_MASK_ZS))
-     return false;
-
-   if (blit_info->alpha_blend ||
-       (svga->render_condition && blit_info->render_condition_enable) ||
-       blit_info->scissor_enable)
-      return false;
+   stex = svga_texture(blit_info->src.resource);
+   dtex = svga_texture(blit_info->dst.resource);
 
-   return !(is_blending_enabled(svga, blit_info) &&
-           util_format_is_srgb(blit_info->src.resource->format));
+   return (stex->handle == dtex->handle);
 }
 
 
@@ -585,7 +573,7 @@ try_blit(struct svga_context *svga, const struct pipe_blit_info *blit_info)
    struct pipe_blit_info blit = *blit_info;
 
    SVGA_STATS_TIME_PUSH(sws, SVGA_STATS_TIME_BLITBLITTER);
-   
+
    /**
     * Avoid using util_blitter_blit() for these depth formats on non-vgpu10
     * devices because these depth formats only support comparison mode