1aa1a5c0c9e0de71ecd15e7190c121d6dd98471a6Ian Romanick/*
2877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * Copyright 2003 VMware, Inc.
33dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * All Rights Reserved.
4a7bdd4cba8ddcab8dff59ecaaa7efbd436c6c307Kenneth Graunke *
53dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * Permission is hereby granted, free of charge, to any person obtaining a
63dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * copy of this software and associated documentation files (the
73dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * "Software"), to deal in the Software without restriction, including
83dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * without limitation the rights to use, copy, modify, merge, publish,
9284dcad20a9a55278c1d3dd98f53e45650b22896Ian Romanick * distribute, sublicense, and/or sell copies of the Software, and to
103dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * permit persons to whom the Software is furnished to do so, subject to
113dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * the following conditions:
12a7bdd4cba8ddcab8dff59ecaaa7efbd436c6c307Kenneth Graunke *
133dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * The above copyright notice and this permission notice (including the
143dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * next paragraph) shall be included in all copies or substantial portions
153dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * of the Software.
16a7bdd4cba8ddcab8dff59ecaaa7efbd436c6c307Kenneth Graunke *
173dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
183dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
19284dcad20a9a55278c1d3dd98f53e45650b22896Ian Romanick * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
20877128505431adaf817dc8069172ebe4a1cdf5d8José Fonseca * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
213dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
223dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
233dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
24aa1a5c0c9e0de71ecd15e7190c121d6dd98471a6Ian Romanick */
253dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
263dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt#include "main/image.h"
273dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt#include "main/state.h"
283dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt#include "main/mtypes.h"
293dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt#include "main/condrender.h"
303dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt#include "main/fbobject.h"
313dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt#include "drivers/common/meta.h"
323dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
33a69274454b6bde265a910ca5bd3199217431f5b5Kenneth Graunke#include "brw_context.h"
343dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt#include "intel_buffers.h"
353dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt#include "intel_mipmap_tree.h"
363dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt#include "intel_pixel.h"
373dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt#include "intel_fbo.h"
383dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt#include "intel_blit.h"
396404fcb266753a2fd8243210b3553bfe846ce104Eric Anholt#include "intel_batchbuffer.h"
403dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
413dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt#define FILE_DEBUG_FLAG DEBUG_PIXEL
423dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
433dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt/**
443dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt * CopyPixels with the blitter.  Don't support zooming, pixel transfer, etc.
453dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt */
463dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholtstatic bool
473dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholtdo_blit_copypixels(struct gl_context * ctx,
483dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt                   GLint srcx, GLint srcy,
493dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt                   GLsizei width, GLsizei height,
503dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt                   GLint dstx, GLint dsty, GLenum type)
513dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt{
52ca437579b3974b91a5298707c459908a628c1098Kenneth Graunke   struct brw_context *brw = brw_context(ctx);
533dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   struct gl_framebuffer *fb = ctx->DrawBuffer;
543dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   struct gl_framebuffer *read_fb = ctx->ReadBuffer;
553dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   GLint orig_dstx;
563dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   GLint orig_dsty;
573dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   GLint orig_srcx;
583dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   GLint orig_srcy;
593dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   struct intel_renderbuffer *draw_irb = NULL;
603dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   struct intel_renderbuffer *read_irb = NULL;
613dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
623dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   /* Update draw buffer bounds */
633dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   _mesa_update_state(ctx);
643dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
6544338cd826623ae0675861015a56c528261f3fd3Kristian Høgsberg   intel_prepare_render(brw);
6644338cd826623ae0675861015a56c528261f3fd3Kristian Høgsberg
673dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   switch (type) {
683dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   case GL_COLOR:
693dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      if (fb->_NumColorDrawBuffers != 1) {
703dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt	 perf_debug("glCopyPixels() fallback: MRT\n");
713dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt	 return false;
723dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      }
733dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
743dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      draw_irb = intel_renderbuffer(fb->_ColorDrawBuffers[0]);
753dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      read_irb = intel_renderbuffer(read_fb->_ColorReadBuffer);
763dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      break;
773dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   case GL_DEPTH_STENCIL_EXT:
783dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      draw_irb = intel_renderbuffer(fb->Attachment[BUFFER_DEPTH].Renderbuffer);
793dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      read_irb =
803dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt	 intel_renderbuffer(read_fb->Attachment[BUFFER_DEPTH].Renderbuffer);
813dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      break;
823dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   case GL_DEPTH:
833dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      perf_debug("glCopyPixels() fallback: GL_DEPTH\n");
843dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return false;
853dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   case GL_STENCIL:
863dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      perf_debug("glCopyPixels() fallback: GL_STENCIL\n");
873dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return false;
883dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   default:
893dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      perf_debug("glCopyPixels(): Unknown type\n");
903dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return false;
913dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   }
923dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
933dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (!draw_irb) {
943dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      perf_debug("glCopyPixels() fallback: missing draw buffer\n");
953dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return false;
963dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   }
973dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
983dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (!read_irb) {
993dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      perf_debug("glCopyPixels() fallback: missing read buffer\n");
1003dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return false;
1013dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   }
1023dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
103f416a15096c0984dce689681a004554ecb2ea728Paul Berry   if (draw_irb->mt->num_samples > 1 || read_irb->mt->num_samples > 1) {
104f416a15096c0984dce689681a004554ecb2ea728Paul Berry      perf_debug("glCopyPixels() fallback: multisampled buffers\n");
105f416a15096c0984dce689681a004554ecb2ea728Paul Berry      return false;
106f416a15096c0984dce689681a004554ecb2ea728Paul Berry   }
107f416a15096c0984dce689681a004554ecb2ea728Paul Berry
1083dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (ctx->_ImageTransferState) {
1093dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      perf_debug("glCopyPixels(): Unsupported image transfer state\n");
1103dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return false;
1113dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   }
1123dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
1133dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (ctx->Depth.Test) {
1143dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      perf_debug("glCopyPixels(): Unsupported depth test state\n");
1153dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return false;
1163dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   }
1173dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
1183dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (ctx->Stencil._Enabled) {
1193dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      perf_debug("glCopyPixels(): Unsupported stencil test state\n");
1203dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return false;
1213dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   }
1223dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
1233dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (ctx->Fog.Enabled ||
124c703658b3965bf2e4f3593a0d54be03e8e8b1436Eric Anholt       ctx->Texture._MaxEnabledTexImageUnit != -1 ||
1253dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt       ctx->FragmentProgram._Enabled) {
1263dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      perf_debug("glCopyPixels(): Unsupported fragment shader state\n");
1273dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return false;
1283dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   }
1293dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
1303dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (ctx->Color.AlphaEnabled ||
1313dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt       ctx->Color.BlendEnabled) {
1323dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      perf_debug("glCopyPixels(): Unsupported blend state\n");
1333dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return false;
1343dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   }
1353dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
1363dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (!ctx->Color.ColorMask[0][0] ||
1373dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt       !ctx->Color.ColorMask[0][1] ||
1383dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt       !ctx->Color.ColorMask[0][2] ||
1393dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt       !ctx->Color.ColorMask[0][3]) {
1403dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      perf_debug("glCopyPixels(): Unsupported color mask state\n");
1413dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return false;
1423dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   }
1433dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
1443dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (ctx->Pixel.ZoomX != 1.0F || ctx->Pixel.ZoomY != 1.0F) {
145ee4676aa57a0b1d4ac7e2f30fd45c36807fe35eaIan Romanick      perf_debug("glCopyPixels(): Unsupported pixel zoom\n");
1463dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return false;
1473dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   }
1483dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
1496404fcb266753a2fd8243210b3553bfe846ce104Eric Anholt   intel_batchbuffer_flush(brw);
1503dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
1513dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   /* Clip to destination buffer. */
1523dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   orig_dstx = dstx;
1533dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   orig_dsty = dsty;
1543dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (!_mesa_clip_to_region(fb->_Xmin, fb->_Ymin,
1553dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt			     fb->_Xmax, fb->_Ymax,
1563dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt			     &dstx, &dsty, &width, &height))
1573dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      goto out;
1583dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   /* Adjust src coords for our post-clipped destination origin */
1593dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   srcx += dstx - orig_dstx;
1603dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   srcy += dsty - orig_dsty;
1613dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
1623dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   /* Clip to source buffer. */
1633dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   orig_srcx = srcx;
1643dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   orig_srcy = srcy;
1653dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (!_mesa_clip_to_region(0, 0,
1663dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt			     read_fb->Width, read_fb->Height,
1673dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt			     &srcx, &srcy, &width, &height))
1683dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      goto out;
1693dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   /* Adjust dst coords for our post-clipped source origin */
1703dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   dstx += srcx - orig_srcx;
1713dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   dsty += srcy - orig_srcy;
1723dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
173ca437579b3974b91a5298707c459908a628c1098Kenneth Graunke   if (!intel_miptree_blit(brw,
1743dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt                           read_irb->mt, read_irb->mt_level, read_irb->mt_layer,
1753dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt                           srcx, srcy, _mesa_is_winsys_fbo(read_fb),
1763dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt                           draw_irb->mt, draw_irb->mt_level, draw_irb->mt_layer,
1773dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt                           dstx, dsty, _mesa_is_winsys_fbo(fb),
1783dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt                           width, height,
1793dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt                           (ctx->Color.ColorLogicOpEnabled ?
1803dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt                            ctx->Color.LogicOp : GL_COPY))) {
18128d9e90428282a5e0a6aa31ad858a5cf514d1264Marius Predut      DBG("%s: blit failure\n", __func__);
1823dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return false;
1833dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   }
1843dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
1853dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (ctx->Query.CurrentOcclusionObject)
1863dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      ctx->Query.CurrentOcclusionObject->Result += width * height;
1873dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
1883dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholtout:
1893dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
19028d9e90428282a5e0a6aa31ad858a5cf514d1264Marius Predut   DBG("%s: success\n", __func__);
1913dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   return true;
1923dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt}
1933dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
1943dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
1953dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholtvoid
1963dbba95b72262344b82fba018b7c2c1208754cd2Eric AnholtintelCopyPixels(struct gl_context * ctx,
1973dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt                GLint srcx, GLint srcy,
1983dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt                GLsizei width, GLsizei height,
1993dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt                GLint destx, GLint desty, GLenum type)
2003dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt{
20128d9e90428282a5e0a6aa31ad858a5cf514d1264Marius Predut   DBG("%s\n", __func__);
2023dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
2033dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (!_mesa_check_conditional_render(ctx))
2043dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return;
2053dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
2063dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   if (do_blit_copypixels(ctx, srcx, srcy, width, height, destx, desty, type))
2073dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt      return;
2083dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt
2093dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   /* this will use swrast if needed */
2103dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt   _mesa_meta_CopyPixels(ctx, srcx, srcy, width, height, destx, desty, type);
2113dbba95b72262344b82fba018b7c2c1208754cd2Eric Anholt}
212