r600g: fix depth hw resource copies.
[mesa.git] / src / gallium / drivers / r600 / r600_blit.c
index b487182e3aab5aaa72177592dbefeaf0abf7270f..c200dd7305bf8949cd0b72b4748a0d911ce86e26 100644 (file)
@@ -36,6 +36,7 @@ static void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op
 {
        struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
 
+       rctx->blit = true;
        r600_context_queries_suspend(&rctx->ctx);
 
        util_blitter_save_blend(rctx->blitter, rctx->states[R600_PIPE_STATE_BLEND]);
@@ -55,8 +56,6 @@ static void r600_blitter_begin(struct pipe_context *ctx, enum r600_blitter_op op
        }
        util_blitter_save_vertex_buffers(rctx->blitter, rctx->nvertex_buffers, rctx->vertex_buffer);
 
-       rctx->vertex_elements = NULL;
-
        if (op & (R600_CLEAR_SURFACE | R600_COPY))
                util_blitter_save_framebuffer(rctx->blitter, &rctx->framebuffer);
 
@@ -76,6 +75,7 @@ static void r600_blitter_end(struct pipe_context *ctx)
 {
        struct r600_pipe_context *rctx = (struct r600_pipe_context *)ctx;
        r600_context_queries_resume(&rctx->ctx);
+       rctx->blit = false;
 }
 
 void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_texture *texture)
@@ -84,6 +84,10 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_t
        struct pipe_surface *zsurf, *cbsurf, surf_tmpl;
        int level = 0;
        float depth = 1.0f;
+
+       if (!texture->dirty_db)
+               return;
+
        surf_tmpl.format = texture->resource.base.b.format;
        surf_tmpl.u.tex.level = level;
        surf_tmpl.u.tex.first_layer = 0;
@@ -107,6 +111,31 @@ void r600_blit_uncompress_depth(struct pipe_context *ctx, struct r600_resource_t
 
        pipe_surface_reference(&zsurf, NULL);
        pipe_surface_reference(&cbsurf, NULL);
+
+       texture->dirty_db = FALSE;
+}
+
+void r600_flush_depth_textures(struct r600_pipe_context *rctx)
+{
+       unsigned int i;
+
+       if (rctx->blit) return;
+
+       /* FIXME: This handles fragment shader textures only. */
+
+       for (i = 0; i < rctx->ps_samplers.n_views; ++i) {
+               struct r600_pipe_sampler_view *view;
+               struct r600_resource_texture *tex;
+
+               view = rctx->ps_samplers.views[i];
+               if (!view) continue;
+
+               tex = (struct r600_resource_texture *)view->base.texture;
+               if (!tex->depth)
+                       continue;
+
+               r600_blit_uncompress_depth(&rctx->context, tex);
+       }
 }
 
 static void r600_clear(struct pipe_context *ctx, unsigned buffers,
@@ -179,15 +208,8 @@ static void r600_resource_copy_region(struct pipe_context *ctx,
                                      unsigned src_level,
                                      const struct pipe_box *src_box)
 {
-       boolean is_depth;
-       /* there is something wrong with depth resource copies at the moment so avoid them for now */
-       is_depth = util_format_get_component_bits(src->format, UTIL_FORMAT_COLORSPACE_ZS, 0) != 0;
-       if (is_depth)
-               util_resource_copy_region(ctx, dst, dst_level, dstx, dsty, dstz,
-                                         src, src_level, src_box);
-       else
-               r600_hw_copy_region(ctx, dst, dst_level, dstx, dsty, dstz,
-                                   src, src_level, src_box);
+       r600_hw_copy_region(ctx, dst, dst_level, dstx, dsty, dstz,
+                           src, src_level, src_box);
 }
 
 void r600_init_blit_functions(struct r600_pipe_context *rctx)