111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt/************************************************************************** 211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * 311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * Copyright 2009 Intel Corporation. 511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * All Rights Reserved. 611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * 711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a 811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * copy of this software and associated documentation files (the 911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * "Software"), to deal in the Software without restriction, including 1011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * without limitation the rights to use, copy, modify, merge, publish, 1111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * distribute, sub license, and/or sell copies of the Software, and to 1211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * permit persons to whom the Software is furnished to do so, subject to 1311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * the following conditions: 1411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * 1511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * The above copyright notice and this permission notice (including the 1611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * next paragraph) shall be included in all copies or substantial portions 1711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * of the Software. 1811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * 1911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 2011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 2111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 2211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 2311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 2411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 2511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 2611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * 2711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt **************************************************************************/ 2811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 2911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt#include "main/glheader.h" 3011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt#include "main/mtypes.h" 3111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt#include "main/condrender.h" 3211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt#include "swrast/swrast.h" 3311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt#include "drivers/common/meta.h" 3411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 3511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt#include "intel_context.h" 3611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt#include "intel_blit.h" 3711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt#include "intel_clear.h" 3811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt#include "intel_fbo.h" 3911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt#include "intel_regions.h" 4011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 4111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt#define FILE_DEBUG_FLAG DEBUG_BLIT 4211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 4311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholtstatic const char *buffer_names[] = { 4411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_FRONT_LEFT] = "front", 4511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_BACK_LEFT] = "back", 4611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_FRONT_RIGHT] = "front right", 4711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_BACK_RIGHT] = "back right", 4811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_DEPTH] = "depth", 4911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_STENCIL] = "stencil", 5011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_ACCUM] = "accum", 5111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_AUX0] = "aux0", 5211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_COLOR0] = "color0", 5311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_COLOR1] = "color1", 5411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_COLOR2] = "color2", 5511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_COLOR3] = "color3", 5611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_COLOR4] = "color4", 5711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_COLOR5] = "color5", 5811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_COLOR6] = "color6", 5911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt [BUFFER_COLOR7] = "color7", 6011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt}; 6111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 6211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholtstatic void 6311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholtdebug_mask(const char *name, GLbitfield mask) 6411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt{ 6511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt GLuint i; 6611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 6711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (unlikely(INTEL_DEBUG & DEBUG_BLIT)) { 6811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt DBG("%s clear:", name); 6911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt for (i = 0; i < BUFFER_COUNT; i++) { 7011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (mask & (1 << i)) 7111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt DBG(" %s", buffer_names[i]); 7211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 7311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt DBG("\n"); 7411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 7511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt} 7611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 7711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt/** 7811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * Called by ctx->Driver.Clear. 7911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt */ 8011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholtstatic void 8111892ea986b5fdad345ce7c09f97e0389e546509Eric AnholtintelClear(struct gl_context *ctx, GLbitfield mask) 8211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt{ 8311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt struct intel_context *intel = intel_context(ctx); 8411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt const GLuint colorMask = *((GLuint *) & ctx->Color.ColorMask[0]); 8511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt GLbitfield tri_mask = 0; 8611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt GLbitfield blit_mask = 0; 8711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt GLbitfield swrast_mask = 0; 8811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt struct gl_framebuffer *fb = ctx->DrawBuffer; 8911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt struct intel_renderbuffer *irb; 9011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt int i; 9111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 9211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (mask & (BUFFER_BIT_FRONT_LEFT | BUFFER_BIT_FRONT_RIGHT)) { 9311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt intel->front_buffer_dirty = true; 9411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 9511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 9611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (0) 9711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt fprintf(stderr, "%s\n", __FUNCTION__); 9811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 9911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt /* Get SW clears out of the way: Anything without an intel_renderbuffer */ 10011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt for (i = 0; i < BUFFER_COUNT; i++) { 10111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (!(mask & (1 << i))) 10211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt continue; 10311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 10411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt irb = intel_get_renderbuffer(fb, i); 10511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (unlikely(!irb)) { 10611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt swrast_mask |= (1 << i); 10711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt mask &= ~(1 << i); 10811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 10911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 11011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (unlikely(swrast_mask)) { 11111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt debug_mask("swrast", swrast_mask); 11211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt _swrast_Clear(ctx, swrast_mask); 11311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 11411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 11511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt /* HW color buffers (front, back, aux, generic FBO, etc) */ 11603c9044c2edf8301779fe5d0173d7e6d1e7ee1c2Eric Anholt if (colorMask == ~0) { 11711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt /* clear all R,G,B,A */ 11811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt blit_mask |= (mask & BUFFER_BITS_COLOR); 11911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 12011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt else { 12111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt /* glColorMask in effect */ 12211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt tri_mask |= (mask & BUFFER_BITS_COLOR); 12311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 12411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 12511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt /* Make sure we have up to date buffers before we start looking at 12611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * the tiling bits to determine how to clear. */ 12711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt intel_prepare_render(intel); 12811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 12911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt /* HW stencil */ 13011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (mask & BUFFER_BIT_STENCIL) { 13111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt const struct intel_region *stencilRegion 13211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt = intel_get_rb_region(fb, BUFFER_STENCIL); 13311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (stencilRegion) { 13411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt /* have hw stencil */ 13511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (stencilRegion->tiling == I915_TILING_Y || 13611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt (ctx->Stencil.WriteMask[0] & 0xff) != 0xff) { 13711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt /* We have to use the 3D engine if we're clearing a partial mask 13811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * of the stencil buffer, or if we're on a 965 which has a tiled 13911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * depth/stencil buffer in a layout we can't blit to. 14011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt */ 14111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt tri_mask |= BUFFER_BIT_STENCIL; 14211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 14311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt else { 14411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt /* clearing all stencil bits, use blitting */ 14511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt blit_mask |= BUFFER_BIT_STENCIL; 14611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 14711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 14811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 14911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 15011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt /* HW depth */ 15111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (mask & BUFFER_BIT_DEPTH) { 15211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt const struct intel_region *irb = intel_get_rb_region(fb, BUFFER_DEPTH); 15311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 15411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt /* clear depth with whatever method is used for stencil (see above) */ 15511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (irb->tiling == I915_TILING_Y || tri_mask & BUFFER_BIT_STENCIL) 15611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt tri_mask |= BUFFER_BIT_DEPTH; 15711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt else 15811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt blit_mask |= BUFFER_BIT_DEPTH; 15911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 16011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 16111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt /* If we're doing a tri pass for depth/stencil, include a likely color 16211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt * buffer with it. 16311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt */ 16411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (mask & (BUFFER_BIT_DEPTH | BUFFER_BIT_STENCIL)) { 16511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt int color_bit = ffs(mask & BUFFER_BITS_COLOR); 16611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (color_bit != 0) { 16711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt tri_mask |= blit_mask & (1 << (color_bit - 1)); 16811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt blit_mask &= ~(1 << (color_bit - 1)); 16911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 17011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 17111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 17211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt /* Anything left, just use tris */ 17311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt tri_mask |= mask & ~blit_mask; 17411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 17511892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (blit_mask) { 17611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt debug_mask("blit", blit_mask); 17711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt tri_mask |= intelClearWithBlit(ctx, blit_mask); 17811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 17911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 18011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt if (tri_mask) { 18111892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt debug_mask("tri", tri_mask); 18294f22fbe787214580a1a13a774114d2650c166cbTapani Pälli if (ctx->API == API_OPENGLES) 18311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt _mesa_meta_Clear(&intel->ctx, tri_mask); 18494f22fbe787214580a1a13a774114d2650c166cbTapani Pälli else 18594f22fbe787214580a1a13a774114d2650c166cbTapani Pälli _mesa_meta_glsl_Clear(&intel->ctx, tri_mask); 18611892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt } 18711892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt} 18811892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 18911892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt 19011892ea986b5fdad345ce7c09f97e0389e546509Eric Anholtvoid 19111892ea986b5fdad345ce7c09f97e0389e546509Eric AnholtintelInitClearFuncs(struct dd_function_table *functions) 19211892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt{ 19311892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt functions->Clear = intelClear; 19411892ea986b5fdad345ce7c09f97e0389e546509Eric Anholt} 195