r600g: flush differences back to DB copy.

This commit is contained in:
Dave Airlie 2011-02-03 13:43:37 +10:00
parent 417cfa60b2
commit aa31a5cbc7
3 changed files with 29 additions and 0 deletions

View 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);
}

View 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 */

View 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);
}