14451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul/**************************************************************************
211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt *
34451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
43e1656567c3d2abb91f8169806d6083e80c0a673Eric Anholt * Copyright 2009, 2012 Intel Corporation.
54451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * All Rights Reserved.
611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt *
74451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
84451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * copy of this software and associated documentation files (the
94451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * "Software"), to deal in the Software without restriction, including
104451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * without limitation the rights to use, copy, modify, merge, publish,
114451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * distribute, sub license, and/or sell copies of the Software, and to
124451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * permit persons to whom the Software is furnished to do so, subject to
134451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * the following conditions:
1411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt *
154451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * The above copyright notice and this permission notice (including the
164451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * next paragraph) shall be included in all copies or substantial portions
174451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * of the Software.
1811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt *
194451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
204451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
214451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
224451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
234451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
244451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
254451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt *
274451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul **************************************************************************/
284451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
29c96bac0950eda6e707455b0c1ee29c1d87daf727Eric Anholt#include "main/glheader.h"
30c96bac0950eda6e707455b0c1ee29c1d87daf727Eric Anholt#include "main/mtypes.h"
311df72402d99145425531297eef6772b88ce5225dEric Anholt#include "main/condrender.h"
32c96bac0950eda6e707455b0c1ee29c1d87daf727Eric Anholt#include "swrast/swrast.h"
3350d8b295f6c950da3b8783ff6e1803bdfbb5c7ccBrian Paul#include "drivers/common/meta.h"
34c96bac0950eda6e707455b0c1ee29c1d87daf727Eric Anholt
3568216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt#include "intel_batchbuffer.h"
364451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "intel_context.h"
374451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "intel_blit.h"
38c96bac0950eda6e707455b0c1ee29c1d87daf727Eric Anholt#include "intel_clear.h"
394451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "intel_fbo.h"
4068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt#include "intel_mipmap_tree.h"
4113624848401679f7ee904aa731d520792a5e523eEric Anholt#include "intel_regions.h"
424451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
434451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#define FILE_DEBUG_FLAG DEBUG_BLIT
444451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
454451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paulstatic const char *buffer_names[] = {
464451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_FRONT_LEFT] = "front",
474451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_BACK_LEFT] = "back",
484451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_FRONT_RIGHT] = "front right",
494451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_BACK_RIGHT] = "back right",
504451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_DEPTH] = "depth",
514451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_STENCIL] = "stencil",
524451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_ACCUM] = "accum",
53555f0a88182e2b1af809b2d97abdac02814a2f28Brian Paul   [BUFFER_AUX0] = "aux0",
544451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR0] = "color0",
554451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR1] = "color1",
564451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR2] = "color2",
574451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR3] = "color3",
584451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR4] = "color4",
594451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR5] = "color5",
604451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR6] = "color6",
614451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR7] = "color7",
624451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul};
634451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
64bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholtstatic void
65bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholtdebug_mask(const char *name, GLbitfield mask)
66bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt{
67bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt   GLuint i;
68bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt
69bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt   if (unlikely(INTEL_DEBUG & DEBUG_BLIT)) {
70bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt      DBG("%s clear:", name);
71bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt      for (i = 0; i < BUFFER_COUNT; i++) {
72bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt	 if (mask & (1 << i))
73bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt	    DBG(" %s", buffer_names[i]);
74bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt      }
75bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt      DBG("\n");
76bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt   }
77bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt}
78bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt
794451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul/**
8068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt * Implements fast depth clears on gen6+.
8168216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt *
8268216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt * Fast clears basically work by setting a flag in each of the subspans
8368216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt * represented in the HiZ buffer that says "When you need the depth values for
8468216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt * this subspan, it's the hardware's current clear value."  Then later rendering
8568216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt * can just use the static clear value instead of referencing memory.
8668216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt *
8768216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt * The tricky part of the implementation is that you have to have the clear
8868216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt * value that was used on the depth buffer in place for all further rendering,
8968216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt * at least until a resolve to the real depth buffer happens.
9068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt */
9168216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholtstatic bool
9268216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholtbrw_fast_clear_depth(struct gl_context *ctx)
9368216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt{
9468216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   struct intel_context *intel = intel_context(ctx);
9568216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   struct gl_framebuffer *fb = ctx->DrawBuffer;
9668216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   struct intel_renderbuffer *depth_irb =
9768216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      intel_get_renderbuffer(fb, BUFFER_DEPTH);
9868216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   struct intel_mipmap_tree *mt = depth_irb->mt;
9968216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
10068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   if (intel->gen < 6)
10168216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      return false;
10268216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
10368216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   if (!mt->hiz_mt)
10468216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      return false;
10568216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
10668216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   /* We only handle full buffer clears -- otherwise you'd have to track whether
10768216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    * a previous clear had happened at a different clear value and resolve it
10868216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    * first.
10968216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    */
110b4da272a6ea58a7c81c71477d65d82651555709aEric Anholt   if (ctx->Scissor.Enabled) {
111b4da272a6ea58a7c81c71477d65d82651555709aEric Anholt      perf_debug("Failed to fast clear depth due to scissor being enabled.  "
112b4da272a6ea58a7c81c71477d65d82651555709aEric Anholt                 "Possible 5%% performance win if avoided.\n");
11368216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      return false;
114b4da272a6ea58a7c81c71477d65d82651555709aEric Anholt   }
11568216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
11668216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   /* The rendered area has to be 8x4 samples, not resolved pixels, so we look
11768216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    * at the miptree slice dimensions instead of renderbuffer size.
11868216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    */
11968216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   if (mt->level[depth_irb->mt_level].width % 8 != 0 ||
12068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       mt->level[depth_irb->mt_level].height % 4 != 0) {
121b4da272a6ea58a7c81c71477d65d82651555709aEric Anholt      perf_debug("Failed to fast clear depth due to width/height %d,%d not "
122b4da272a6ea58a7c81c71477d65d82651555709aEric Anholt                 "being aligned to 8,4.  Possible 5%% performance win if "
123b4da272a6ea58a7c81c71477d65d82651555709aEric Anholt                 "avoided\n",
124b4da272a6ea58a7c81c71477d65d82651555709aEric Anholt                 mt->level[depth_irb->mt_level].width,
125b4da272a6ea58a7c81c71477d65d82651555709aEric Anholt                 mt->level[depth_irb->mt_level].height);
12668216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      return false;
12768216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   }
12868216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
12968216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   uint32_t depth_clear_value;
13068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   switch (mt->format) {
13168216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   case MESA_FORMAT_Z32_FLOAT_X24S8:
13268216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   case MESA_FORMAT_S8_Z24:
13368216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      /* From the Sandy Bridge PRM, volume 2 part 1, page 314:
13468216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *
13568216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *     "[DevSNB+]: Several cases exist where Depth Buffer Clear cannot be
13668216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *      enabled (the legacy method of clearing must be performed):
13768216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *
13868216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *      - If the depth buffer format is D32_FLOAT_S8X24_UINT or
13968216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *        D24_UNORM_S8_UINT.
14068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       */
14168216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      return false;
14268216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
14368216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   case MESA_FORMAT_Z32_FLOAT:
14468216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      depth_clear_value = float_as_int(ctx->Depth.Clear);
14568216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      break;
14668216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
14768216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   case MESA_FORMAT_Z16:
14868216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      /* From the Sandy Bridge PRM, volume 2 part 1, page 314:
14968216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *
15068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *     "[DevSNB+]: Several cases exist where Depth Buffer Clear cannot be
15168216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *      enabled (the legacy method of clearing must be performed):
15268216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *
15368216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *      - DevSNB{W/A}]: When depth buffer format is D16_UNORM and the
15468216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *        width of the map (LOD0) is not multiple of 16, fast clear
15568216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *        optimization must be disabled.
15668216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       */
15768216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      if (intel->gen == 6 && (mt->level[depth_irb->mt_level].width % 16) != 0)
15868216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt	 return false;
15968216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      /* FALLTHROUGH */
16068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
16168216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   default:
16268216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      depth_clear_value = fb->_DepthMax * ctx->Depth.Clear;
16368216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      break;
16468216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   }
16568216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
16668216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   /* If we're clearing to a new clear value, then we need to resolve any clear
16768216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    * flags out of the HiZ buffer into the real depth buffer.
16868216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    */
16968216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   if (mt->depth_clear_value != depth_clear_value) {
17068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      intel_miptree_all_slices_resolve_depth(intel, mt);
17168216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      mt->depth_clear_value = depth_clear_value;
17268216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   }
17368216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
17468216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   /* From the Sandy Bridge PRM, volume 2 part 1, page 313:
17568216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    *
17668216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    *     "If other rendering operations have preceded this clear, a
17768216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    *      PIPE_CONTROL with write cache flush enabled and Z-inhibit disabled
17868216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    *      must be issued before the rectangle primitive used for the depth
17968216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    *      buffer clear operation.
18068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    */
18168216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   intel_batchbuffer_emit_mi_flush(intel);
18268216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
18368216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   intel_hiz_exec(intel, mt, depth_irb->mt_level, depth_irb->mt_layer,
18468216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt		  GEN6_HIZ_OP_DEPTH_CLEAR);
18568216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
18668216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   if (intel->gen == 6) {
18768216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      /* From the Sandy Bridge PRM, volume 2 part 1, page 314:
18868216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *
18968216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *     "DevSNB, DevSNB-B{W/A}]: Depth buffer clear pass must be followed
19068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *      by a PIPE_CONTROL command with DEPTH_STALL bit set and Then
19168216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt       *      followed by Depth FLUSH'
19268216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      */
19368216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      intel_batchbuffer_emit_mi_flush(intel);
19468216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   }
19568216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
1965133bd6585552a5708b294180fa9a561bf7564a6Paul Berry   /* Now, the HiZ buffer contains data that needs to be resolved to the depth
1975133bd6585552a5708b294180fa9a561bf7564a6Paul Berry    * buffer.
19868216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt    */
19968216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   intel_renderbuffer_set_needs_depth_resolve(depth_irb);
20068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
20168216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   return true;
20268216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt}
20368216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
20468216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt/**
2054451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * Called by ctx->Driver.Clear.
2064451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul */
2074451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paulstatic void
2087da9795070b1af746ab85692d4b65dbe8c4f2d76Eric Anholtbrw_clear(struct gl_context *ctx, GLbitfield mask)
2094451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul{
210f6f0e117a45a64464e49290ebc9f75b9a976070aDave Airlie   struct intel_context *intel = intel_context(ctx);
2114451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
2121df72402d99145425531297eef6772b88ce5225dEric Anholt   if (!_mesa_check_conditional_render(ctx))
2131df72402d99145425531297eef6772b88ce5225dEric Anholt      return;
2141df72402d99145425531297eef6772b88ce5225dEric Anholt
2153105f3aa88e4b59eed3c7f175af77fbdb4af5924Brian Paul   if (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_FRONT_RIGHT)) {
2162e5a1a254ed81b1d3efa6064f48183eefac784d0Kenneth Graunke      intel->front_buffer_dirty = true;
2173105f3aa88e4b59eed3c7f175af77fbdb4af5924Brian Paul   }
21838d3c156dc64679e5602816070a0bac4f1f39302Brian Paul
21968216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   intel_prepare_render(intel);
22068216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
22168216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   if (mask & BUFFER_BIT_DEPTH) {
22268216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      if (brw_fast_clear_depth(ctx)) {
22368216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt	 DBG("fast clear: depth\n");
22468216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt	 mask &= ~BUFFER_BIT_DEPTH;
22568216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt      }
22668216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt   }
22768216f35814ab8d292f37b8c0fa0a5f181b7f20dEric Anholt
2283e1656567c3d2abb91f8169806d6083e80c0a673Eric Anholt   GLbitfield tri_mask = mask & (BUFFER_BITS_COLOR |
2293e1656567c3d2abb91f8169806d6083e80c0a673Eric Anholt				 BUFFER_BIT_STENCIL |
2303e1656567c3d2abb91f8169806d6083e80c0a673Eric Anholt				 BUFFER_BIT_DEPTH);
2314451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
2324451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   if (tri_mask) {
233bb1540835056cdea5db6f55b19c0c87358f14cd1Eric Anholt      debug_mask("tri", tri_mask);
2343e1656567c3d2abb91f8169806d6083e80c0a673Eric Anholt      mask &= ~tri_mask;
23594f22fbe787214580a1a13a774114d2650c166cbTapani Pälli
23694f22fbe787214580a1a13a774114d2650c166cbTapani Pälli      if (ctx->API == API_OPENGLES) {
23794f22fbe787214580a1a13a774114d2650c166cbTapani Pälli         _mesa_meta_Clear(&intel->ctx, tri_mask);
23894f22fbe787214580a1a13a774114d2650c166cbTapani Pälli      } else {
23994f22fbe787214580a1a13a774114d2650c166cbTapani Pälli         _mesa_meta_glsl_Clear(&intel->ctx, tri_mask);
24094f22fbe787214580a1a13a774114d2650c166cbTapani Pälli      }
2414451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   }
2423e1656567c3d2abb91f8169806d6083e80c0a673Eric Anholt
2433e1656567c3d2abb91f8169806d6083e80c0a673Eric Anholt   /* Any strange buffers get passed off to swrast */
2443e1656567c3d2abb91f8169806d6083e80c0a673Eric Anholt   if (mask) {
2453e1656567c3d2abb91f8169806d6083e80c0a673Eric Anholt      debug_mask("swrast", mask);
2463e1656567c3d2abb91f8169806d6083e80c0a673Eric Anholt      _swrast_Clear(ctx, mask);
2473e1656567c3d2abb91f8169806d6083e80c0a673Eric Anholt   }
2484451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul}
2494451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
2504451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
2514451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paulvoid
2524451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian PaulintelInitClearFuncs(struct dd_function_table *functions)
2534451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul{
2547da9795070b1af746ab85692d4b65dbe8c4f2d76Eric Anholt   functions->Clear = brw_clear;
2554451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul}
256