<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Jun 13, 2017 at 12:11 PM, Topi Pohjolainen <span dir="ltr"><<a href="mailto:topi.pohjolainen@gmail.com" target="_blank">topi.pohjolainen@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Signed-off-by: Topi Pohjolainen <<a href="mailto:topi.pohjolainen@intel.com">topi.pohjolainen@intel.com</a>><br>
---<br>
src/mesa/drivers/dri/i965/brw_<wbr>misc_state.c | 9 +-<br>
src/mesa/drivers/dri/i965/<wbr>gen6_depth_state.c | 2 +-<br>
src/mesa/drivers/dri/i965/<wbr>gen7_misc_state.c | 2 +-<br>
src/mesa/drivers/dri/i965/<wbr>gen8_depth_state.c | 5 +-<br>
src/mesa/drivers/dri/i965/<wbr>intel_fbo.c | 4 +-<br>
src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.c | 140 +++++++++++++++++---------<br>
6 files changed, 102 insertions(+), 60 deletions(-)<br>
<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>brw_misc_state.c b/src/mesa/drivers/dri/i965/<wbr>brw_misc_state.c<br>
index 3f3bd2535e..e744ed2482 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>brw_misc_state.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>brw_misc_state.c<br>
@@ -143,8 +143,8 @@ rebase_depth_stencil(struct brw_context *brw, struct intel_renderbuffer *irb,<br>
struct gl_context *ctx = &brw->ctx;<br>
uint32_t tile_mask_x = 0, tile_mask_y = 0;<br>
<br>
- intel_get_tile_masks(irb->mt-><wbr>tiling, irb->mt->cpp,<br>
- &tile_mask_x, &tile_mask_y);<br>
+ const unsigned cpp = isl_format_get_layout(irb->mt-<wbr>>surf.format)->bpb / 8;<br>
+ intel_get_tile_masks(I915_<wbr>TILING_Y, cpp, &tile_mask_x, &tile_mask_y);<br>
assert(!intel_miptree_level_<wbr>has_hiz(irb->mt, irb->mt_level));<br>
<br>
uint32_t tile_x = irb->draw_x & tile_mask_x;<br>
@@ -313,8 +313,7 @@ brw_emit_depthbuffer(struct brw_context *brw)<br>
/* Prior to Gen7, if using separate stencil, hiz must be enabled. */<br>
assert(brw->gen >= 7 || !separate_stencil || hiz);<br>
<br>
- assert(brw->gen < 6 || depth_mt->tiling == I915_TILING_Y);<br>
- assert(!hiz || depth_mt->tiling == I915_TILING_Y);<br>
+ assert(depth_mt->surf.tiling == ISL_TILING_Y0);<br></blockquote><div><br></div><div>The top two hunks should probably go in the previous patch.<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br>
depthbuffer_format = brw_depthbuffer_format(brw);<br>
depth_surface_type = BRW_SURFACE_2D;<br>
@@ -387,7 +386,7 @@ brw_emit_depth_stencil_hiz(<wbr>struct brw_context *brw,<br>
<br>
BEGIN_BATCH(len);<br>
OUT_BATCH(_3DSTATE_DEPTH_<wbr>BUFFER << 16 | (len - 2));<br>
- OUT_BATCH((depth_mt ? depth_mt->pitch - 1 : 0) |<br>
+ OUT_BATCH((depth_mt ? depth_mt->surf.row_pitch - 1 : 0) |<br>
(depthbuffer_format << 18) |<br>
(BRW_TILEWALK_YMAJOR << 26) |<br>
(1 << 27) |<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>gen6_depth_state.c b/src/mesa/drivers/dri/i965/<wbr>gen6_depth_state.c<br>
index 35c4aa537c..3e3d2c629b 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>gen6_depth_state.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>gen6_depth_state.c<br>
@@ -116,7 +116,7 @@ gen6_emit_depth_stencil_hiz(<wbr>struct brw_context *brw,<br>
OUT_BATCH(_3DSTATE_DEPTH_<wbr>BUFFER << 16 | (7 - 2));<br>
<br>
/* 3DSTATE_DEPTH_BUFFER dw1 */<br>
- OUT_BATCH((depth_mt ? depth_mt->pitch - 1 : 0) |<br>
+ OUT_BATCH((depth_mt ? depth_mt->surf.row_pitch - 1 : 0) |<br>
(depthbuffer_format << 18) |<br>
((enable_hiz_ss ? 1 : 0) << 21) | /* separate stencil enable */<br>
((enable_hiz_ss ? 1 : 0) << 22) | /* hiz enable */<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>gen7_misc_state.c b/src/mesa/drivers/dri/i965/<wbr>gen7_misc_state.c<br>
index f272e05860..6b519527e9 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>gen7_misc_state.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>gen7_misc_state.c<br>
@@ -109,7 +109,7 @@ gen7_emit_depth_stencil_hiz(<wbr>struct brw_context *brw,<br>
OUT_BATCH(GEN7_3DSTATE_DEPTH_<wbr>BUFFER << 16 | (7 - 2));<br>
<br>
/* 3DSTATE_DEPTH_BUFFER dw1 */<br>
- OUT_BATCH((depth_mt ? depth_mt->pitch - 1 : 0) |<br>
+ OUT_BATCH((depth_mt ? depth_mt->surf.row_pitch - 1 : 0) |<br>
(depthbuffer_format << 18) |<br>
((hiz ? 1 : 0) << 22) |<br>
((stencil_mt != NULL && ctx->Stencil._WriteEnabled) << 27) |<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>gen8_depth_state.c b/src/mesa/drivers/dri/i965/<wbr>gen8_depth_state.c<br>
index 7729fac091..d826654cc4 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>gen8_depth_state.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>gen8_depth_state.c<br>
@@ -67,7 +67,7 @@ emit_depth_packets(struct brw_context *brw,<br>
(stencil_mt != NULL && stencil_writable) << 27 |<br>
(hiz ? 1 : 0) << 22 |<br>
depthbuffer_format << 18 |<br>
- (depth_mt ? depth_mt->pitch - 1 : 0));<br>
+ (depth_mt ? depth_mt->surf.row_pitch - 1 : 0));<br></blockquote><div><br></div><div>Wow, this code is repeated too many times...<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
if (depth_mt) {<br>
OUT_RELOC64(depth_mt->bo,<br>
I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER, 0);<br>
@@ -78,7 +78,8 @@ emit_depth_packets(struct brw_context *brw,<br>
OUT_BATCH(((width - 1) << 4) | ((height - 1) << 18) | lod);<br>
OUT_BATCH(((depth - 1) << 21) | (min_array_element << 10) | mocs_wb);<br>
OUT_BATCH(0);<br>
- OUT_BATCH(((depth - 1) << 21) | (depth_mt ? depth_mt->qpitch >> 2 : 0));<br>
+ OUT_BATCH(((depth - 1) << 21) |<br>
+ (depth_mt ? depth_mt->surf.array_pitch_el_<wbr>rows >> 2 : 0));<br>
ADVANCE_BATCH();<br>
<br>
if (!hiz) {<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>intel_fbo.c b/src/mesa/drivers/dri/i965/<wbr>intel_fbo.c<br>
index 04ca480dfa..2b19971996 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>intel_fbo.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>intel_fbo.c<br>
@@ -989,7 +989,9 @@ intel_renderbuffer_move_to_<wbr>temp(struct brw_context *brw,<br>
intel_image->base.Base.<wbr>TexFormat,<br>
0, 0,<br>
width, height, 1,<br>
- irb->mt->num_samples,<br>
+ irb->mt->surf.size > 0 ?<br>
+ irb->mt->surf.samples :<br>
+ irb->mt->num_samples,<br>
layout_flags);<br>
<br>
if (intel_miptree_wants_hiz_<wbr>buffer(brw, new_mt)) {<br>
diff --git a/src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.c b/src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.c<br>
index b58e9454d1..beac3085a2 100644<br>
--- a/src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.c<br>
+++ b/src/mesa/drivers/dri/i965/<wbr>intel_mipmap_tree.c<br>
@@ -501,44 +501,7 @@ intel_miptree_create_layout(<wbr>struct brw_context *brw,<br>
mt->physical_height0 = height0;<br>
mt->physical_depth0 = depth0;<br>
<br>
- if (needs_stencil(brw, mt, format, layout_flags)) {<br>
- uint32_t stencil_flags = MIPTREE_LAYOUT_ACCELERATED_<wbr>UPLOAD;<br>
- if (brw->gen == 6) {<br>
- stencil_flags |= MIPTREE_LAYOUT_GEN6_HIZ_<wbr>STENCIL |<br>
- MIPTREE_LAYOUT_TILING_ANY;<br>
- }<br>
-<br>
- mt->stencil_mt = intel_miptree_create(brw,<br>
- mt->target,<br>
- MESA_FORMAT_S_UINT8,<br>
- mt->first_level,<br>
- mt->last_level,<br>
- mt->logical_width0,<br>
- mt->logical_height0,<br>
- mt->logical_depth0,<br>
- num_samples,<br>
- stencil_flags);<br>
-<br>
- if (!mt->stencil_mt) {<br>
- intel_miptree_release(&mt);<br>
- return NULL;<br>
- }<br>
- mt->stencil_mt->r8stencil_<wbr>needs_update = true;<br>
-<br>
- /* Fix up the Z miptree format for how we're splitting out separate<br>
- * stencil. Gen7 expects there to be no stencil bits in its depth buffer.<br>
- */<br>
- mt->format = intel_depth_format_for_<wbr>depthstencil_format(mt-><wbr>format);<br>
- mt->cpp = 4;<br>
-<br>
- if (format == mt->format) {<br>
- _mesa_problem(NULL, "Unknown format %s in separate stencil mt\n",<br>
- _mesa_get_format_name(mt-><wbr>format));<br>
- }<br>
- }<br>
-<br>
- if (layout_flags & MIPTREE_LAYOUT_GEN6_HIZ_<wbr>STENCIL)<br>
- mt->array_layout = GEN6_HIZ_STENCIL;<br>
+ assert(!needs_stencil(brw, mt, format, layout_flags));<br>
<br>
/*<br>
* Obey HALIGN_16 constraints for Gen8 and Gen9 buffers which are<br>
@@ -748,6 +711,40 @@ fail:<br>
return NULL;<br>
}<br>
<br>
+static bool<br>
+separate_stencil_surface(<wbr>struct brw_context *brw,<br>
+ struct intel_mipmap_tree *mt)<br></blockquote><div><br></div><div>Calling these _surface seems a bit odd since they do create something. Why so generic?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+{<br>
+ mt->stencil_mt = make_surface(brw, mt->target, MESA_FORMAT_S_UINT8,<br>
+ 0, mt->surf.levels - 1,<br>
+ mt->surf.logical_level0_px.<wbr>width,<br>
+ mt->surf.logical_level0_px.<wbr>height,<br>
+ mt->surf.dim == ISL_SURF_DIM_3D ?<br>
+ mt->surf.logical_level0_px.<wbr>depth :<br>
+ mt->surf.logical_level0_px.<wbr>array_len,<br>
+ mt->surf.samples, ISL_TILING_W,<br>
+ ISL_SURF_USAGE_STENCIL_BIT |<br>
+ ISL_SURF_USAGE_TEXTURE_BIT,<br>
+ BO_ALLOC_FOR_RENDER, NULL);<br>
+<br>
+ if (!mt->stencil_mt)<br>
+ return false;<br>
+<br>
+ mt->stencil_mt->r8stencil_<wbr>needs_update = true;<br>
+<br>
+ return true;<br>
+}<br>
+<br>
+static bool<br>
+force_linear_tiling(uint32_t layout_flags)<br>
+{<br>
+ /* ANY includes NONE and Y bit. */<br>
+ if (layout_flags & MIPTREE_LAYOUT_TILING_Y)<br>
+ return false;<br>
+<br>
+ return layout_flags & MIPTREE_LAYOUT_TILING_NONE;<br>
+}<br>
+<br>
static struct intel_mipmap_tree *<br>
miptree_create(struct brw_context *brw,<br>
GLenum target,<br>
@@ -767,6 +764,31 @@ miptree_create(struct brw_context *brw,<br>
ISL_SURF_USAGE_TEXTURE_BIT,<br>
BO_ALLOC_FOR_RENDER, NULL);<br>
<br>
+ const GLenum base_format = _mesa_get_format_base_format(<wbr>format);<br>
+ if ((base_format == GL_DEPTH_COMPONENT ||<br>
+ base_format == GL_DEPTH_STENCIL) &&<br>
+ !force_linear_tiling(layout_<wbr>flags)) {<br></blockquote><div><br></div><div>Previous patches deleted support for linear depth... Maybe we should assert here instead?<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
+ /* Fix up the Z miptree format for how we're splitting out separate<br>
+ * stencil. Gen7 expects there to be no stencil bits in its depth buffer.<br>
+ */<br>
+ const mesa_format depth_only_format =<br>
+ intel_depth_format_for_<wbr>depthstencil_format(format);<br>
+ struct intel_mipmap_tree *mt = make_surface(<br>
+ brw, target, brw->gen >= 6 ? depth_only_format : format,<br>
+ first_level, last_level,<br>
+ width0, height0, depth0, num_samples, ISL_TILING_Y0,<br>
+ ISL_SURF_USAGE_DEPTH_BIT | ISL_SURF_USAGE_TEXTURE_BIT,<br>
+ BO_ALLOC_FOR_RENDER, NULL);<br>
+<br>
+ if (needs_stencil(brw, mt, format, layout_flags) &&<br>
+ !separate_stencil_surface(brw, mt)) {<br>
+ intel_miptree_release(&mt);<br>
+ return NULL;<br>
+ }<br>
+<br>
+ return mt;<br>
+ }<br>
+<br>
struct intel_mipmap_tree *mt;<br>
mesa_format tex_format = format;<br>
mesa_format etc_format = MESA_FORMAT_NONE;<br>
@@ -906,8 +928,31 @@ intel_miptree_create_for_bo(<wbr>struct brw_context *brw,<br>
uint32_t layout_flags)<br></blockquote><div><br></div><div>Does create_for_bo get called on depth surfaces? That's a bit horrifying...<br></div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
{<br>
struct intel_mipmap_tree *mt;<br>
+ const GLenum target = depth > 1 ? GL_TEXTURE_2D_ARRAY : GL_TEXTURE_2D;<br>
+ const GLenum base_format = _mesa_get_format_base_format(<wbr>format);<br>
+<br>
+ if ((base_format == GL_DEPTH_COMPONENT ||<br>
+ base_format == GL_DEPTH_STENCIL) &&<br>
+ !force_linear_tiling(layout_<wbr>flags)) {<br>
+ const mesa_format depth_only_format =<br>
+ intel_depth_format_for_<wbr>depthstencil_format(format);<br>
+ mt = make_surface(brw, target,<br>
+ brw->gen >= 6 ? depth_only_format : format,<br>
+ 0, 0, width, height, depth, 1, ISL_TILING_Y0,<br>
+ ISL_SURF_USAGE_DEPTH_BIT | ISL_SURF_USAGE_TEXTURE_BIT,<br>
+ BO_ALLOC_FOR_RENDER, bo);<br>
+<br>
+ if (needs_stencil(brw, mt, format, layout_flags) &&<br>
+ !separate_stencil_surface(brw, mt)) {<br>
+ intel_miptree_release(&mt);<br>
+ return NULL;<br>
+ }<br>
+<br>
+ brw_bo_reference(bo);<br>
+ return mt;<br>
+ }<br>
+<br>
uint32_t tiling, swizzle;<br>
- GLenum target;<br>
<br>
brw_bo_get_tiling(bo, &tiling, &swizzle);<br>
<br>
@@ -922,8 +967,6 @@ intel_miptree_create_for_bo(<wbr>struct brw_context *brw,<br>
*/<br>
assert(pitch >= 0);<br>
<br>
- target = depth > 1 ? GL_TEXTURE_2D_ARRAY : GL_TEXTURE_2D;<br>
-<br>
/* The BO already has a tiling format and we shouldn't confuse the lower<br>
* layers by making it try to find a tiling format again.<br>
*/<br>
@@ -1869,18 +1912,15 @@ intel_miptree_alloc_hiz(struct brw_context *brw,<br>
if (!aux_state)<br>
return false;<br>
<br>
- struct isl_surf temp_main_surf;<br>
struct isl_surf temp_hiz_surf;<br>
-<br>
- intel_miptree_get_isl_surf(<wbr>brw, mt, &temp_main_surf);<br>
- isl_surf_get_hiz_surf(&brw-><wbr>isl_dev, &temp_main_surf, &temp_hiz_surf);<br>
+ isl_surf_get_hiz_surf(&brw-><wbr>isl_dev, &mt->surf, &temp_hiz_surf);<br>
<br>
assert(temp_hiz_surf.size &&<br>
(temp_hiz_surf.size % temp_hiz_surf.row_pitch == 0));<br>
<br>
const uint32_t alloc_flags = BO_ALLOC_FOR_RENDER;<br>
mt->hiz_buf = intel_alloc_aux_buffer(brw, "hiz-miptree",<br>
- &temp_main_surf, &temp_hiz_surf,<br>
+ &mt->surf, &temp_hiz_surf,<br>
alloc_flags, mt);<br>
<br>
if (!mt->hiz_buf) {<br>
@@ -1918,7 +1958,7 @@ intel_miptree_sample_with_hiz(<wbr>struct brw_context *brw,<br>
* mipmap levels aren't available in the HiZ buffer. So we need all levels<br>
* of the texture to be HiZ enabled.<br>
*/<br>
- for (unsigned level = mt->first_level; level <= mt->last_level; ++level) {<br>
+ for (unsigned level = 0; level < mt->surf.levels; ++level) {<br>
if (!intel_miptree_level_has_hiz(<wbr>mt, level))<br>
return false;<br>
}<br>
@@ -1935,7 +1975,7 @@ intel_miptree_sample_with_hiz(<wbr>struct brw_context *brw,<br>
* There is no such blurb for 1D textures, but there is sufficient evidence<br>
* that this is broken on SKL+.<br>
*/<br>
- return (mt->num_samples <= 1 &&<br>
+ return (mt->surf.samples <= 1 &&<br>
mt->target != GL_TEXTURE_3D &&<br>
mt->target != GL_TEXTURE_1D /* gen9+ restriction */);<br>
}<br>
@@ -3271,7 +3311,7 @@ intel_miptree_map_<wbr>depthstencil(struct brw_context *brw,<br>
map_y + s_image_y,<br>
brw->has_swizzling);<br>
ptrdiff_t z_offset = ((map_y + z_image_y) *<br>
- (z_mt->pitch / 4) +<br>
+ (z_mt->surf.row_pitch / 4) +<br>
(map_x + z_image_x));<br>
uint8_t s = s_map[s_offset];<br>
uint32_t z = z_map[z_offset];<br>
@@ -3337,7 +3377,7 @@ intel_miptree_unmap_<wbr>depthstencil(struct brw_context *brw,<br>
y + s_image_y + map->y,<br>
brw->has_swizzling);<br>
ptrdiff_t z_offset = ((y + z_image_y + map->y) *<br>
- (z_mt->pitch / 4) +<br>
+ (z_mt->surf.row_pitch / 4) +<br>
(x + z_image_x + map->x));<br>
<br>
if (map_z32f_x24s8) {<br>
<span class="HOEnZb"><font color="#888888">--<br>
2.11.0<br>
<br>
______________________________<wbr>_________________<br>
mesa-dev mailing list<br>
<a href="mailto:mesa-dev@lists.freedesktop.org">mesa-dev@lists.freedesktop.org</a><br>
<a href="https://lists.freedesktop.org/mailman/listinfo/mesa-dev" rel="noreferrer" target="_blank">https://lists.freedesktop.org/<wbr>mailman/listinfo/mesa-dev</a><br>
</font></span></blockquote></div><br></div></div>