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