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