r600g: flush differences back to DB copy.
authorDave Airlie <airlied@redhat.com>
Thu, 3 Feb 2011 03:43:37 +0000 (13:43 +1000)
committerDave Airlie <airlied@redhat.com>
Thu, 3 Feb 2011 04:19:52 +0000 (14:19 +1000)
src/gallium/drivers/r600/r600_blit.c
src/gallium/drivers/r600/r600_pipe.h
src/gallium/drivers/r600/r600_texture.c

index c200dd7305bf8949cd0b72b4748a0d911ce86e26..bf21ab432ef10dd5d046be62c5ef5bf11bfd6a47 100644 (file)
@@ -219,3 +219,23 @@ void r600_init_blit_functions(struct r600_pipe_context *rctx)
        rctx->context.clear_depth_stencil = r600_clear_depth_stencil;
        rctx->context.resource_copy_region = r600_resource_copy_region;
 }
+
+void r600_blit_push_depth(struct pipe_context *ctx, struct r600_resource_texture *texture)
+{
+       struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
+       struct pipe_surface *zsurf, *cbsurf, surf_tmpl;
+       int level = 0;
+       float depth = 1.0f;
+       struct pipe_box sbox;
+
+       sbox.x = sbox.y = sbox.z = 0;
+       sbox.width = texture->resource.base.b.width0;
+       sbox.height = texture->resource.base.b.height0;
+       /* XXX that might be wrong */
+       sbox.depth = 1;
+
+       r600_hw_copy_region(ctx, (struct pipe_resource *)texture, 0,
+                           0, 0, 0,
+                           (struct pipe_resource *)texture->flushed_depth_texture, 0,
+                           &sbox);
+}
index beb4db12b08069eab6adab00a990b2659e690b52..0d31780e47efea1256ce33b976388cc2ff913004 100644 (file)
@@ -198,6 +198,7 @@ void evergreen_pipe_add_vertex_attrib(struct r600_pipe_context *rctx,
 /* r600_blit.c */
 void r600_init_blit_functions(struct r600_pipe_context *rctx);
 void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_texture *texture);
+void r600_blit_push_depth(struct pipe_context *ctx, struct r600_resource_texture *texture);
 void r600_flush_depth_textures(struct r600_pipe_context *rctx);
 
 /* r600_buffer.c */
index c773c4b84a6d6967b7c9198c61b1857050041ab6..eac40965243d03e2fdd967b3247b2807caa71cd5 100644 (file)
@@ -630,6 +630,8 @@ void r600_texture_transfer_destroy(struct pipe_context *ctx,
                                   struct pipe_transfer *transfer)
 {
        struct r600_transfer *rtransfer = (struct r600_transfer*)transfer;
+       struct pipe_resource *texture = transfer->resource;
+       struct r600_resource_texture *rtex = (struct r600_resource_texture*)texture;
 
        if (rtransfer->staging_texture) {
                if (transfer->usage & PIPE_TRANSFER_WRITE) {
@@ -637,6 +639,12 @@ void r600_texture_transfer_destroy(struct pipe_context *ctx,
                }
                pipe_resource_reference(&rtransfer->staging_texture, NULL);
        }
+
+       if (rtex->depth && !rtex->is_flushing_texture) {
+               if ((transfer->usage & PIPE_TRANSFER_WRITE) && rtex->flushed_depth_texture)
+                       r600_blit_push_depth(ctx, rtex);
+       }
+
        pipe_resource_reference(&transfer->resource, NULL);
        FREE(transfer);
 }