r600g: avoid recursion with staged uploads

Don't use an intermediate for formats which don't support hardware
blits under u_blitter.c, as these will recursively attempt to create a
transfer.
This commit is contained in:
Keith Whitwell 2010-11-03 14:06:33 +00:00
parent 6e2e136428
commit e3ea4aec03

View file

@ -466,6 +466,36 @@ static INLINE unsigned u_box_volume( const struct pipe_box *box )
};
/* Figure out whether u_blitter will fallback to a transfer operation.
* If so, don't use a staging resource.
*/
static boolean permit_hardware_blit(struct pipe_screen *screen,
struct pipe_resource *res)
{
unsigned bind;
if (util_format_is_depth_or_stencil(res->format))
bind = PIPE_BIND_DEPTH_STENCIL;
else
bind = PIPE_BIND_RENDER_TARGET;
if (!screen->is_format_supported(screen,
res->format,
res->target,
res->nr_samples,
bind, 0))
return FALSE;
if (!screen->is_format_supported(screen,
res->format,
res->target,
res->nr_samples,
PIPE_BIND_SAMPLER_VIEW, 0))
return FALSE;
return TRUE;
}
struct pipe_transfer* r600_texture_get_transfer(struct pipe_context *ctx,
struct pipe_resource *texture,
struct pipe_subresource sr,
@ -506,6 +536,10 @@ struct pipe_transfer* r600_texture_get_transfer(struct pipe_context *ctx,
!(usage & (PIPE_TRANSFER_DONTBLOCK | PIPE_TRANSFER_UNSYNCHRONIZED)))
use_staging_texture = TRUE;
if (!permit_hardware_blit(ctx->screen, texture) ||
(texture->flags & R600_RESOURCE_FLAG_TRANSFER))
use_staging_texture = FALSE;
trans = CALLOC_STRUCT(r600_transfer);
if (trans == NULL)
return NULL;