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