139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen/*
239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * Copyright (c) 2014 Intel Corporation
339a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen *
439a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * Permission is hereby granted, free of charge, to any person obtaining a
539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * copy of this software and associated documentation files (the "Software"),
639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * to deal in the Software without restriction, including without limitation
739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * the rights to use, copy, modify, merge, publish, distribute, sublicense,
839a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * and/or sell copies of the Software, and to permit persons to whom the
939a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * Software is furnished to do so, subject to the following conditions:
1039a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen *
1139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * The above copyright notice and this permission notice (including the next
1239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * paragraph) shall be included in all copies or substantial portions of the
1339a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * Software.
1439a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen *
1539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
1639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
1739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
1839a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
1939a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
2039a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
2139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen * IN THE SOFTWARE.
2239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen */
2339a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
2439a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
2539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen#include "intel_batchbuffer.h"
2639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen#include "intel_fbo.h"
2739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen#include "intel_mipmap_tree.h"
2839a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
2939a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen#include "brw_context.h"
3039a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen#include "brw_state.h"
3139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen#include "brw_defines.h"
3239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
3348acf19d2311385f1bbec76ddceb911596f567ecJordan Justen#include "main/mtypes.h"
3439a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen#include "main/fbobject.h"
3539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen#include "main/glformats.h"
3639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
3739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justenvoid
3839a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justengen6_emit_depth_stencil_hiz(struct brw_context *brw,
3939a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen                            struct intel_mipmap_tree *depth_mt,
4039a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen                            uint32_t depth_offset, uint32_t depthbuffer_format,
4139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen                            uint32_t depth_surface_type,
4239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen                            struct intel_mipmap_tree *stencil_mt,
4339a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen                            bool hiz, bool separate_stencil,
4439a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen                            uint32_t width, uint32_t height,
4539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen                            uint32_t tile_x, uint32_t tile_y)
4639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen{
4748acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   struct gl_context *ctx = &brw->ctx;
4848acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   struct gl_framebuffer *fb = ctx->DrawBuffer;
4948acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   uint32_t surftype;
5051b38106d74b1bd4fa2ce552f489c374bdffa812Jordan Justen   unsigned int depth = 1;
5148acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   GLenum gl_target = GL_TEXTURE_2D;
52cfa19af966f52a153502f8296493b7b08960f7f5Jordan Justen   unsigned int lod;
5356cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   const struct intel_mipmap_tree *mt = depth_mt ? depth_mt : stencil_mt;
5448acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   const struct intel_renderbuffer *irb = NULL;
5548acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   const struct gl_renderbuffer *rb = NULL;
5648acf19d2311385f1bbec76ddceb911596f567ecJordan Justen
5739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen   /* Enable the hiz bit if we're doing separate stencil, because it and the
5839a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    * separate stencil bit must have the same value. From Section 2.11.5.6.1.1
5939a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    * 3DSTATE_DEPTH_BUFFER, Bit 1.21 "Separate Stencil Enable":
6039a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    *     [DevIL]: If this field is enabled, Hierarchical Depth Buffer
6139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    *     Enable must also be enabled.
6239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    *
6339a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    *     [DevGT]: This field must be set to the same value (enabled or
6439a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    *     disabled) as Hierarchical Depth Buffer Enable
6539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    */
6639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen   bool enable_hiz_ss = hiz || separate_stencil;
6739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
684b35ab9bdb4e663f41ff5c9ae5bbcc650b6093f9Chris Wilson   brw_emit_depth_stall_flushes(brw);
6939a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
7048acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   irb = intel_get_renderbuffer(fb, BUFFER_DEPTH);
7148acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   if (!irb)
7248acf19d2311385f1bbec76ddceb911596f567ecJordan Justen      irb = intel_get_renderbuffer(fb, BUFFER_STENCIL);
7348acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   rb = (struct gl_renderbuffer*) irb;
7448acf19d2311385f1bbec76ddceb911596f567ecJordan Justen
7548acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   if (rb) {
766be024f44dea7df6608e5a3111deffc61dbf6d6dKenneth Graunke      depth = MAX2(irb->layer_count, 1);
7748acf19d2311385f1bbec76ddceb911596f567ecJordan Justen      if (rb->TexImage)
7848acf19d2311385f1bbec76ddceb911596f567ecJordan Justen         gl_target = rb->TexImage->TexObject->Target;
7948acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   }
8048acf19d2311385f1bbec76ddceb911596f567ecJordan Justen
8148acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   switch (gl_target) {
8248acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   case GL_TEXTURE_CUBE_MAP_ARRAY:
8348acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   case GL_TEXTURE_CUBE_MAP:
8448acf19d2311385f1bbec76ddceb911596f567ecJordan Justen      /* The PRM claims that we should use BRW_SURFACE_CUBE for this
8548acf19d2311385f1bbec76ddceb911596f567ecJordan Justen       * situation, but experiments show that gl_Layer doesn't work when we do
8648acf19d2311385f1bbec76ddceb911596f567ecJordan Justen       * this.  So we use BRW_SURFACE_2D, since for rendering purposes this is
8748acf19d2311385f1bbec76ddceb911596f567ecJordan Justen       * equivalent.
8848acf19d2311385f1bbec76ddceb911596f567ecJordan Justen       */
8948acf19d2311385f1bbec76ddceb911596f567ecJordan Justen      surftype = BRW_SURFACE_2D;
9051b38106d74b1bd4fa2ce552f489c374bdffa812Jordan Justen      depth *= 6;
9148acf19d2311385f1bbec76ddceb911596f567ecJordan Justen      break;
926be024f44dea7df6608e5a3111deffc61dbf6d6dKenneth Graunke   case GL_TEXTURE_3D:
936be024f44dea7df6608e5a3111deffc61dbf6d6dKenneth Graunke      assert(mt);
946be024f44dea7df6608e5a3111deffc61dbf6d6dKenneth Graunke      depth = MAX2(mt->logical_depth0, 1);
956be024f44dea7df6608e5a3111deffc61dbf6d6dKenneth Graunke      /* fallthrough */
9648acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   default:
9748acf19d2311385f1bbec76ddceb911596f567ecJordan Justen      surftype = translate_tex_target(gl_target);
9848acf19d2311385f1bbec76ddceb911596f567ecJordan Justen      break;
9948acf19d2311385f1bbec76ddceb911596f567ecJordan Justen   }
10048acf19d2311385f1bbec76ddceb911596f567ecJordan Justen
101039eb81abf4fab94e787ddd4d5ca4133f7af9c1cJordan Justen   const unsigned min_array_element = irb ? irb->mt_layer : 0;
102039eb81abf4fab94e787ddd4d5ca4133f7af9c1cJordan Justen
103cfa19af966f52a153502f8296493b7b08960f7f5Jordan Justen   lod = irb ? irb->mt_level - irb->mt->first_level : 0;
104cfa19af966f52a153502f8296493b7b08960f7f5Jordan Justen
10556cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   if (mt) {
10656cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen      width = mt->logical_width0;
10756cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen      height = mt->logical_height0;
10856cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   }
10956cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen
11011663050eb5c93ad86a120b6c3bc978142d414a4Jordan Justen   BEGIN_BATCH(7);
11156cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   /* 3DSTATE_DEPTH_BUFFER dw0 */
11211663050eb5c93ad86a120b6c3bc978142d414a4Jordan Justen   OUT_BATCH(_3DSTATE_DEPTH_BUFFER << 16 | (7 - 2));
11356cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen
11456cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   /* 3DSTATE_DEPTH_BUFFER dw1 */
11539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen   OUT_BATCH((depth_mt ? depth_mt->pitch - 1 : 0) |
11639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen             (depthbuffer_format << 18) |
11739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen             ((enable_hiz_ss ? 1 : 0) << 21) | /* separate stencil enable */
11839a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen             ((enable_hiz_ss ? 1 : 0) << 22) | /* hiz enable */
11939a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen             (BRW_TILEWALK_YMAJOR << 26) |
12039a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen             ((depth_mt ? depth_mt->tiling != I915_TILING_NONE : 1)
12139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen              << 27) |
12256cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen             (surftype << 29));
12339a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
12456cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   /* 3DSTATE_DEPTH_BUFFER dw2 */
12539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen   if (depth_mt) {
12639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen      OUT_RELOC(depth_mt->bo,
12739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen		I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER,
12856cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen		0);
12939a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen   } else {
13039a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen      OUT_BATCH(0);
13139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen   }
13239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
13356cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   /* 3DSTATE_DEPTH_BUFFER dw3 */
13456cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   OUT_BATCH(((width - 1) << 6) |
13556cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen             ((height - 1) << 19) |
13656cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen             lod << 2);
13756cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen
13856cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   /* 3DSTATE_DEPTH_BUFFER dw4 */
13956cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   OUT_BATCH((depth - 1) << 21 |
14056cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen             min_array_element << 10 |
14156cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen             (depth - 1) << 1);
14239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
14356cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   /* 3DSTATE_DEPTH_BUFFER dw5 */
14456cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   OUT_BATCH(0);
14556cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   assert(tile_x == 0 && tile_y == 0);
14639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
14756cdb55e38ca352a0d521d7aa69b46ffbd855192Jordan Justen   /* 3DSTATE_DEPTH_BUFFER dw6 */
14811663050eb5c93ad86a120b6c3bc978142d414a4Jordan Justen   OUT_BATCH(0);
14939a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
15039a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen   ADVANCE_BATCH();
15139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
15239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen   if (hiz || separate_stencil) {
15339a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen      /*
15439a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen       * In the 3DSTATE_DEPTH_BUFFER batch emitted above, the 'separate
15539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen       * stencil enable' and 'hiz enable' bits were set. Therefore we must
15639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen       * emit 3DSTATE_HIER_DEPTH_BUFFER and 3DSTATE_STENCIL_BUFFER. Even if
15739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen       * there is no stencil buffer, 3DSTATE_STENCIL_BUFFER must be emitted;
15839a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen       * failure to do so causes hangs on gen5 and a stall on gen6.
15939a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen       */
16039a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
16139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen      /* Emit hiz buffer. */
16239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen      if (hiz) {
16383c6749ddb9bb767e754aa886cdc872af0557898Matt Turner         assert(depth_mt);
164aedcd466bb9d899e892f9d47f96fbca5e5647133Jordan Justen         struct intel_mipmap_tree *hiz_mt = depth_mt->hiz_buf->mt;
16531e1beec899d36904ee7b9629400a523fbc42210Jordan Justen         uint32_t offset = 0;
16631e1beec899d36904ee7b9629400a523fbc42210Jordan Justen
16731e1beec899d36904ee7b9629400a523fbc42210Jordan Justen         if (hiz_mt->array_layout == ALL_SLICES_AT_EACH_LOD) {
16831e1beec899d36904ee7b9629400a523fbc42210Jordan Justen            offset = intel_miptree_get_aligned_offset(
16931e1beec899d36904ee7b9629400a523fbc42210Jordan Justen                        hiz_mt,
17031e1beec899d36904ee7b9629400a523fbc42210Jordan Justen                        hiz_mt->level[lod].level_x,
171c30b7164b757e5ee68f4856adecc6b720ff9d941Jason Ekstrand                        hiz_mt->level[lod].level_y);
17231e1beec899d36904ee7b9629400a523fbc42210Jordan Justen         }
17331e1beec899d36904ee7b9629400a523fbc42210Jordan Justen
17439a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 BEGIN_BATCH(3);
17539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 OUT_BATCH((_3DSTATE_HIER_DEPTH_BUFFER << 16) | (3 - 2));
17639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 OUT_BATCH(hiz_mt->pitch - 1);
17739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 OUT_RELOC(hiz_mt->bo,
17839a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen		   I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER,
17931e1beec899d36904ee7b9629400a523fbc42210Jordan Justen		   offset);
18039a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 ADVANCE_BATCH();
18139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen      } else {
18239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 BEGIN_BATCH(3);
18339a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 OUT_BATCH((_3DSTATE_HIER_DEPTH_BUFFER << 16) | (3 - 2));
18439a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 OUT_BATCH(0);
18539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 OUT_BATCH(0);
18639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 ADVANCE_BATCH();
18739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen      }
18839a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
18939a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen      /* Emit stencil buffer. */
19039a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen      if (separate_stencil) {
19131e1beec899d36904ee7b9629400a523fbc42210Jordan Justen         uint32_t offset = 0;
19231e1beec899d36904ee7b9629400a523fbc42210Jordan Justen
19331e1beec899d36904ee7b9629400a523fbc42210Jordan Justen         if (stencil_mt->array_layout == ALL_SLICES_AT_EACH_LOD) {
19431e1beec899d36904ee7b9629400a523fbc42210Jordan Justen            if (stencil_mt->format == MESA_FORMAT_S_UINT8) {
19531e1beec899d36904ee7b9629400a523fbc42210Jordan Justen               /* Note: we can't compute the stencil offset using
19631e1beec899d36904ee7b9629400a523fbc42210Jordan Justen                * intel_region_get_aligned_offset(), because stencil_region
19731e1beec899d36904ee7b9629400a523fbc42210Jordan Justen                * claims that the region is untiled even though it's W tiled.
19831e1beec899d36904ee7b9629400a523fbc42210Jordan Justen                */
19931e1beec899d36904ee7b9629400a523fbc42210Jordan Justen               offset =
20031e1beec899d36904ee7b9629400a523fbc42210Jordan Justen                  stencil_mt->level[lod].level_y * stencil_mt->pitch +
20131e1beec899d36904ee7b9629400a523fbc42210Jordan Justen                  stencil_mt->level[lod].level_x * 64;
20231e1beec899d36904ee7b9629400a523fbc42210Jordan Justen            } else {
20331e1beec899d36904ee7b9629400a523fbc42210Jordan Justen               offset = intel_miptree_get_aligned_offset(
20431e1beec899d36904ee7b9629400a523fbc42210Jordan Justen                           stencil_mt,
20531e1beec899d36904ee7b9629400a523fbc42210Jordan Justen                           stencil_mt->level[lod].level_x,
206c30b7164b757e5ee68f4856adecc6b720ff9d941Jason Ekstrand                           stencil_mt->level[lod].level_y);
20731e1beec899d36904ee7b9629400a523fbc42210Jordan Justen            }
20831e1beec899d36904ee7b9629400a523fbc42210Jordan Justen         }
20931e1beec899d36904ee7b9629400a523fbc42210Jordan Justen
21039a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 BEGIN_BATCH(3);
21139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 OUT_BATCH((_3DSTATE_STENCIL_BUFFER << 16) | (3 - 2));
21239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen         /* The stencil buffer has quirky pitch requirements.  From Vol 2a,
21339a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen          * 11.5.6.2.1 3DSTATE_STENCIL_BUFFER, field "Surface Pitch":
21439a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen          *    The pitch must be set to 2x the value computed based on width, as
21539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen          *    the stencil buffer is stored with two rows interleaved.
21639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen          */
21739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 OUT_BATCH(2 * stencil_mt->pitch - 1);
21839a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 OUT_RELOC(stencil_mt->bo,
21939a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen		   I915_GEM_DOMAIN_RENDER, I915_GEM_DOMAIN_RENDER,
22031e1beec899d36904ee7b9629400a523fbc42210Jordan Justen		   offset);
22139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 ADVANCE_BATCH();
22239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen      } else {
22339a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 BEGIN_BATCH(3);
22439a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 OUT_BATCH((_3DSTATE_STENCIL_BUFFER << 16) | (3 - 2));
22539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 OUT_BATCH(0);
22639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 OUT_BATCH(0);
22739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen	 ADVANCE_BATCH();
22839a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen      }
22939a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen   }
23039a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen
23139a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen   /*
23239a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    * On Gen >= 6, emit clear params for safety. If using hiz, then clear
23339a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    * params must be emitted.
23439a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    *
23539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    * From Section 2.11.5.6.4.1 3DSTATE_CLEAR_PARAMS:
23639a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    *     3DSTATE_CLEAR_PARAMS packet must follow the DEPTH_BUFFER_STATE packet
23739a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    *     when HiZ is enabled and the DEPTH_BUFFER_STATE changes.
23839a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen    */
23911663050eb5c93ad86a120b6c3bc978142d414a4Jordan Justen   BEGIN_BATCH(2);
24011663050eb5c93ad86a120b6c3bc978142d414a4Jordan Justen   OUT_BATCH(_3DSTATE_CLEAR_PARAMS << 16 |
24111663050eb5c93ad86a120b6c3bc978142d414a4Jordan Justen             GEN5_DEPTH_CLEAR_VALID |
24211663050eb5c93ad86a120b6c3bc978142d414a4Jordan Justen             (2 - 2));
24311663050eb5c93ad86a120b6c3bc978142d414a4Jordan Justen   OUT_BATCH(depth_mt ? depth_mt->depth_clear_value : 0);
24411663050eb5c93ad86a120b6c3bc978142d414a4Jordan Justen   ADVANCE_BATCH();
24539a5b6998538f5a436b2b9f7e30e4f8937aaaea9Jordan Justen}
246