ilo: set more fields of 3DSTATE_DEPTH_BUFFER

Set lod/layer related fields of 3DSTATE_DEPTH_BUFFER.  Since we always point
to a single level/layer, those fields are always zero and this commit
effectively makes no change.

While at it, make it easier to disable manual slice offset calculation.
This commit is contained in:
Chia-I Wu
2013-05-22 12:19:13 +08:00
parent f3da711bea
commit ff68f61bed

View File

@@ -2283,10 +2283,13 @@ ilo_gpe_gen6_emit_3DSTATE_DEPTH_BUFFER(const struct ilo_dev_info *dev,
ILO_GPE_CMD(0x3, 0x0, 0x05) : ILO_GPE_CMD(0x3, 0x1, 0x05);
const uint8_t cmd_len = 7;
const int max_2d_size = (dev->gen >= ILO_GEN(7)) ? 16384 : 8192;
const int max_array_size = (dev->gen >= ILO_GEN(7)) ? 2048 : 512;
struct ilo_texture *tex;
uint32_t dw1, dw3;
uint32_t dw1, dw3, dw4, dw6;
uint32_t slice_offset, x_offset, y_offset;
int surface_type, depth_format, width, height;
int surface_type, depth_format;
unsigned lod, first_layer, num_layers;
unsigned width, height, depth;
bool separate_stencil, has_depth, has_stencil;
ILO_GPE_VALID_GEN(dev, 6, 7);
@@ -2338,69 +2341,118 @@ ilo_gpe_gen6_emit_3DSTATE_DEPTH_BUFFER(const struct ilo_dev_info *dev,
}
tex = ilo_texture(surface->texture);
surface_type = ilo_gpe_gen6_translate_texture(tex->base.target);
width = surface->width;
height = surface->height;
lod = surface->u.tex.level;
first_layer = surface->u.tex.first_layer;
num_layers = surface->u.tex.last_layer - first_layer + 1;
width = tex->base.width0;
height = tex->base.height0;
depth = (tex->base.target == PIPE_TEXTURE_3D) ?
tex->base.depth0 : num_layers;
if (surface_type == BRW_SURFACE_CUBE) {
/*
* From the Sandy Bridge PRM, volume 2 part 1, page 325-326:
*
* "For Other Surfaces (Cube Surfaces):
* This field (Minimum Array Element) is ignored."
*
* "For Other Surfaces (Cube Surfaces):
* This field (Render Target View Extent) is ignored."
*
* As such, we cannot set first_layer and num_layers on cube surfaces.
* To work around that, treat it as a 2D surface.
*/
surface_type = BRW_SURFACE_2D;
}
/*
* we always treat the resource as non-mipmapped and set the slice/x/y
* offsets manually
*/
slice_offset = ilo_texture_get_slice_offset(tex,
surface->u.tex.level, surface->u.tex.first_layer,
&x_offset, &y_offset);
if (true) {
/* no layered rendering */
assert(num_layers == 1);
/*
* From the Sandy Bridge PRM, volume 2 part 1, page 326:
*
* "The 3 LSBs of both offsets (Depth Coordinate Offset Y and Depth
* Coordinate Offset X) must be zero to ensure correct alignment"
*
* XXX Skip the check for gen6, which seems to be fine. We need to make
* sure that does not happen eventually.
*/
if (dev->gen >= ILO_GEN(7)) {
assert((x_offset & 7) == 0 && (y_offset & 7) == 0);
x_offset &= ~7;
y_offset &= ~7;
slice_offset = ilo_texture_get_slice_offset(tex,
lod, first_layer, &x_offset, &y_offset);
/*
* From the Sandy Bridge PRM, volume 2 part 1, page 326:
*
* "The 3 LSBs of both offsets (Depth Coordinate Offset Y and Depth
* Coordinate Offset X) must be zero to ensure correct alignment"
*
* XXX Skip the check for gen6, which seems to be fine. We need to make
* sure that does not happen eventually.
*/
if (dev->gen >= ILO_GEN(7)) {
assert((x_offset & 7) == 0 && (y_offset & 7) == 0);
x_offset &= ~7;
y_offset &= ~7;
}
/* the size of the layer */
width = u_minify(width, lod);
height = u_minify(height, lod);
if (surface_type == BRW_SURFACE_3D)
depth = u_minify(depth, lod);
else
depth = 1;
lod = 0;
first_layer = 0;
width += x_offset;
height += y_offset;
/* we have to treat them as 2D surfaces */
if (surface_type == BRW_SURFACE_CUBE) {
assert(tex->base.width0 == tex->base.height0);
/* we will set slice_offset to point to the single face */
surface_type = BRW_SURFACE_2D;
}
else if (surface_type == BRW_SURFACE_1D && height > 1) {
assert(tex->base.height0 == 1);
surface_type = BRW_SURFACE_2D;
}
}
else {
slice_offset = 0;
x_offset = 0;
y_offset = 0;
}
width += x_offset;
height += y_offset;
/* required for GEN6+ */
assert(tex->tiling == INTEL_TILING_Y);
assert(tex->bo_stride > 0 && tex->bo_stride < 128 * 1024 &&
tex->bo_stride % 128 == 0);
assert(surface->u.tex.first_layer == surface->u.tex.last_layer);
assert(width <= tex->bo_stride);
/* we have to treat them as 2D surfaces */
if (surface_type == BRW_SURFACE_CUBE) {
assert(surface->width == surface->height);
/* we will set slice_offset to point to the single face */
surface_type = BRW_SURFACE_2D;
}
else if (surface_type == BRW_SURFACE_1D && height > 1) {
assert(surface->height == 1);
surface_type = BRW_SURFACE_2D;
}
switch (surface_type) {
case BRW_SURFACE_1D:
assert(width <= max_2d_size && height == 1);
assert(width <= max_2d_size && height == 1 &&
depth <= max_array_size);
assert(first_layer < max_array_size - 1 &&
num_layers <= max_array_size);
break;
case BRW_SURFACE_2D:
assert(width <= max_2d_size && height <= max_2d_size);
assert(width <= max_2d_size && height <= max_2d_size &&
depth <= max_array_size);
assert(first_layer < max_array_size - 1 &&
num_layers <= max_array_size);
break;
case BRW_SURFACE_3D:
assert(width <= 2048 && height <= 2048);
assert(width <= 2048 && height <= 2048 && depth <= 2048);
assert(first_layer < 2048 && num_layers <= max_array_size);
assert(x_offset == 0 && y_offset == 0);
break;
case BRW_SURFACE_CUBE:
assert(width <= max_2d_size && height <= max_2d_size &&
width == height);
assert(width <= max_2d_size && height <= max_2d_size && depth == 1);
assert(first_layer == 0 && num_layers == 1);
assert(width == height);
assert(x_offset == 0 && y_offset == 0);
break;
default:
@@ -2425,7 +2477,13 @@ ilo_gpe_gen6_emit_3DSTATE_DEPTH_BUFFER(const struct ilo_dev_info *dev,
dw1 |= 1 << 27;
dw3 = (height - 1) << 18 |
(width - 1) << 4;
(width - 1) << 4 |
lod;
dw4 = (depth - 1) << 21 |
first_layer << 10;
dw6 = (num_layers - 1) << 21;
}
else {
dw1 |= (tex->tiling != INTEL_TILING_NONE) << 27 |
@@ -2438,7 +2496,14 @@ ilo_gpe_gen6_emit_3DSTATE_DEPTH_BUFFER(const struct ilo_dev_info *dev,
dw3 = (height - 1) << 19 |
(width - 1) << 6 |
lod << 2 |
BRW_SURFACE_MIPMAPLAYOUT_BELOW << 1;
dw4 = (depth - 1) << 21 |
first_layer << 10 |
(num_layers - 1) << 1;
dw6 = 0;
}
ilo_cp_begin(cp, cmd_len);
@@ -2454,9 +2519,9 @@ ilo_gpe_gen6_emit_3DSTATE_DEPTH_BUFFER(const struct ilo_dev_info *dev,
}
ilo_cp_write(cp, dw3);
ilo_cp_write(cp, 0);
ilo_cp_write(cp, dw4);
ilo_cp_write(cp, y_offset << 16 | x_offset);
ilo_cp_write(cp, 0);
ilo_cp_write(cp, dw6);
ilo_cp_end(cp);
}
@@ -2659,10 +2724,17 @@ gen6_emit_3DSTATE_STENCIL_BUFFER(const struct ilo_dev_info *dev,
return;
}
slice_offset = ilo_texture_get_slice_offset(tex,
surface->u.tex.level, surface->u.tex.first_layer,
&x_offset, &y_offset);
/* XXX X/Y offsets inherit from 3DSTATE_DEPTH_BUFFER */
if (true) {
slice_offset = ilo_texture_get_slice_offset(tex,
surface->u.tex.level, surface->u.tex.first_layer,
&x_offset, &y_offset);
/* XXX X/Y offsets inherit from 3DSTATE_DEPTH_BUFFER */
}
else {
slice_offset = 0;
x_offset = 0;
y_offset = 0;
}
/*
* From the Sandy Bridge PRM, volume 2 part 1, page 329: