mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-08 22:08:26 +02:00
r600g: check if hardware blits are possible bevore enabling tilling
This commit is contained in:
parent
9bf8adc45e
commit
3789a480ed
1 changed files with 50 additions and 49 deletions
|
|
@ -321,6 +321,48 @@ r600_texture_create_object(struct pipe_screen *screen,
|
|||
return rtex;
|
||||
}
|
||||
|
||||
/* 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,
|
||||
const 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;
|
||||
|
||||
/* See r600_resource_copy_region: there is something wrong
|
||||
* with depth resource copies at the moment so avoid them for
|
||||
* now.
|
||||
*/
|
||||
if (util_format_get_component_bits(res->format,
|
||||
UTIL_FORMAT_COLORSPACE_ZS,
|
||||
0) != 0)
|
||||
return FALSE;
|
||||
|
||||
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;
|
||||
|
||||
if (res->usage == PIPE_USAGE_STREAM)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
|
||||
const struct pipe_resource *templ)
|
||||
{
|
||||
|
|
@ -332,7 +374,7 @@ struct pipe_resource *r600_texture_create(struct pipe_screen *screen,
|
|||
if (force_tiling == -1)
|
||||
force_tiling = debug_get_bool_option("R600_FORCE_TILING", FALSE);
|
||||
|
||||
if (force_tiling) {
|
||||
if (force_tiling && permit_hardware_blit(screen, templ)) {
|
||||
if (!(templ->flags & R600_RESOURCE_FLAG_TRANSFER) &&
|
||||
!(templ->bind & PIPE_BIND_SCANOUT)) {
|
||||
array_mode = V_038000_ARRAY_2D_TILED_THIN1;
|
||||
|
|
@ -485,46 +527,6 @@ static INLINE unsigned u_box_volume( const struct pipe_box *box )
|
|||
return box->width * box->depth * box->height;
|
||||
};
|
||||
|
||||
|
||||
/* 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;
|
||||
|
||||
/* See r600_resource_copy_region: there is something wrong
|
||||
* with depth resource copies at the moment so avoid them for
|
||||
* now.
|
||||
*/
|
||||
if (util_format_get_component_bits(res->format,
|
||||
UTIL_FORMAT_COLORSPACE_ZS,
|
||||
0) != 0)
|
||||
return FALSE;
|
||||
|
||||
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,
|
||||
unsigned level,
|
||||
|
|
@ -562,8 +564,7 @@ struct pipe_transfer* r600_texture_get_transfer(struct pipe_context *ctx,
|
|||
use_staging_texture = TRUE;
|
||||
|
||||
if (!permit_hardware_blit(ctx->screen, texture) ||
|
||||
(texture->flags & R600_RESOURCE_FLAG_TRANSFER) ||
|
||||
(texture->usage == PIPE_USAGE_STREAM))
|
||||
(texture->flags & R600_RESOURCE_FLAG_TRANSFER))
|
||||
use_staging_texture = FALSE;
|
||||
|
||||
trans = CALLOC_STRUCT(r600_transfer);
|
||||
|
|
@ -795,7 +796,7 @@ static unsigned r600_get_swizzle_combined(const unsigned char *swizzle_format,
|
|||
|
||||
/* texture format translate */
|
||||
uint32_t r600_translate_texformat(enum pipe_format format,
|
||||
const unsigned char *swizzle_view,
|
||||
const unsigned char *swizzle_view,
|
||||
uint32_t *word4_p, uint32_t *yuv_format_p)
|
||||
{
|
||||
uint32_t result = 0, word4 = 0, yuv_format = 0;
|
||||
|
|
@ -849,7 +850,7 @@ uint32_t r600_translate_texformat(enum pipe_format format,
|
|||
break;
|
||||
}
|
||||
goto out_unknown; /* TODO */
|
||||
|
||||
|
||||
case UTIL_FORMAT_COLORSPACE_SRGB:
|
||||
word4 |= S_038010_FORCE_DEGAMMA(1);
|
||||
if (format == PIPE_FORMAT_L8A8_SRGB || format == PIPE_FORMAT_L8_SRGB)
|
||||
|
|
@ -865,7 +866,7 @@ uint32_t r600_translate_texformat(enum pipe_format format,
|
|||
static int r600_enable_s3tc = -1;
|
||||
|
||||
if (r600_enable_s3tc == -1)
|
||||
r600_enable_s3tc =
|
||||
r600_enable_s3tc =
|
||||
debug_get_bool_option("R600_ENABLE_S3TC", FALSE);
|
||||
|
||||
if (!r600_enable_s3tc)
|
||||
|
|
@ -888,7 +889,7 @@ uint32_t r600_translate_texformat(enum pipe_format format,
|
|||
}
|
||||
|
||||
|
||||
for (i = 0; i < desc->nr_channels; i++) {
|
||||
for (i = 0; i < desc->nr_channels; i++) {
|
||||
if (desc->channel[i].type == UTIL_FORMAT_TYPE_SIGNED) {
|
||||
word4 |= sign_bit[i];
|
||||
}
|
||||
|
|
@ -902,7 +903,7 @@ uint32_t r600_translate_texformat(enum pipe_format format,
|
|||
for (i = 1; i < desc->nr_channels; i++) {
|
||||
uniform = uniform && desc->channel[0].size == desc->channel[i].size;
|
||||
}
|
||||
|
||||
|
||||
/* Non-uniform formats. */
|
||||
if (!uniform) {
|
||||
switch(desc->nr_channels) {
|
||||
|
|
@ -1020,7 +1021,7 @@ uint32_t r600_translate_texformat(enum pipe_format format,
|
|||
goto out_word4;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
out_word4:
|
||||
if (word4_p)
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue