14f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell/************************************************************************** 24f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * 3877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2007 VMware, Inc. 44f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * All Rights Reserved. 5eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer * Copyright 2009 VMware, Inc. All Rights Reserved. 64f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * 74f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * Permission is hereby granted, free of charge, to any person obtaining a 84f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * copy of this software and associated documentation files (the 94f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * "Software"), to deal in the Software without restriction, including 104f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * without limitation the rights to use, copy, modify, merge, publish, 114f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * distribute, sub license, and/or sell copies of the Software, and to 124f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * permit persons to whom the Software is furnished to do so, subject to 134f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * the following conditions: 144f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * 154f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * The above copyright notice and this permission notice (including the 164f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * next paragraph) shall be included in all copies or substantial portions 174f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * of the Software. 184f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * 194f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 204f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 214f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 22877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR 234f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 244f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 254f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 264f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * 274f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell **************************************************************************/ 284f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell 294f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell /* 304f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * Authors: 31877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Keith Whitwell <keithw@vmware.com> 324f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell * Brian Paul 33eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer * Michel Dänzer 344f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell */ 354f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell 367faa3542f062dfa32e1596f5ce2b531cb8b4eeefBrian Paul#include "main/glheader.h" 37122c6768e3d4c1d1b57203eca70569f9301baab5Brian Paul#include "main/accum.h" 3845e76d2665b38ba3787548310efc59e969124c01Brian Paul#include "main/formats.h" 397faa3542f062dfa32e1596f5ce2b531cb8b4eeefBrian Paul#include "main/macros.h" 402bbd307fa638f6d256d020ddf1cff5fc7f735fd2Marek Olšák#include "main/glformats.h" 41ec2b92f98c2e7f161521b447cc1d9a36bce3707cBrian Paul#include "program/prog_instruction.h" 42e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul#include "st_context.h" 4354507125e735ffa595e252282eaabf38095c21e1Alan Hourihane#include "st_atom.h" 44b6bcf0864138787c21b19cda3749c80c6ad74604Brian Paul#include "st_cb_bitmap.h" 45e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul#include "st_cb_clear.h" 46f5713c7d2e7ba8e1170fd9b1dd95379662ab6117Brian Paul#include "st_cb_fbo.h" 47d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul#include "st_draw.h" 48e2d108ec828bdbebdc7e8f9df30c86f0b521aa8dBrian Paul#include "st_format.h" 497faa3542f062dfa32e1596f5ce2b531cb8b4eeefBrian Paul#include "st_program.h" 5051da8ee85eccf0df3721cbd863cd174382d1ddfdBrian Paul 514f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell#include "pipe/p_context.h" 52f717fd25cc44d7dda5a49dc05337c7ee7c8d2d2fVinson Lee#include "pipe/p_shader_tokens.h" 5351da8ee85eccf0df3721cbd863cd174382d1ddfdBrian Paul#include "pipe/p_state.h" 54e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul#include "pipe/p_defines.h" 550bed834be4a174d20b31a6cbcf066774bf749929Michal Krol#include "util/u_format.h" 56e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák#include "util/u_framebuffer.h" 57ab93f8d0679d1f2a116b98831fc4967a2b707b3aBrian Paul#include "util/u_inlines.h" 5885e4ec6d118e340eaccd176aa622221642a2e754Brian Paul#include "util/u_simple_shaders.h" 5951da8ee85eccf0df3721cbd863cd174382d1ddfdBrian Paul 60339e7ec6805e6de8794514c0a935081b5d36d38fBrian Paul#include "cso_cache/cso_context.h" 61339e7ec6805e6de8794514c0a935081b5d36d38fBrian Paul 6251da8ee85eccf0df3721cbd863cd174382d1ddfdBrian Paul 63ab93f8d0679d1f2a116b98831fc4967a2b707b3aBrian Paul/** 64ab93f8d0679d1f2a116b98831fc4967a2b707b3aBrian Paul * Do per-context initialization for glClear. 65ab93f8d0679d1f2a116b98831fc4967a2b707b3aBrian Paul */ 6685e4ec6d118e340eaccd176aa622221642a2e754Brian Paulvoid 67ce5c867cbb17b2444ebc3db5c6a03cee5e2edb8aBrian Paulst_init_clear(struct st_context *st) 68ce5c867cbb17b2444ebc3db5c6a03cee5e2edb8aBrian Paul{ 69a9aa811af01273cef8a73118abdc87313f365ad3Michal Krol memset(&st->clear, 0, sizeof(st->clear)); 70a9aa811af01273cef8a73118abdc87313f365ad3Michal Krol 712737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca st->clear.raster.half_pixel_center = 1; 722737abb44efebfa10ac84b183c20fc5818d1514eJosé Fonseca st->clear.raster.bottom_edge_rule = 1; 73dc4c821f0817a3db716f965692fb701079f66340Marek Olšák st->clear.raster.depth_clip = 1; 74ce5c867cbb17b2444ebc3db5c6a03cee5e2edb8aBrian Paul} 75ce5c867cbb17b2444ebc3db5c6a03cee5e2edb8aBrian Paul 76ce5c867cbb17b2444ebc3db5c6a03cee5e2edb8aBrian Paul 77ab93f8d0679d1f2a116b98831fc4967a2b707b3aBrian Paul/** 78ab93f8d0679d1f2a116b98831fc4967a2b707b3aBrian Paul * Free per-context state for glClear. 79ab93f8d0679d1f2a116b98831fc4967a2b707b3aBrian Paul */ 80ce5c867cbb17b2444ebc3db5c6a03cee5e2edb8aBrian Paulvoid 8185e4ec6d118e340eaccd176aa622221642a2e754Brian Paulst_destroy_clear(struct st_context *st) 8285e4ec6d118e340eaccd176aa622221642a2e754Brian Paul{ 8385e4ec6d118e340eaccd176aa622221642a2e754Brian Paul if (st->clear.fs) { 84a770d40c3d4977e2c134661b5d8facaea446b6eaBrian Paul cso_delete_fragment_shader(st->cso_context, st->clear.fs); 8585e4ec6d118e340eaccd176aa622221642a2e754Brian Paul st->clear.fs = NULL; 8685e4ec6d118e340eaccd176aa622221642a2e754Brian Paul } 8785e4ec6d118e340eaccd176aa622221642a2e754Brian Paul if (st->clear.vs) { 88a770d40c3d4977e2c134661b5d8facaea446b6eaBrian Paul cso_delete_vertex_shader(st->cso_context, st->clear.vs); 8985e4ec6d118e340eaccd176aa622221642a2e754Brian Paul st->clear.vs = NULL; 9085e4ec6d118e340eaccd176aa622221642a2e754Brian Paul } 9168db29c434e144891e5990b032b44495de52f6ebIlia Mirkin if (st->clear.vs_layered) { 9268db29c434e144891e5990b032b44495de52f6ebIlia Mirkin cso_delete_vertex_shader(st->cso_context, st->clear.vs_layered); 9368db29c434e144891e5990b032b44495de52f6ebIlia Mirkin st->clear.vs_layered = NULL; 9468db29c434e144891e5990b032b44495de52f6ebIlia Mirkin } 9568db29c434e144891e5990b032b44495de52f6ebIlia Mirkin if (st->clear.gs_layered) { 9668db29c434e144891e5990b032b44495de52f6ebIlia Mirkin cso_delete_geometry_shader(st->cso_context, st->clear.gs_layered); 9768db29c434e144891e5990b032b44495de52f6ebIlia Mirkin st->clear.gs_layered = NULL; 9868db29c434e144891e5990b032b44495de52f6ebIlia Mirkin } 9985e4ec6d118e340eaccd176aa622221642a2e754Brian Paul} 10085e4ec6d118e340eaccd176aa622221642a2e754Brian Paul 10185e4ec6d118e340eaccd176aa622221642a2e754Brian Paul 1027faa3542f062dfa32e1596f5ce2b531cb8b4eeefBrian Paul/** 1031a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz * Helper function to set the fragment shaders. 1041a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz */ 105164b3cd7577dc6c168eb59003306f241e501da7fBrian Paulstatic inline void 1061a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantzset_fragment_shader(struct st_context *st) 1071a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz{ 1081a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz if (!st->clear.fs) 109355d463f73976a5b091371690e5a914511b0b938Marek Olšák st->clear.fs = 110f26eb36e8bc17b0ff047f114538bd2485c6a52eaMarek Olšák util_make_fragment_passthrough_shader(st->pipe, TGSI_SEMANTIC_GENERIC, 111de1c38299ceb3160ed0c163d4dd8944ec6589a7fMarek Olšák TGSI_INTERPOLATE_CONSTANT, 112de1c38299ceb3160ed0c163d4dd8944ec6589a7fMarek Olšák TRUE); 1131a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz 1141a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz cso_set_fragment_shader_handle(st->cso_context, st->clear.fs); 1151a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz} 1161a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz 1171a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz 1181a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz/** 1191a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz * Helper function to set the vertex shader. 1201a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz */ 121164b3cd7577dc6c168eb59003306f241e501da7fBrian Paulstatic inline void 1221a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantzset_vertex_shader(struct st_context *st) 1231a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz{ 1241a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz /* vertex shader - still required to provide the linkage between 1251a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz * fragment shader input semantics and vertex_element/buffers. 1261a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz */ 1271a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz if (!st->clear.vs) 1281a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz { 1291a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz const uint semantic_names[] = { TGSI_SEMANTIC_POSITION, 130f26eb36e8bc17b0ff047f114538bd2485c6a52eaMarek Olšák TGSI_SEMANTIC_GENERIC }; 1311a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz const uint semantic_indexes[] = { 0, 0 }; 1321a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz st->clear.vs = util_make_vertex_passthrough_shader(st->pipe, 2, 1331a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz semantic_names, 134717f2dd69fadc8ba07b0b8f4612f28a547fb7a4cMarek Olšák semantic_indexes, 135717f2dd69fadc8ba07b0b8f4612f28a547fb7a4cMarek Olšák FALSE); 1361a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz } 1371a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz 1381a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz cso_set_vertex_shader_handle(st->cso_context, st->clear.vs); 13968db29c434e144891e5990b032b44495de52f6ebIlia Mirkin cso_set_geometry_shader_handle(st->cso_context, NULL); 1401a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz} 1411a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz 1421a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz 143e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšákstatic void 144e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšákset_vertex_shader_layered(struct st_context *st) 145e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák{ 146e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák struct pipe_context *pipe = st->pipe; 147e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák 14868db29c434e144891e5990b032b44495de52f6ebIlia Mirkin if (!pipe->screen->get_param(pipe->screen, PIPE_CAP_TGSI_INSTANCEID)) { 14968db29c434e144891e5990b032b44495de52f6ebIlia Mirkin assert(!"Got layered clear, but VS instancing is unsupported"); 150e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák set_vertex_shader(st); 151e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák return; 152e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák } 153e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák 154e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák if (!st->clear.vs_layered) { 15568db29c434e144891e5990b032b44495de52f6ebIlia Mirkin bool vs_layer = 15668db29c434e144891e5990b032b44495de52f6ebIlia Mirkin pipe->screen->get_param(pipe->screen, PIPE_CAP_TGSI_VS_LAYER_VIEWPORT); 15768db29c434e144891e5990b032b44495de52f6ebIlia Mirkin if (vs_layer) { 15868db29c434e144891e5990b032b44495de52f6ebIlia Mirkin st->clear.vs_layered = util_make_layered_clear_vertex_shader(pipe); 15968db29c434e144891e5990b032b44495de52f6ebIlia Mirkin } else { 16068db29c434e144891e5990b032b44495de52f6ebIlia Mirkin st->clear.vs_layered = util_make_layered_clear_helper_vertex_shader(pipe); 16168db29c434e144891e5990b032b44495de52f6ebIlia Mirkin st->clear.gs_layered = util_make_layered_clear_geometry_shader(pipe); 16268db29c434e144891e5990b032b44495de52f6ebIlia Mirkin } 163e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák } 164e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák 165e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák cso_set_vertex_shader_handle(st->cso_context, st->clear.vs_layered); 16668db29c434e144891e5990b032b44495de52f6ebIlia Mirkin cso_set_geometry_shader_handle(st->cso_context, st->clear.gs_layered); 167e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák} 168e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák 169e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák 1701a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz/** 171e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul * Do glClear by drawing a quadrilateral. 1721c8bcc733d695732ca704565b3a10ac5f4172ea3Brian Paul * The vertices of the quad will be computed from the 1731c8bcc733d695732ca704565b3a10ac5f4172ea3Brian Paul * ctx->DrawBuffer->_X/Ymin/max fields. 174e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul */ 175e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paulstatic void 176f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšákclear_with_quad(struct gl_context *ctx, unsigned clear_buffers) 177e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul{ 17876c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 179f88c859cd36f54bd50ca37dbf9806f4f56f70b68Brian Paul struct cso_context *cso = st->cso_context; 18063cb6f59eac91ba34cf80ff3736568e40b094fe1Michal Krol const struct gl_framebuffer *fb = ctx->DrawBuffer; 18163cb6f59eac91ba34cf80ff3736568e40b094fe1Michal Krol const GLfloat fb_width = (GLfloat) fb->Width; 18263cb6f59eac91ba34cf80ff3736568e40b094fe1Michal Krol const GLfloat fb_height = (GLfloat) fb->Height; 18363cb6f59eac91ba34cf80ff3736568e40b094fe1Michal Krol const GLfloat x0 = (GLfloat) ctx->DrawBuffer->_Xmin / fb_width * 2.0f - 1.0f; 18463cb6f59eac91ba34cf80ff3736568e40b094fe1Michal Krol const GLfloat x1 = (GLfloat) ctx->DrawBuffer->_Xmax / fb_width * 2.0f - 1.0f; 18563cb6f59eac91ba34cf80ff3736568e40b094fe1Michal Krol const GLfloat y0 = (GLfloat) ctx->DrawBuffer->_Ymin / fb_height * 2.0f - 1.0f; 18663cb6f59eac91ba34cf80ff3736568e40b094fe1Michal Krol const GLfloat y1 = (GLfloat) ctx->DrawBuffer->_Ymax / fb_height * 2.0f - 1.0f; 187e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák unsigned num_layers = 188e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák util_framebuffer_get_num_layers(&st->state.framebuffer); 189406da44da31f71afd98fc45e2bbfbf41deff1d12Brian Paul 190cf5ef20f436ac1d3efde2b7bff698decccb029e3Keith Whitwell /* 19150cb780f7f90ffc4018f41502a472604bf1677c3Marius Predut printf("%s %s%s%s %f,%f %f,%f\n", __func__, 192cf5ef20f436ac1d3efde2b7bff698decccb029e3Keith Whitwell color ? "color, " : "", 193cf5ef20f436ac1d3efde2b7bff698decccb029e3Keith Whitwell depth ? "depth, " : "", 194cf5ef20f436ac1d3efde2b7bff698decccb029e3Keith Whitwell stencil ? "stencil" : "", 195cf5ef20f436ac1d3efde2b7bff698decccb029e3Keith Whitwell x0, y0, 196cf5ef20f436ac1d3efde2b7bff698decccb029e3Keith Whitwell x1, y1); 197cf5ef20f436ac1d3efde2b7bff698decccb029e3Keith Whitwell */ 198406da44da31f71afd98fc45e2bbfbf41deff1d12Brian Paul 19933fc2486063cc15e95b8fad8f130be4376f06e95Brian Paul cso_save_state(cso, (CSO_BIT_BLEND | 20033fc2486063cc15e95b8fad8f130be4376f06e95Brian Paul CSO_BIT_STENCIL_REF | 20133fc2486063cc15e95b8fad8f130be4376f06e95Brian Paul CSO_BIT_DEPTH_STENCIL_ALPHA | 20233fc2486063cc15e95b8fad8f130be4376f06e95Brian Paul CSO_BIT_RASTERIZER | 20333fc2486063cc15e95b8fad8f130be4376f06e95Brian Paul CSO_BIT_SAMPLE_MASK | 20433fc2486063cc15e95b8fad8f130be4376f06e95Brian Paul CSO_BIT_MIN_SAMPLES | 20533fc2486063cc15e95b8fad8f130be4376f06e95Brian Paul CSO_BIT_VIEWPORT | 20633fc2486063cc15e95b8fad8f130be4376f06e95Brian Paul CSO_BIT_STREAM_OUTPUTS | 20733fc2486063cc15e95b8fad8f130be4376f06e95Brian Paul CSO_BIT_VERTEX_ELEMENTS | 208f90801cd400ec251ef3ad9a7c2ebc6feadbc7860Brian Paul CSO_BIT_AUX_VERTEX_BUFFER_SLOT | 209e599b8f384b4fc48b450ed848d93e27e876de53fMarek Olšák CSO_BIT_PAUSE_QUERIES | 210f90801cd400ec251ef3ad9a7c2ebc6feadbc7860Brian Paul CSO_BITS_ALL_SHADERS)); 2117d95efde0a0e13e13c59444703bc47eb13926385Brian Paul 212406da44da31f71afd98fc45e2bbfbf41deff1d12Brian Paul /* blend state: RGBA masking */ 2131c8bcc733d695732ca704565b3a10ac5f4172ea3Brian Paul { 2141c8bcc733d695732ca704565b3a10ac5f4172ea3Brian Paul struct pipe_blend_state blend; 2151c8bcc733d695732ca704565b3a10ac5f4172ea3Brian Paul memset(&blend, 0, sizeof(blend)); 216f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák if (clear_buffers & PIPE_CLEAR_COLOR) { 21701b7124788f901838f491ed301138a3da55185f7Marek Olšák int num_buffers = ctx->Extensions.EXT_draw_buffers2 ? 21801b7124788f901838f491ed301138a3da55185f7Marek Olšák ctx->DrawBuffer->_NumColorDrawBuffers : 1; 21901b7124788f901838f491ed301138a3da55185f7Marek Olšák int i; 22001b7124788f901838f491ed301138a3da55185f7Marek Olšák 22101b7124788f901838f491ed301138a3da55185f7Marek Olšák blend.independent_blend_enable = num_buffers > 1; 22201b7124788f901838f491ed301138a3da55185f7Marek Olšák 22301b7124788f901838f491ed301138a3da55185f7Marek Olšák for (i = 0; i < num_buffers; i++) { 224f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák if (!(clear_buffers & (PIPE_CLEAR_COLOR0 << i))) 225f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák continue; 226f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák 22701b7124788f901838f491ed301138a3da55185f7Marek Olšák if (ctx->Color.ColorMask[i][0]) 22801b7124788f901838f491ed301138a3da55185f7Marek Olšák blend.rt[i].colormask |= PIPE_MASK_R; 22901b7124788f901838f491ed301138a3da55185f7Marek Olšák if (ctx->Color.ColorMask[i][1]) 23001b7124788f901838f491ed301138a3da55185f7Marek Olšák blend.rt[i].colormask |= PIPE_MASK_G; 23101b7124788f901838f491ed301138a3da55185f7Marek Olšák if (ctx->Color.ColorMask[i][2]) 23201b7124788f901838f491ed301138a3da55185f7Marek Olšák blend.rt[i].colormask |= PIPE_MASK_B; 23301b7124788f901838f491ed301138a3da55185f7Marek Olšák if (ctx->Color.ColorMask[i][3]) 23401b7124788f901838f491ed301138a3da55185f7Marek Olšák blend.rt[i].colormask |= PIPE_MASK_A; 23501b7124788f901838f491ed301138a3da55185f7Marek Olšák } 23601b7124788f901838f491ed301138a3da55185f7Marek Olšák 237a0636157c49701696f451dceac96bed43e7af830Brian Paul if (ctx->Color.DitherFlag) 2381c8bcc733d695732ca704565b3a10ac5f4172ea3Brian Paul blend.dither = 1; 2391c8bcc733d695732ca704565b3a10ac5f4172ea3Brian Paul } 240f88c859cd36f54bd50ca37dbf9806f4f56f70b68Brian Paul cso_set_blend(cso, &blend); 241406da44da31f71afd98fc45e2bbfbf41deff1d12Brian Paul } 242e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul 243d6ac959833a8e40a27907940969c622692f749b1Zack Rusin /* depth_stencil state: always pass/set to ref value */ 2441c8bcc733d695732ca704565b3a10ac5f4172ea3Brian Paul { 245bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell struct pipe_depth_stencil_alpha_state depth_stencil; 246d6ac959833a8e40a27907940969c622692f749b1Zack Rusin memset(&depth_stencil, 0, sizeof(depth_stencil)); 247f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák if (clear_buffers & PIPE_CLEAR_DEPTH) { 248d6ac959833a8e40a27907940969c622692f749b1Zack Rusin depth_stencil.depth.enabled = 1; 249d6ac959833a8e40a27907940969c622692f749b1Zack Rusin depth_stencil.depth.writemask = 1; 250d6ac959833a8e40a27907940969c622692f749b1Zack Rusin depth_stencil.depth.func = PIPE_FUNC_ALWAYS; 2511c8bcc733d695732ca704565b3a10ac5f4172ea3Brian Paul } 252d6ac959833a8e40a27907940969c622692f749b1Zack Rusin 253f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák if (clear_buffers & PIPE_CLEAR_STENCIL) { 254b75adabc89e34083ac302ac9bafc8d80b62ac14cRoland Scheidegger struct pipe_stencil_ref stencil_ref; 255b75adabc89e34083ac302ac9bafc8d80b62ac14cRoland Scheidegger memset(&stencil_ref, 0, sizeof(stencil_ref)); 256bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell depth_stencil.stencil[0].enabled = 1; 257bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell depth_stencil.stencil[0].func = PIPE_FUNC_ALWAYS; 258bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell depth_stencil.stencil[0].fail_op = PIPE_STENCIL_OP_REPLACE; 259bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell depth_stencil.stencil[0].zpass_op = PIPE_STENCIL_OP_REPLACE; 260bfe79babf99e6b9435195178d1ea64687c60d161Keith Whitwell depth_stencil.stencil[0].zfail_op = PIPE_STENCIL_OP_REPLACE; 261a7e72231e3c76a9410d192441da309002ea6422dZack Rusin depth_stencil.stencil[0].valuemask = 0xff; 262a7e72231e3c76a9410d192441da309002ea6422dZack Rusin depth_stencil.stencil[0].writemask = ctx->Stencil.WriteMask[0] & 0xff; 263dfc02e3784e521c07a22ff2ffc4bf02f022e9898Roland Scheidegger stencil_ref.ref_value[0] = ctx->Stencil.Clear; 264f88c859cd36f54bd50ca37dbf9806f4f56f70b68Brian Paul cso_set_stencil_ref(cso, &stencil_ref); 265d6ac959833a8e40a27907940969c622692f749b1Zack Rusin } 266339e7ec6805e6de8794514c0a935081b5d36d38fBrian Paul 267f88c859cd36f54bd50ca37dbf9806f4f56f70b68Brian Paul cso_set_depth_stencil_alpha(cso, &depth_stencil); 268e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul } 269e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul 270f88c859cd36f54bd50ca37dbf9806f4f56f70b68Brian Paul cso_set_vertex_elements(cso, 2, st->util_velems); 271f88c859cd36f54bd50ca37dbf9806f4f56f70b68Brian Paul cso_set_stream_outputs(cso, 0, NULL, NULL); 272f88c859cd36f54bd50ca37dbf9806f4f56f70b68Brian Paul cso_set_sample_mask(cso, ~0); 273f88c859cd36f54bd50ca37dbf9806f4f56f70b68Brian Paul cso_set_min_samples(cso, 1); 274f88c859cd36f54bd50ca37dbf9806f4f56f70b68Brian Paul cso_set_rasterizer(cso, &st->clear.raster); 275406da44da31f71afd98fc45e2bbfbf41deff1d12Brian Paul 27663cb6f59eac91ba34cf80ff3736568e40b094fe1Michal Krol /* viewport state: viewport matching window dims */ 277347b9418acfc68544ab5c0cba6bfdd934e129b80Brian Paul cso_set_viewport_dims(st->cso_context, fb_width, fb_height, 278347b9418acfc68544ab5c0cba6bfdd934e129b80Brian Paul st_fb_orientation(fb) == Y_0_TOP); 27963cb6f59eac91ba34cf80ff3736568e40b094fe1Michal Krol 2801a79064da12a8be71dca7656e5eebc4b85d2b35fJakob Bornecrantz set_fragment_shader(st); 281f88c859cd36f54bd50ca37dbf9806f4f56f70b68Brian Paul cso_set_tessctrl_shader_handle(cso, NULL); 282f88c859cd36f54bd50ca37dbf9806f4f56f70b68Brian Paul cso_set_tesseval_shader_handle(cso, NULL); 283d640198b2d52c104c707522e79d53a36f708ccd0Brian Paul 284e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák if (num_layers > 1) 285e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák set_vertex_shader_layered(st); 286e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák else 287e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák set_vertex_shader(st); 288e47af58bb411c7779857ad96a7cc3306980311aeMarek Olšák 289d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul /* draw quad matching scissor rect. 290d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul * 291d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul * Note: if we're only clearing depth/stencil we still setup vertices 292d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul * with color, but they'll be ignored. 293d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul * 294d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul * We can't translate the clear color to the colorbuffer format, 2950612005aa66f211753f44bb4ffdfdcc9316281acMarek Olšák * because different colorbuffers may have different formats. 2960612005aa66f211753f44bb4ffdfdcc9316281acMarek Olšák */ 297d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul if (!st_draw_quad(st, x0, y0, x1, y1, 298d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul ctx->Depth.Clear * 2.0f - 1.0f, 299d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul 0.0f, 0.0f, 0.0f, 0.0f, 300d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul (const float *) &ctx->Color.ClearColor.f, 301d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul num_layers)) { 302d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glClear"); 303d7d4fe90c42d85ecbbedeca8b77043b750e18212Brian Paul } 3044f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell 30547fdaf0ed9ef2f89cdaa97d0d48b1f1194d710c6Brian Paul /* Restore pipe state */ 30633fc2486063cc15e95b8fad8f130be4376f06e95Brian Paul cso_restore_state(cso); 307e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul} 308e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul 309e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul 310def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul/** 311cabe4fbb852f3c335937e3576db85d0143cb6c12Marek Olšák * Return if the scissor must be enabled during the clear. 312def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul */ 313164b3cd7577dc6c168eb59003306f241e501da7fBrian Paulstatic inline GLboolean 314cabe4fbb852f3c335937e3576db85d0143cb6c12Marek Olšákis_scissor_enabled(struct gl_context *ctx, struct gl_renderbuffer *rb) 315cf5ef20f436ac1d3efde2b7bff698decccb029e3Keith Whitwell{ 316742832434abc8caff2425fcc174966b2834ac552Ilia Mirkin const struct gl_scissor_rect *scissor = &ctx->Scissor.ScissorArray[0]; 317742832434abc8caff2425fcc174966b2834ac552Ilia Mirkin 318a9c73fb778a41b422a811c67b4aba806d4dfb7c8Courtney Goeltzenleuchter return (ctx->Scissor.EnableFlags & 1) && 319742832434abc8caff2425fcc174966b2834ac552Ilia Mirkin (scissor->X > 0 || 320742832434abc8caff2425fcc174966b2834ac552Ilia Mirkin scissor->Y > 0 || 32146cd3bab933196f46521c9462552ed19d16817e6Eric Anholt scissor->X + scissor->Width < (int)rb->Width || 32246cd3bab933196f46521c9462552ed19d16817e6Eric Anholt scissor->Y + scissor->Height < (int)rb->Height); 323def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul} 324def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul 325d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin/** 326d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin * Return if window rectangles must be enabled during the clear. 327d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin */ 328d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkinstatic inline bool 329d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkinis_window_rectangle_enabled(struct gl_context *ctx) 330d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin{ 331d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin if (ctx->DrawBuffer == ctx->WinSysDrawBuffer) 332d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin return false; 333d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin return ctx->Scissor.NumWindowRects > 0 || 334d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin ctx->Scissor.WindowRectMode == GL_INCLUSIVE_EXT; 335d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin} 336d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin 337def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul 338def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul/** 339f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák * Return if all of the color channels are masked. 340f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák */ 341164b3cd7577dc6c168eb59003306f241e501da7fBrian Paulstatic inline GLboolean 342f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšákis_color_disabled(struct gl_context *ctx, int i) 343f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák{ 344f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák return !ctx->Color.ColorMask[i][0] && 345f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák !ctx->Color.ColorMask[i][1] && 346f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák !ctx->Color.ColorMask[i][2] && 347f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák !ctx->Color.ColorMask[i][3]; 348f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák} 349f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák 350f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák 351f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák/** 352cabe4fbb852f3c335937e3576db85d0143cb6c12Marek Olšák * Return if any of the color channels are masked. 353def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul */ 354164b3cd7577dc6c168eb59003306f241e501da7fBrian Paulstatic inline GLboolean 35501b7124788f901838f491ed301138a3da55185f7Marek Olšákis_color_masked(struct gl_context *ctx, int i) 356def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul{ 35701b7124788f901838f491ed301138a3da55185f7Marek Olšák return !ctx->Color.ColorMask[i][0] || 35801b7124788f901838f491ed301138a3da55185f7Marek Olšák !ctx->Color.ColorMask[i][1] || 35901b7124788f901838f491ed301138a3da55185f7Marek Olšák !ctx->Color.ColorMask[i][2] || 36001b7124788f901838f491ed301138a3da55185f7Marek Olšák !ctx->Color.ColorMask[i][3]; 361def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul} 362def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul 363def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul 364def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul/** 365355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšák * Return if all of the stencil bits are masked. 366355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšák */ 367164b3cd7577dc6c168eb59003306f241e501da7fBrian Paulstatic inline GLboolean 368355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšákis_stencil_disabled(struct gl_context *ctx, struct gl_renderbuffer *rb) 369355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšák{ 370355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšák const GLuint stencilMax = 0xff; 371355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšák 372355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšák assert(_mesa_get_format_bits(rb->Format, GL_STENCIL_BITS) > 0); 373355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšák return (ctx->Stencil.WriteMask[0] & stencilMax) == 0; 374355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšák} 375355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšák 376355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšák 377355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšák/** 378cabe4fbb852f3c335937e3576db85d0143cb6c12Marek Olšák * Return if any of the stencil bits are masked. 379def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul */ 380164b3cd7577dc6c168eb59003306f241e501da7fBrian Paulstatic inline GLboolean 381cabe4fbb852f3c335937e3576db85d0143cb6c12Marek Olšákis_stencil_masked(struct gl_context *ctx, struct gl_renderbuffer *rb) 382def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul{ 38345e76d2665b38ba3787548310efc59e969124c01Brian Paul const GLuint stencilMax = 0xff; 384cf5ef20f436ac1d3efde2b7bff698decccb029e3Keith Whitwell 385447071cfb01cf52e3e6591c71684a689f7e900faBrian Paul assert(_mesa_get_format_bits(rb->Format, GL_STENCIL_BITS) > 0); 386cabe4fbb852f3c335937e3576db85d0143cb6c12Marek Olšák return (ctx->Stencil.WriteMask[0] & stencilMax) != stencilMax; 387def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul} 388def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul 389def8bb784cf403474eea3b4d25a3262155dc38f2Brian Paul 390e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul/** 391e415dced44bd716185e63df0c8c17f57de2b29e2Brian Paul * Called via ctx->Driver.Clear() 3924f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell */ 393ab93f8d0679d1f2a116b98831fc4967a2b707b3aBrian Paulstatic void 394f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_Clear(struct gl_context *ctx, GLbitfield mask) 3954f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell{ 39676c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul struct st_context *st = st_context(ctx); 39747fdaf0ed9ef2f89cdaa97d0d48b1f1194d710c6Brian Paul struct gl_renderbuffer *depthRb 39847fdaf0ed9ef2f89cdaa97d0d48b1f1194d710c6Brian Paul = ctx->DrawBuffer->Attachment[BUFFER_DEPTH].Renderbuffer; 39947fdaf0ed9ef2f89cdaa97d0d48b1f1194d710c6Brian Paul struct gl_renderbuffer *stencilRb 40047fdaf0ed9ef2f89cdaa97d0d48b1f1194d710c6Brian Paul = ctx->DrawBuffer->Attachment[BUFFER_STENCIL].Renderbuffer; 401ab93f8d0679d1f2a116b98831fc4967a2b707b3aBrian Paul GLbitfield quad_buffers = 0x0; 402ab93f8d0679d1f2a116b98831fc4967a2b707b3aBrian Paul GLbitfield clear_buffers = 0x0; 403eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer GLuint i; 4044f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell 405b6bcf0864138787c21b19cda3749c80c6ad74604Brian Paul st_flush_bitmap_cache(st); 406a571859fc446a9ba106ba4586603b5a01e7cc52aNicolai Hähnle st_invalidate_readpix_cache(st); 407b6bcf0864138787c21b19cda3749c80c6ad74604Brian Paul 408eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer /* This makes sure the pipe has the latest scissor, etc values */ 40908c46025c87654fbc885136a2c8cc4cce902dd37Samuel Pitoiset st_validate_state( st, ST_PIPELINE_RENDER ); 4104f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell 411eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer if (mask & BUFFER_BITS_COLOR) { 412eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer for (i = 0; i < ctx->DrawBuffer->_NumColorDrawBuffers; i++) { 413bfcf78c1101a1cbcdd9a479722203047c8d6c26aEmil Velikov GLint b = ctx->DrawBuffer->_ColorDrawBufferIndexes[i]; 41447fdaf0ed9ef2f89cdaa97d0d48b1f1194d710c6Brian Paul 4159baa45f78b8ca7d66280e36009b6a685055d7cd6Marek Olšák if (b >= 0 && mask & (1 << b)) { 4168571c4babf82b2fe78dba06458070eb4010cfc18Brian Paul struct gl_renderbuffer *rb 4178571c4babf82b2fe78dba06458070eb4010cfc18Brian Paul = ctx->DrawBuffer->Attachment[b].Renderbuffer; 418efbd33aff93d875af95d40db018b7911a3f87d02Brian Paul struct st_renderbuffer *strb = st_renderbuffer(rb); 41901b7124788f901838f491ed301138a3da55185f7Marek Olšák int colormask_index = ctx->Extensions.EXT_draw_buffers2 ? i : 0; 420eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer 421efbd33aff93d875af95d40db018b7911a3f87d02Brian Paul if (!strb || !strb->surface) 422eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer continue; 423eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer 424f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák if (is_color_disabled(ctx, colormask_index)) 425f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák continue; 426f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák 42701b7124788f901838f491ed301138a3da55185f7Marek Olšák if (is_scissor_enabled(ctx, rb) || 428d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin is_window_rectangle_enabled(ctx) || 42901b7124788f901838f491ed301138a3da55185f7Marek Olšák is_color_masked(ctx, colormask_index)) 430f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák quad_buffers |= PIPE_CLEAR_COLOR0 << i; 431eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer else 432f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák clear_buffers |= PIPE_CLEAR_COLOR0 << i; 43347fdaf0ed9ef2f89cdaa97d0d48b1f1194d710c6Brian Paul } 43447fdaf0ed9ef2f89cdaa97d0d48b1f1194d710c6Brian Paul } 43547fdaf0ed9ef2f89cdaa97d0d48b1f1194d710c6Brian Paul } 4360e067f1fb20094417e84e1b18f2302251cece2caKeith Whitwell 437f94ea25a4ac9f65cfec880ea3cb9d6c50eda93d1Marek Olšák if (mask & BUFFER_BIT_DEPTH) { 438eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer struct st_renderbuffer *strb = st_renderbuffer(depthRb); 439eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer 440355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšák if (strb->surface && ctx->Depth.Mask) { 441d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin if (is_scissor_enabled(ctx, depthRb) || 442d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin is_window_rectangle_enabled(ctx)) 443f94ea25a4ac9f65cfec880ea3cb9d6c50eda93d1Marek Olšák quad_buffers |= PIPE_CLEAR_DEPTH; 444eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer else 445f94ea25a4ac9f65cfec880ea3cb9d6c50eda93d1Marek Olšák clear_buffers |= PIPE_CLEAR_DEPTH; 446eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer } 4474f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell } 448f94ea25a4ac9f65cfec880ea3cb9d6c50eda93d1Marek Olšák if (mask & BUFFER_BIT_STENCIL) { 449f94ea25a4ac9f65cfec880ea3cb9d6c50eda93d1Marek Olšák struct st_renderbuffer *strb = st_renderbuffer(stencilRb); 450eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer 451355686a69fd10c220afcee3656c5dfb2bc644608Marek Olšák if (strb->surface && !is_stencil_disabled(ctx, stencilRb)) { 452f94ea25a4ac9f65cfec880ea3cb9d6c50eda93d1Marek Olšák if (is_scissor_enabled(ctx, stencilRb) || 453d1bdc1238a39469e6760758876e8832019795a54Ilia Mirkin is_window_rectangle_enabled(ctx) || 454f94ea25a4ac9f65cfec880ea3cb9d6c50eda93d1Marek Olšák is_stencil_masked(ctx, stencilRb)) 455f94ea25a4ac9f65cfec880ea3cb9d6c50eda93d1Marek Olšák quad_buffers |= PIPE_CLEAR_STENCIL; 456f94ea25a4ac9f65cfec880ea3cb9d6c50eda93d1Marek Olšák else 457f94ea25a4ac9f65cfec880ea3cb9d6c50eda93d1Marek Olšák clear_buffers |= PIPE_CLEAR_STENCIL; 45847fdaf0ed9ef2f89cdaa97d0d48b1f1194d710c6Brian Paul } 4594f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell } 460eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer 4619ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák /* Always clear depth and stencil together. 4629ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák * This can only happen when the stencil writemask is not a full mask. 4639ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák */ 4649ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák if (quad_buffers & PIPE_CLEAR_DEPTHSTENCIL && 4659ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák clear_buffers & PIPE_CLEAR_DEPTHSTENCIL) { 4669ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák quad_buffers |= clear_buffers & PIPE_CLEAR_DEPTHSTENCIL; 4679ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák clear_buffers &= ~PIPE_CLEAR_DEPTHSTENCIL; 4689ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák } 4699ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák 4709ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák /* Only use quad-based clearing for the renderbuffers which cannot 4719ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák * use pipe->clear. We want to always use pipe->clear for the other 4729ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák * renderbuffers, because it's likely to be faster. 473eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer */ 474eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer if (quad_buffers) { 475f09de877359e0bf9e6646791da71c966dd62dc57Marek Olšák clear_with_quad(ctx, quad_buffers); 4769ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák } 4779ea3f88c0acc547bbff39d489abda99bc71f376fMarek Olšák if (clear_buffers) { 4780612005aa66f211753f44bb4ffdfdcc9316281acMarek Olšák /* We can't translate the clear color to the colorbuffer format, 4790612005aa66f211753f44bb4ffdfdcc9316281acMarek Olšák * because different colorbuffers may have different formats. 4800612005aa66f211753f44bb4ffdfdcc9316281acMarek Olšák */ 4810612005aa66f211753f44bb4ffdfdcc9316281acMarek Olšák st->pipe->clear(st->pipe, clear_buffers, 4820612005aa66f211753f44bb4ffdfdcc9316281acMarek Olšák (union pipe_color_union*)&ctx->Color.ClearColor, 48376c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul ctx->Depth.Clear, ctx->Stencil.Clear); 484783083c3b81c51bae541e0a86801f0492ca352cdRoland Scheidegger } 485eb168e26aa63f11a47d70c4555cae30691a2cd57Michel Dänzer if (mask & BUFFER_BIT_ACCUM) 486122c6768e3d4c1d1b57203eca70569f9301baab5Brian Paul _mesa_clear_accum_buffer(ctx); 4874f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell} 4884f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell 4894f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell 490ab93f8d0679d1f2a116b98831fc4967a2b707b3aBrian Paulvoid 491ab93f8d0679d1f2a116b98831fc4967a2b707b3aBrian Paulst_init_clear_functions(struct dd_function_table *functions) 4924f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell{ 4933374b26f52313f629b69876bbca30845fb78b371Brian Paul functions->Clear = st_Clear; 4944f442d9ef5db42867c99a7288b4114a0340f73e6Keith Whitwell} 495