184836ffce1ca322f91aaae25c4de2be20e55a4b5Brian/**************************************************************************
284836ffce1ca322f91aaae25c4de2be20e55a4b5Brian *
384836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * Copyright 2007 Tungsten Graphics, Inc., Cedar Park, Texas.
484836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * All Rights Reserved.
584836ffce1ca322f91aaae25c4de2be20e55a4b5Brian *
684836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * Permission is hereby granted, free of charge, to any person obtaining a
784836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * copy of this software and associated documentation files (the
884836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * "Software"), to deal in the Software without restriction, including
984836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * without limitation the rights to use, copy, modify, merge, publish,
1084836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * distribute, sub license, and/or sell copies of the Software, and to
1184836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * permit persons to whom the Software is furnished to do so, subject to
1284836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * the following conditions:
1384836ffce1ca322f91aaae25c4de2be20e55a4b5Brian *
1484836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * The above copyright notice and this permission notice (including the
1584836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * next paragraph) shall be included in all copies or substantial portions
1684836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * of the Software.
1784836ffce1ca322f91aaae25c4de2be20e55a4b5Brian *
1884836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
1984836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
2084836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
2184836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
2284836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
2384836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
2484836ffce1ca322f91aaae25c4de2be20e55a4b5Brian * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
2584836ffce1ca322f91aaae25c4de2be20e55a4b5Brian *
2684836ffce1ca322f91aaae25c4de2be20e55a4b5Brian **************************************************************************/
2784836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
2884836ffce1ca322f91aaae25c4de2be20e55a4b5Brian /*
2984836ffce1ca322f91aaae25c4de2be20e55a4b5Brian  * Authors:
3084836ffce1ca322f91aaae25c4de2be20e55a4b5Brian  *   Brian Paul
3184836ffce1ca322f91aaae25c4de2be20e55a4b5Brian  */
3284836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
3384836ffce1ca322f91aaae25c4de2be20e55a4b5Brian#include "main/imports.h"
3484836ffce1ca322f91aaae25c4de2be20e55a4b5Brian#include "main/image.h"
3584836ffce1ca322f91aaae25c4de2be20e55a4b5Brian#include "main/macros.h"
36edc09358f72cd48cb2315daf23c82e7646aeaea3Vinson Lee#include "main/mfeatures.h"
3784836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
3884836ffce1ca322f91aaae25c4de2be20e55a4b5Brian#include "st_context.h"
39fdd605e446ed174bae13171d116f498704259057José Fonseca#include "st_texture.h"
4084836ffce1ca322f91aaae25c4de2be20e55a4b5Brian#include "st_cb_blit.h"
4184836ffce1ca322f91aaae25c4de2be20e55a4b5Brian#include "st_cb_fbo.h"
425d7c27f5ec2f30c264dc2d53c4980970b3a13ee5Henri Verbeet#include "st_atom.h"
4384836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
4484836ffce1ca322f91aaae25c4de2be20e55a4b5Brian#include "util/u_blit.h"
4584836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
4684836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
4784836ffce1ca322f91aaae25c4de2be20e55a4b5Brianvoid
4884836ffce1ca322f91aaae25c4de2be20e55a4b5Brianst_init_blit(struct st_context *st)
4984836ffce1ca322f91aaae25c4de2be20e55a4b5Brian{
507d95efde0a0e13e13c59444703bc47eb13926385Brian   st->blit = util_create_blit(st->pipe, st->cso_context);
5184836ffce1ca322f91aaae25c4de2be20e55a4b5Brian}
5284836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
5384836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
5484836ffce1ca322f91aaae25c4de2be20e55a4b5Brianvoid
5584836ffce1ca322f91aaae25c4de2be20e55a4b5Brianst_destroy_blit(struct st_context *st)
5684836ffce1ca322f91aaae25c4de2be20e55a4b5Brian{
5784836ffce1ca322f91aaae25c4de2be20e55a4b5Brian   util_destroy_blit(st->blit);
5884836ffce1ca322f91aaae25c4de2be20e55a4b5Brian   st->blit = NULL;
5984836ffce1ca322f91aaae25c4de2be20e55a4b5Brian}
6084836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
6184836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
629927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#if FEATURE_EXT_framebuffer_blit
63e76e17d569af924e187fa22facfb968667854ceaChia-I Wu
6484836ffce1ca322f91aaae25c4de2be20e55a4b5Brianstatic void
65f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumillerst_BlitFramebuffer_resolve(struct gl_context *ctx,
66f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller                           GLbitfield mask,
67f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller                           struct pipe_resolve_info *info)
68f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller{
69f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller   const GLbitfield depthStencil = GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT;
70f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
71f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller   struct st_context *st = st_context(ctx);
72f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
73f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller   struct st_renderbuffer *srcRb, *dstRb;
74f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
75f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller   if (mask & GL_COLOR_BUFFER_BIT) {
76f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      srcRb = st_renderbuffer(ctx->ReadBuffer->_ColorReadBuffer);
77f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      dstRb = st_renderbuffer(ctx->DrawBuffer->_ColorDrawBuffers[0]);
78f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
79f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      info->mask = PIPE_MASK_RGBA;
80f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
81f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      info->src.res = srcRb->texture;
82f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      info->src.layer = srcRb->surface->u.tex.first_layer;
836286d9810b7ebae588060370cd7a63c327478a2fChristoph Bumiller      info->dst.res = dstRb->texture;
846286d9810b7ebae588060370cd7a63c327478a2fChristoph Bumiller      info->dst.level = dstRb->surface->u.tex.level;
856286d9810b7ebae588060370cd7a63c327478a2fChristoph Bumiller      info->dst.layer = dstRb->surface->u.tex.first_layer;
86f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
87f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      st->pipe->resource_resolve(st->pipe, info);
88f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller   }
89f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
90f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller   if (mask & depthStencil) {
91f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      struct gl_renderbuffer_attachment *srcDepth, *srcStencil;
92f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      struct gl_renderbuffer_attachment *dstDepth, *dstStencil;
9309ba2527e885f6134002205716a44d01d83638c3Brian Paul      boolean combined;
94f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
95f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      srcDepth = &ctx->ReadBuffer->Attachment[BUFFER_DEPTH];
96f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      dstDepth = &ctx->DrawBuffer->Attachment[BUFFER_DEPTH];
97f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      srcStencil = &ctx->ReadBuffer->Attachment[BUFFER_STENCIL];
98f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      dstStencil = &ctx->DrawBuffer->Attachment[BUFFER_STENCIL];
99f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
10009ba2527e885f6134002205716a44d01d83638c3Brian Paul      combined =
101f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         st_is_depth_stencil_combined(srcDepth, srcStencil) &&
102f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         st_is_depth_stencil_combined(dstDepth, dstStencil);
103f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
104f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      if ((mask & GL_DEPTH_BUFFER_BIT) || combined) {
105f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         /* resolve depth and, if combined and requested, stencil as well */
106f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         srcRb = st_renderbuffer(srcDepth->Renderbuffer);
107f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         dstRb = st_renderbuffer(dstDepth->Renderbuffer);
108f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
109f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info->mask = (mask & GL_DEPTH_BUFFER_BIT) ? PIPE_MASK_Z : 0;
110425b179fafe93ddf4abacbccb67ed6aecbef6a7eChristoph Bumiller         if (combined && (mask & GL_STENCIL_BUFFER_BIT)) {
111425b179fafe93ddf4abacbccb67ed6aecbef6a7eChristoph Bumiller            mask &= ~GL_STENCIL_BUFFER_BIT;
112f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller            info->mask |= PIPE_MASK_S;
113425b179fafe93ddf4abacbccb67ed6aecbef6a7eChristoph Bumiller         }
114f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
115f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info->src.res = srcRb->texture;
116f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info->src.layer = srcRb->surface->u.tex.first_layer;
1176286d9810b7ebae588060370cd7a63c327478a2fChristoph Bumiller         info->dst.res = dstRb->texture;
1186286d9810b7ebae588060370cd7a63c327478a2fChristoph Bumiller         info->dst.level = dstRb->surface->u.tex.level;
1196286d9810b7ebae588060370cd7a63c327478a2fChristoph Bumiller         info->dst.layer = dstRb->surface->u.tex.first_layer;
120f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
121f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         st->pipe->resource_resolve(st->pipe, info);
122f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      }
123f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
124f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      if (mask & GL_STENCIL_BUFFER_BIT) {
125f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         /* resolve separate stencil buffer */
126f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         srcRb = st_renderbuffer(srcStencil->Renderbuffer);
127f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         dstRb = st_renderbuffer(dstStencil->Renderbuffer);
128f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
129f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info->mask = PIPE_MASK_S;
130f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
131f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info->src.res = srcRb->texture;
132f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info->src.layer = srcRb->surface->u.tex.first_layer;
1336286d9810b7ebae588060370cd7a63c327478a2fChristoph Bumiller         info->dst.res = dstRb->texture;
1346286d9810b7ebae588060370cd7a63c327478a2fChristoph Bumiller         info->dst.level = dstRb->surface->u.tex.level;
1356286d9810b7ebae588060370cd7a63c327478a2fChristoph Bumiller         info->dst.layer = dstRb->surface->u.tex.first_layer;
136f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
137f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         st->pipe->resource_resolve(st->pipe, info);
138f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      }
139f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller   }
140f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller}
141f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
142f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumillerstatic void
143f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergst_BlitFramebuffer(struct gl_context *ctx,
14484836ffce1ca322f91aaae25c4de2be20e55a4b5Brian                   GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1,
14584836ffce1ca322f91aaae25c4de2be20e55a4b5Brian                   GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1,
14684836ffce1ca322f91aaae25c4de2be20e55a4b5Brian                   GLbitfield mask, GLenum filter)
14784836ffce1ca322f91aaae25c4de2be20e55a4b5Brian{
148a59579c983df651373435791f8f4fd249293b344Brian Paul   const GLbitfield depthStencil = (GL_DEPTH_BUFFER_BIT |
149a59579c983df651373435791f8f4fd249293b344Brian Paul                                    GL_STENCIL_BUFFER_BIT);
15076c7ad2e7d387feefe58dc2116b613fe11a8b273Brian Paul   struct st_context *st = st_context(ctx);
15184836ffce1ca322f91aaae25c4de2be20e55a4b5Brian   const uint pFilter = ((filter == GL_NEAREST)
15284836ffce1ca322f91aaae25c4de2be20e55a4b5Brian                         ? PIPE_TEX_MIPFILTER_NEAREST
15384836ffce1ca322f91aaae25c4de2be20e55a4b5Brian                         : PIPE_TEX_MIPFILTER_LINEAR);
154a59579c983df651373435791f8f4fd249293b344Brian Paul   struct gl_framebuffer *readFB = ctx->ReadBuffer;
155a59579c983df651373435791f8f4fd249293b344Brian Paul   struct gl_framebuffer *drawFB = ctx->DrawBuffer;
15684836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
1575d7c27f5ec2f30c264dc2d53c4980970b3a13ee5Henri Verbeet   st_validate_state(st);
1585d7c27f5ec2f30c264dc2d53c4980970b3a13ee5Henri Verbeet
159f792137593b16b850a8a95dbb4859d49effb9f7cBrian Paul   if (!_mesa_clip_blit(ctx, &srcX0, &srcY0, &srcX1, &srcY1,
160f792137593b16b850a8a95dbb4859d49effb9f7cBrian Paul                        &dstX0, &dstY0, &dstX1, &dstY1)) {
161f792137593b16b850a8a95dbb4859d49effb9f7cBrian Paul      return; /* nothing to draw/blit */
162f792137593b16b850a8a95dbb4859d49effb9f7cBrian Paul   }
163f792137593b16b850a8a95dbb4859d49effb9f7cBrian Paul
164a59579c983df651373435791f8f4fd249293b344Brian Paul   if (st_fb_orientation(drawFB) == Y_0_TOP) {
165a59579c983df651373435791f8f4fd249293b344Brian Paul      /* invert Y for dest */
166a59579c983df651373435791f8f4fd249293b344Brian Paul      dstY0 = drawFB->Height - dstY0;
167a59579c983df651373435791f8f4fd249293b344Brian Paul      dstY1 = drawFB->Height - dstY1;
168a59579c983df651373435791f8f4fd249293b344Brian Paul   }
169a59579c983df651373435791f8f4fd249293b344Brian Paul
170a59579c983df651373435791f8f4fd249293b344Brian Paul   if (st_fb_orientation(readFB) == Y_0_TOP) {
171a59579c983df651373435791f8f4fd249293b344Brian Paul      /* invert Y for src */
172a59579c983df651373435791f8f4fd249293b344Brian Paul      srcY0 = readFB->Height - srcY0;
173a59579c983df651373435791f8f4fd249293b344Brian Paul      srcY1 = readFB->Height - srcY1;
174a59579c983df651373435791f8f4fd249293b344Brian Paul   }
175a59579c983df651373435791f8f4fd249293b344Brian Paul
176f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller   /* Disable conditional rendering. */
177f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller   if (st->render_condition) {
178f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      st->pipe->render_condition(st->pipe, NULL, 0);
179f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller   }
180f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
181094eeff19946138d6306d74e9e62af5e9d192abdDave Airlie   if (readFB->Visual.sampleBuffers > drawFB->Visual.sampleBuffers &&
182094eeff19946138d6306d74e9e62af5e9d192abdDave Airlie       readFB->Visual.samples > 1) {
183f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      struct pipe_resolve_info info;
184f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
185f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      if (dstX0 < dstX1) {
186f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.dst.x0 = dstX0;
187f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.dst.x1 = dstX1;
188f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.src.x0 = srcX0;
189f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.src.x1 = srcX1;
190f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      } else {
191f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.dst.x0 = dstX1;
192f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.dst.x1 = dstX0;
193f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.src.x0 = srcX1;
194f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.src.x1 = srcX0;
195f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      }
196f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      if (dstY0 < dstY1) {
197f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.dst.y0 = dstY0;
198f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.dst.y1 = dstY1;
199f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.src.y0 = srcY0;
200f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.src.y1 = srcY1;
201f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      } else {
202f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.dst.y0 = dstY1;
203f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.dst.y1 = dstY0;
204f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.src.y0 = srcY1;
205f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller         info.src.y1 = srcY0;
206f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      }
207f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
208f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      st_BlitFramebuffer_resolve(ctx, mask, &info); /* filter doesn't apply */
209f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
210f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller      goto done;
211f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller   }
212f253d83bc72e7d26df8cd3a04747b3d46a8543e6Christoph Bumiller
213a59579c983df651373435791f8f4fd249293b344Brian Paul   if (srcY0 > srcY1 && dstY0 > dstY1) {
214a59579c983df651373435791f8f4fd249293b344Brian Paul      /* Both src and dst are upside down.  Swap Y to make it
215a59579c983df651373435791f8f4fd249293b344Brian Paul       * right-side up to increase odds of using a fast path.
216a59579c983df651373435791f8f4fd249293b344Brian Paul       * Recall that all Gallium raster coords have Y=0=top.
217a59579c983df651373435791f8f4fd249293b344Brian Paul       */
218a59579c983df651373435791f8f4fd249293b344Brian Paul      GLint tmp;
219a59579c983df651373435791f8f4fd249293b344Brian Paul      tmp = srcY0;
220a59579c983df651373435791f8f4fd249293b344Brian Paul      srcY0 = srcY1;
221a59579c983df651373435791f8f4fd249293b344Brian Paul      srcY1 = tmp;
222a59579c983df651373435791f8f4fd249293b344Brian Paul      tmp = dstY0;
223a59579c983df651373435791f8f4fd249293b344Brian Paul      dstY0 = dstY1;
224a59579c983df651373435791f8f4fd249293b344Brian Paul      dstY1 = tmp;
225a59579c983df651373435791f8f4fd249293b344Brian Paul   }
226a59579c983df651373435791f8f4fd249293b344Brian Paul
22784836ffce1ca322f91aaae25c4de2be20e55a4b5Brian   if (mask & GL_COLOR_BUFFER_BIT) {
228fdd605e446ed174bae13171d116f498704259057José Fonseca      struct gl_renderbuffer_attachment *srcAtt =
229fdd605e446ed174bae13171d116f498704259057José Fonseca         &readFB->Attachment[readFB->_ColorReadBufferIndex];
230fdd605e446ed174bae13171d116f498704259057José Fonseca
231fdd605e446ed174bae13171d116f498704259057José Fonseca      if(srcAtt->Type == GL_TEXTURE) {
232f2bc089d148253d7a411e94257633ce40ec1c6a9Michal Krol         struct st_texture_object *srcObj =
233fdd605e446ed174bae13171d116f498704259057José Fonseca            st_texture_object(srcAtt->Texture);
234fdd605e446ed174bae13171d116f498704259057José Fonseca         struct st_renderbuffer *dstRb =
235fdd605e446ed174bae13171d116f498704259057José Fonseca            st_renderbuffer(drawFB->_ColorDrawBuffers[0]);
236fdd605e446ed174bae13171d116f498704259057José Fonseca         struct pipe_surface *dstSurf = dstRb->surface;
237fdd605e446ed174bae13171d116f498704259057José Fonseca
238fdd605e446ed174bae13171d116f498704259057José Fonseca         if (!srcObj->pt)
239ccfeb90b757ed2b2948bbe06fd4f4a15628639f9Marek Olšák            goto done;
240fdd605e446ed174bae13171d116f498704259057José Fonseca
2414c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger         util_blit_pixels(st->blit, srcObj->pt, srcAtt->TextureLevel,
2424c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          srcX0, srcY0, srcX1, srcY1,
2434c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          srcAtt->Zoffset + srcAtt->CubeMapFace,
244fdd605e446ed174bae13171d116f498704259057José Fonseca                          dstSurf, dstX0, dstY0, dstX1, dstY1,
2455ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                          0.0, pFilter, TGSI_WRITEMASK_XYZW, 0);
246fdd605e446ed174bae13171d116f498704259057José Fonseca      }
247fdd605e446ed174bae13171d116f498704259057José Fonseca      else {
248fdd605e446ed174bae13171d116f498704259057José Fonseca         struct st_renderbuffer *srcRb =
249fdd605e446ed174bae13171d116f498704259057José Fonseca            st_renderbuffer(readFB->_ColorReadBuffer);
250fdd605e446ed174bae13171d116f498704259057José Fonseca         struct st_renderbuffer *dstRb =
251fdd605e446ed174bae13171d116f498704259057José Fonseca            st_renderbuffer(drawFB->_ColorDrawBuffers[0]);
252fdd605e446ed174bae13171d116f498704259057José Fonseca         struct pipe_surface *srcSurf = srcRb->surface;
253fdd605e446ed174bae13171d116f498704259057José Fonseca         struct pipe_surface *dstSurf = dstRb->surface;
254fdd605e446ed174bae13171d116f498704259057José Fonseca
255fdd605e446ed174bae13171d116f498704259057José Fonseca         util_blit_pixels(st->blit,
2564c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          srcRb->texture, srcSurf->u.tex.level,
2574c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          srcX0, srcY0, srcX1, srcY1,
2584c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          srcSurf->u.tex.first_layer,
259fdd605e446ed174bae13171d116f498704259057José Fonseca                          dstSurf, dstX0, dstY0, dstX1, dstY1,
2605ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                          0.0, pFilter, TGSI_WRITEMASK_XYZW, 0);
261fdd605e446ed174bae13171d116f498704259057José Fonseca      }
262a59579c983df651373435791f8f4fd249293b344Brian Paul   }
26384836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
264a59579c983df651373435791f8f4fd249293b344Brian Paul   if (mask & depthStencil) {
265a59579c983df651373435791f8f4fd249293b344Brian Paul      /* depth and/or stencil blit */
266a59579c983df651373435791f8f4fd249293b344Brian Paul
267a59579c983df651373435791f8f4fd249293b344Brian Paul      /* get src/dst depth surfaces */
26836e523f4a3383bc9e6170d0bc959ba9ffdb85016Marek Olšák      struct gl_renderbuffer_attachment *srcDepth =
26936e523f4a3383bc9e6170d0bc959ba9ffdb85016Marek Olšák         &readFB->Attachment[BUFFER_DEPTH];
27036e523f4a3383bc9e6170d0bc959ba9ffdb85016Marek Olšák      struct gl_renderbuffer_attachment *dstDepth =
27136e523f4a3383bc9e6170d0bc959ba9ffdb85016Marek Olšák         &drawFB->Attachment[BUFFER_DEPTH];
27236e523f4a3383bc9e6170d0bc959ba9ffdb85016Marek Olšák      struct gl_renderbuffer_attachment *srcStencil =
27336e523f4a3383bc9e6170d0bc959ba9ffdb85016Marek Olšák         &readFB->Attachment[BUFFER_STENCIL];
27436e523f4a3383bc9e6170d0bc959ba9ffdb85016Marek Olšák      struct gl_renderbuffer_attachment *dstStencil =
27536e523f4a3383bc9e6170d0bc959ba9ffdb85016Marek Olšák         &drawFB->Attachment[BUFFER_STENCIL];
27636e523f4a3383bc9e6170d0bc959ba9ffdb85016Marek Olšák
27736e523f4a3383bc9e6170d0bc959ba9ffdb85016Marek Olšák      struct st_renderbuffer *srcDepthRb =
278a59579c983df651373435791f8f4fd249293b344Brian Paul         st_renderbuffer(readFB->Attachment[BUFFER_DEPTH].Renderbuffer);
279a59579c983df651373435791f8f4fd249293b344Brian Paul      struct st_renderbuffer *dstDepthRb =
280a59579c983df651373435791f8f4fd249293b344Brian Paul         st_renderbuffer(drawFB->Attachment[BUFFER_DEPTH].Renderbuffer);
281a59579c983df651373435791f8f4fd249293b344Brian Paul      struct pipe_surface *dstDepthSurf =
282a59579c983df651373435791f8f4fd249293b344Brian Paul         dstDepthRb ? dstDepthRb->surface : NULL;
283a59579c983df651373435791f8f4fd249293b344Brian Paul
2845ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák      struct st_renderbuffer *srcStencilRb =
2855ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák         st_renderbuffer(readFB->Attachment[BUFFER_STENCIL].Renderbuffer);
2865ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák      struct st_renderbuffer *dstStencilRb =
2875ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák         st_renderbuffer(drawFB->Attachment[BUFFER_STENCIL].Renderbuffer);
2885ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák      struct pipe_surface *dstStencilSurf =
2895ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák         dstStencilRb ? dstStencilRb->surface : NULL;
2905ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák
291a59579c983df651373435791f8f4fd249293b344Brian Paul      if ((mask & depthStencil) == depthStencil &&
29236e523f4a3383bc9e6170d0bc959ba9ffdb85016Marek Olšák          st_is_depth_stencil_combined(srcDepth, srcStencil) &&
29336e523f4a3383bc9e6170d0bc959ba9ffdb85016Marek Olšák          st_is_depth_stencil_combined(dstDepth, dstStencil)) {
294f2bc089d148253d7a411e94257633ce40ec1c6a9Michal Krol
295a59579c983df651373435791f8f4fd249293b344Brian Paul         /* Blitting depth and stencil values between combined
296a59579c983df651373435791f8f4fd249293b344Brian Paul          * depth/stencil buffers.  This is the ideal case for such buffers.
297a59579c983df651373435791f8f4fd249293b344Brian Paul          */
2984c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger         util_blit_pixels(st->blit,
2994c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          srcDepthRb->texture,
3004c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          srcDepthRb->surface->u.tex.level,
30136e523f4a3383bc9e6170d0bc959ba9ffdb85016Marek Olšák                          srcX0, srcY0, srcX1, srcY1,
3024c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                          srcDepthRb->surface->u.tex.first_layer,
303a59579c983df651373435791f8f4fd249293b344Brian Paul                          dstDepthSurf, dstX0, dstY0, dstX1, dstY1,
3045ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                          0.0, pFilter, 0,
3055ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                          BLIT_WRITEMASK_Z |
3065ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                          (st->has_stencil_export ? BLIT_WRITEMASK_STENCIL
3075ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                                                  : 0));
3085ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák
3095ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák         if (!st->has_stencil_export) {
3105ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák            _mesa_problem(ctx, "st_BlitFramebuffer(STENCIL) "
3115ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                               "software fallback not implemented");
3125ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák         }
313a59579c983df651373435791f8f4fd249293b344Brian Paul      }
314a59579c983df651373435791f8f4fd249293b344Brian Paul      else {
315a59579c983df651373435791f8f4fd249293b344Brian Paul         /* blitting depth and stencil separately */
316a59579c983df651373435791f8f4fd249293b344Brian Paul
317a59579c983df651373435791f8f4fd249293b344Brian Paul         if (mask & GL_DEPTH_BUFFER_BIT) {
318cfc4d866566c5b2d584cdc998e6540733190ea05Marek Olšák            util_blit_pixels(st->blit, srcDepthRb->texture,
3194c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                             srcDepthRb->surface->u.tex.level,
320cfc4d866566c5b2d584cdc998e6540733190ea05Marek Olšák                             srcX0, srcY0, srcX1, srcY1,
3214c7001462607e6e99e474d6271dd481d3f8f201cRoland Scheidegger                             srcDepthRb->surface->u.tex.first_layer,
322cfc4d866566c5b2d584cdc998e6540733190ea05Marek Olšák                             dstDepthSurf, dstX0, dstY0, dstX1, dstY1,
3235ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                             0.0, pFilter, 0, BLIT_WRITEMASK_Z);
324a59579c983df651373435791f8f4fd249293b344Brian Paul         }
325a59579c983df651373435791f8f4fd249293b344Brian Paul
326a59579c983df651373435791f8f4fd249293b344Brian Paul         if (mask & GL_STENCIL_BUFFER_BIT) {
3275ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák            if (st->has_stencil_export) {
3285ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák               util_blit_pixels(st->blit, srcStencilRb->texture,
3295ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                                srcStencilRb->surface->u.tex.level,
3305ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                                srcX0, srcY0, srcX1, srcY1,
3315ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                                srcStencilRb->surface->u.tex.first_layer,
3325ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                                dstStencilSurf, dstX0, dstY0, dstX1, dstY1,
3335ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                                0.0, pFilter, 0, BLIT_WRITEMASK_STENCIL);
3345ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák            }
3355ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák            else {
3365ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák               _mesa_problem(ctx, "st_BlitFramebuffer(STENCIL) "
3375ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák                                  "software fallback not implemented");
3385ba15d8d38d98cb7b625fa55e7d818ef9c6629ceMarek Olšák            }
339a59579c983df651373435791f8f4fd249293b344Brian Paul         }
340a59579c983df651373435791f8f4fd249293b344Brian Paul      }
34184836ffce1ca322f91aaae25c4de2be20e55a4b5Brian   }
342ccfeb90b757ed2b2948bbe06fd4f4a15628639f9Marek Olšák
343ccfeb90b757ed2b2948bbe06fd4f4a15628639f9Marek Olšákdone:
344ccfeb90b757ed2b2948bbe06fd4f4a15628639f9Marek Olšák   /* Restore conditional rendering state. */
345ccfeb90b757ed2b2948bbe06fd4f4a15628639f9Marek Olšák   if (st->render_condition) {
346ccfeb90b757ed2b2948bbe06fd4f4a15628639f9Marek Olšák      st->pipe->render_condition(st->pipe, st->render_condition,
347ccfeb90b757ed2b2948bbe06fd4f4a15628639f9Marek Olšák                                 st->condition_mode);
348ccfeb90b757ed2b2948bbe06fd4f4a15628639f9Marek Olšák   }
34984836ffce1ca322f91aaae25c4de2be20e55a4b5Brian}
35084836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
35184836ffce1ca322f91aaae25c4de2be20e55a4b5Brian
35284836ffce1ca322f91aaae25c4de2be20e55a4b5Brianvoid
35384836ffce1ca322f91aaae25c4de2be20e55a4b5Brianst_init_blit_functions(struct dd_function_table *functions)
35484836ffce1ca322f91aaae25c4de2be20e55a4b5Brian{
35584836ffce1ca322f91aaae25c4de2be20e55a4b5Brian   functions->BlitFramebuffer = st_BlitFramebuffer;
35684836ffce1ca322f91aaae25c4de2be20e55a4b5Brian}
357e76e17d569af924e187fa22facfb968667854ceaChia-I Wu
358e76e17d569af924e187fa22facfb968667854ceaChia-I Wu#endif /* FEATURE_EXT_framebuffer_blit */
359