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