ilo: clarify valid and preferred tilings

We did it right until the switch to gen_surface_tiling, which has
GEN8_TILING_W.  Generally, GEN8_TILING_W may be valid but not preferred.
This commit is contained in:
Chia-I Wu 2015-03-06 12:41:55 -07:00
parent bf061a3d2e
commit bca6c8572f
2 changed files with 29 additions and 15 deletions

View File

@ -460,8 +460,7 @@ layout_get_valid_tilings(const struct ilo_layout *layout,
{
const struct pipe_resource *templ = params->templ;
const enum pipe_format format = layout->format;
/* W-tiling is too restrictive */
unsigned valid_tilings = LAYOUT_TILING_ALL & ~LAYOUT_TILING_W;
unsigned valid_tilings = LAYOUT_TILING_ALL;
/*
* From the Sandy Bridge PRM, volume 1 part 2, page 32:
@ -496,8 +495,7 @@ layout_get_valid_tilings(const struct ilo_layout *layout,
if (templ->bind & PIPE_BIND_DEPTH_STENCIL) {
switch (format) {
case PIPE_FORMAT_S8_UINT:
/* this is the only case LAYOUT_TILING_W is valid */
valid_tilings = LAYOUT_TILING_W;
valid_tilings &= LAYOUT_TILING_W;
break;
default:
valid_tilings &= LAYOUT_TILING_Y;
@ -532,6 +530,13 @@ layout_get_valid_tilings(const struct ilo_layout *layout,
ilo_dev_gen(params->dev) <= ILO_GEN(7.5) &&
layout->format == PIPE_FORMAT_R32G32B32_FLOAT)
valid_tilings &= ~LAYOUT_TILING_Y;
valid_tilings &= ~LAYOUT_TILING_W;
}
if (templ->bind & PIPE_BIND_SAMPLER_VIEW) {
if (ilo_dev_gen(params->dev) < ILO_GEN(8))
valid_tilings &= ~LAYOUT_TILING_W;
}
/* no conflicting binding flags */
@ -545,33 +550,39 @@ layout_init_tiling(struct ilo_layout *layout,
struct ilo_layout_params *params)
{
const struct pipe_resource *templ = params->templ;
unsigned valid_tilings = layout_get_valid_tilings(layout, params);
unsigned preferred_tilings;
layout->valid_tilings = valid_tilings;
layout->valid_tilings = layout_get_valid_tilings(layout, params);
preferred_tilings = layout->valid_tilings;
/* no fencing nor BLT support */
if (preferred_tilings & ~LAYOUT_TILING_W)
preferred_tilings &= ~LAYOUT_TILING_W;
if (templ->bind & (PIPE_BIND_RENDER_TARGET | PIPE_BIND_SAMPLER_VIEW)) {
/*
* heuristically set a minimum width/height for enabling tiling
*/
if (layout->width0 < 64 && (valid_tilings & ~LAYOUT_TILING_X))
valid_tilings &= ~LAYOUT_TILING_X;
if (layout->width0 < 64 && (preferred_tilings & ~LAYOUT_TILING_X))
preferred_tilings &= ~LAYOUT_TILING_X;
if ((layout->width0 < 32 || layout->height0 < 16) &&
(layout->width0 < 16 || layout->height0 < 32) &&
(valid_tilings & ~LAYOUT_TILING_Y))
valid_tilings &= ~LAYOUT_TILING_Y;
(preferred_tilings & ~LAYOUT_TILING_Y))
preferred_tilings &= ~LAYOUT_TILING_Y;
} else {
/* force linear if we are not sure where the texture is bound to */
if (valid_tilings & LAYOUT_TILING_NONE)
valid_tilings &= LAYOUT_TILING_NONE;
if (preferred_tilings & LAYOUT_TILING_NONE)
preferred_tilings &= LAYOUT_TILING_NONE;
}
/* prefer tiled over linear */
if (valid_tilings & LAYOUT_TILING_Y)
if (preferred_tilings & LAYOUT_TILING_Y)
layout->tiling = GEN6_TILING_Y;
else if (valid_tilings & LAYOUT_TILING_X)
else if (preferred_tilings & LAYOUT_TILING_X)
layout->tiling = GEN6_TILING_X;
else if (valid_tilings & LAYOUT_TILING_W)
else if (preferred_tilings & LAYOUT_TILING_W)
layout->tiling = GEN8_TILING_W;
else
layout->tiling = GEN6_TILING_NONE;

View File

@ -220,6 +220,9 @@ tex_create_separate_stencil(struct ilo_texture *tex)
*/
templ.format = PIPE_FORMAT_S8_UINT;
/* no stencil texturing */
templ.bind &= ~PIPE_BIND_SAMPLER_VIEW;
s8 = tex->base.screen->resource_create(tex->base.screen, &templ);
if (!s8)
return false;