brw_clear.c revision 4451eb2e7533a41f67ed21d05a8d9ab5efec77e9
14451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul/**************************************************************************
24451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul *
34451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas.
44451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * All Rights Reserved.
54451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul *
64451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a
74451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * copy of this software and associated documentation files (the
84451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * "Software"), to deal in the Software without restriction, including
94451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * without limitation the rights to use, copy, modify, merge, publish,
104451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * distribute, sub license, and/or sell copies of the Software, and to
114451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * permit persons to whom the Software is furnished to do so, subject to
124451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * the following conditions:
134451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul *
144451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * The above copyright notice and this permission notice (including the
154451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * next paragraph) shall be included in all copies or substantial portions
164451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * of the Software.
174451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul *
184451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
194451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
204451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
214451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
224451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
234451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
244451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
254451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul *
264451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul **************************************************************************/
274451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
284451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "intel_clear.h"
294451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "intel_context.h"
304451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "intel_blit.h"
314451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "intel_buffers.h"
324451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "intel_chipset.h"
334451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "intel_fbo.h"
344451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "intel_regions.h"
354451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "intel_batchbuffer.h"
364451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "main/framebuffer.h"
374451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "swrast/swrast.h"
384451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#include "drirenderbuffer.h"
394451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
404451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul#define FILE_DEBUG_FLAG DEBUG_BLIT
414451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
424451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul/* A true meta version of this would be very simple and additionally
434451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * machine independent.  Maybe we'll get there one day.
444451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul */
454451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paulstatic void
464451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian PaulintelClearWithTris(struct intel_context *intel, GLbitfield mask)
474451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul{
484451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   GLcontext *ctx = &intel->ctx;
494451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   struct gl_framebuffer *fb = ctx->DrawBuffer;
504451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   GLuint buf;
514451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
524451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   intel->vtbl.install_meta_state(intel);
534451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
544451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   /* Back and stencil cliprects are the same.  Try and do both
554451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul    * buffers at once:
564451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul    */
574451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   if (mask & (BUFFER_BIT_BACK_LEFT | BUFFER_BIT_STENCIL | BUFFER_BIT_DEPTH)) {
584451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      struct intel_region *backRegion =
594451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 intel_get_rb_region(fb, BUFFER_BACK_LEFT);
604451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      struct intel_region *depthRegion =
614451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 intel_get_rb_region(fb, BUFFER_DEPTH);
624451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
634451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      intel->vtbl.meta_draw_region(intel, backRegion, depthRegion);
644451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
654451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      if (mask & BUFFER_BIT_BACK_LEFT)
664451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 intel->vtbl.meta_color_mask(intel, GL_TRUE);
674451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      else
684451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 intel->vtbl.meta_color_mask(intel, GL_FALSE);
694451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
704451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      if (mask & BUFFER_BIT_STENCIL)
714451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 intel->vtbl.meta_stencil_replace(intel,
724451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul					  intel->ctx.Stencil.WriteMask[0],
734451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul					  intel->ctx.Stencil.Clear);
744451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      else
754451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 intel->vtbl.meta_no_stencil_write(intel);
764451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
774451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      if (mask & BUFFER_BIT_DEPTH)
784451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 intel->vtbl.meta_depth_replace(intel);
794451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      else
804451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 intel->vtbl.meta_no_depth_write(intel);
814451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
824451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      intel->vtbl.meta_draw_quad(intel,
834451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul				 fb->_Xmin,
844451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul				 fb->_Xmax,
854451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul				 fb->_Ymin,
864451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul				 fb->_Ymax,
874451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul				 intel->ctx.Depth.Clear,
884451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul				 intel->ClearColor8888,
894451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul				 0, 0, 0, 0);   /* texcoords */
904451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
914451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      mask &= ~(BUFFER_BIT_BACK_LEFT | BUFFER_BIT_STENCIL | BUFFER_BIT_DEPTH);
924451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   }
934451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
944451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   /* clear the remaining (color) renderbuffers */
954451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   for (buf = 0; buf < BUFFER_COUNT && mask; buf++) {
964451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      const GLuint bufBit = 1 << buf;
974451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      if (mask & bufBit) {
984451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 struct intel_renderbuffer *irbColor =
994451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	    intel_renderbuffer(fb->Attachment[buf].Renderbuffer);
1004451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
1014451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 ASSERT(irbColor);
1024451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
1034451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 intel->vtbl.meta_no_depth_write(intel);
1044451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 intel->vtbl.meta_no_stencil_write(intel);
1054451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 intel->vtbl.meta_color_mask(intel, GL_TRUE);
1064451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 intel->vtbl.meta_draw_region(intel, irbColor->region, NULL);
1074451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
1084451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 intel->vtbl.meta_draw_quad(intel,
1094451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul				    fb->_Xmin,
1104451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul				    fb->_Xmax,
1114451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul				    fb->_Ymin,
1124451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul				    fb->_Ymax,
1134451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul				    0, intel->ClearColor8888,
1144451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul				    0, 0, 0, 0);   /* texcoords */
1154451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
1164451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 mask &= ~bufBit;
1174451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      }
1184451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   }
1194451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
1204451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   intel->vtbl.leave_meta_state(intel);
1214451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul}
1224451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
1234451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paulstatic const char *buffer_names[] = {
1244451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_FRONT_LEFT] = "front",
1254451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_BACK_LEFT] = "back",
1264451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_FRONT_RIGHT] = "front right",
1274451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_BACK_RIGHT] = "back right",
1284451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_AUX0] = "aux0",
1294451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_AUX1] = "aux1",
1304451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_AUX2] = "aux2",
1314451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_AUX3] = "aux3",
1324451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_DEPTH] = "depth",
1334451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_STENCIL] = "stencil",
1344451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_ACCUM] = "accum",
1354451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR0] = "color0",
1364451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR1] = "color1",
1374451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR2] = "color2",
1384451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR3] = "color3",
1394451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR4] = "color4",
1404451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR5] = "color5",
1414451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR6] = "color6",
1424451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   [BUFFER_COLOR7] = "color7",
1434451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul};
1444451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
1454451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul/**
1464451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul * Called by ctx->Driver.Clear.
1474451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul */
1484451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paulstatic void
1494451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian PaulintelClear(GLcontext *ctx, GLbitfield mask)
1504451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul{
1514451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   struct intel_context *intel = intel_context(ctx);
1524451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   const GLuint colorMask = *((GLuint *) & ctx->Color.ColorMask);
1534451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   GLbitfield tri_mask = 0;
1544451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   GLbitfield blit_mask = 0;
1554451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   GLbitfield swrast_mask = 0;
1564451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   struct gl_framebuffer *fb = ctx->DrawBuffer;
1574451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   GLuint i;
1584451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
1594451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   if (0)
1604451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      fprintf(stderr, "%s\n", __FUNCTION__);
1614451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
1624451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   /* HW color buffers (front, back, aux, generic FBO, etc) */
1634451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   if (colorMask == ~0) {
1644451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      /* clear all R,G,B,A */
1654451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      /* XXX FBO: need to check if colorbuffers are software RBOs! */
1664451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      blit_mask |= (mask & BUFFER_BITS_COLOR);
1674451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   }
1684451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   else {
1694451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      /* glColorMask in effect */
1704451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      tri_mask |= (mask & BUFFER_BITS_COLOR);
1714451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   }
1724451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
1734451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   /* HW stencil */
1744451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   if (mask & BUFFER_BIT_STENCIL) {
1754451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      const struct intel_region *stencilRegion
1764451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul         = intel_get_rb_region(fb, BUFFER_STENCIL);
1774451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      if (stencilRegion) {
1784451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul         /* have hw stencil */
1794451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul         if (IS_965(intel->intelScreen->deviceID) ||
1804451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	     (ctx->Stencil.WriteMask[0] & 0xff) != 0xff) {
1814451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	    /* We have to use the 3D engine if we're clearing a partial mask
1824451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	     * of the stencil buffer, or if we're on a 965 which has a tiled
1834451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	     * depth/stencil buffer in a layout we can't blit to.
1844451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	     */
1854451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul            tri_mask |= BUFFER_BIT_STENCIL;
1864451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul         }
1874451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul         else {
1884451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul            /* clearing all stencil bits, use blitting */
1894451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul            blit_mask |= BUFFER_BIT_STENCIL;
1904451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul         }
1914451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      }
1924451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   }
1934451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
1944451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   /* HW depth */
1954451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   if (mask & BUFFER_BIT_DEPTH) {
1964451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      /* clear depth with whatever method is used for stencil (see above) */
1974451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      if (IS_965(intel->intelScreen->deviceID) ||
1984451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	  tri_mask & BUFFER_BIT_STENCIL)
1994451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul         tri_mask |= BUFFER_BIT_DEPTH;
2004451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      else
2014451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul         blit_mask |= BUFFER_BIT_DEPTH;
2024451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   }
2034451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
2044451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   /* SW fallback clearing */
2054451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   swrast_mask = mask & ~tri_mask & ~blit_mask;
2064451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
2074451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   for (i = 0; i < BUFFER_COUNT; i++) {
2084451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      GLuint bufBit = 1 << i;
2094451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      if ((blit_mask | tri_mask) & bufBit) {
2104451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul         if (!fb->Attachment[i].Renderbuffer->ClassID) {
2114451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul            blit_mask &= ~bufBit;
2124451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul            tri_mask &= ~bufBit;
2134451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul            swrast_mask |= bufBit;
2144451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul         }
2154451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      }
2164451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   }
2174451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
2184451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   if (blit_mask) {
2194451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      if (INTEL_DEBUG & DEBUG_BLIT) {
2204451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 DBG("blit clear:");
2214451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 for (i = 0; i < BUFFER_COUNT; i++) {
2224451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	    if (blit_mask & (1 << i))
2234451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	       DBG(" %s", buffer_names[i]);
2244451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 }
2254451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 DBG("\n");
2264451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      }
2274451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      intelClearWithBlit(ctx, blit_mask);
2284451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   }
2294451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
2304451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   if (tri_mask) {
2314451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      if (INTEL_DEBUG & DEBUG_BLIT) {
2324451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 DBG("tri clear:");
2334451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 for (i = 0; i < BUFFER_COUNT; i++) {
2344451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	    if (tri_mask & (1 << i))
2354451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	       DBG(" %s", buffer_names[i]);
2364451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 }
2374451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 DBG("\n");
2384451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      }
2394451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      intelClearWithTris(intel, tri_mask);
2404451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   }
2414451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
2424451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   if (swrast_mask) {
2434451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      if (INTEL_DEBUG & DEBUG_BLIT) {
2444451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 DBG("swrast clear:");
2454451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 for (i = 0; i < BUFFER_COUNT; i++) {
2464451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	    if (swrast_mask & (1 << i))
2474451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	       DBG(" %s", buffer_names[i]);
2484451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 }
2494451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul	 DBG("\n");
2504451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      }
2514451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul      _swrast_Clear(ctx, swrast_mask);
2524451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   }
2534451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul}
2544451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
2554451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul
2564451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paulvoid
2574451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian PaulintelInitClearFuncs(struct dd_function_table *functions)
2584451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul{
2594451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul   functions->Clear = intelClear;
2604451eb2e7533a41f67ed21d05a8d9ab5efec77e9Brian Paul}
261