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:
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user