15738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project/************************************************************************** 25738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 35738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Copyright 2003 Tungsten Graphics, Inc., Cedar Park, Texas. 45738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * All Rights Reserved. 55738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 65738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * Permission is hereby granted, free of charge, to any person obtaining a 75738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * copy of this software and associated documentation files (the 85738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * "Software"), to deal in the Software without restriction, including 95738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * without limitation the rights to use, copy, modify, merge, publish, 105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * distribute, sub license, and/or sell copies of the Software, and to 115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * permit persons to whom the Software is furnished to do so, subject to 125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * the following conditions: 135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * The above copyright notice and this permission notice (including the 155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * next paragraph) shall be included in all copies or substantial portions 165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * of the Software. 175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. 215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR 225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, 235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project * 265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project **************************************************************************/ 275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "main/mtypes.h" 295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "main/enums.h" 305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "main/image.h" 315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "main/teximage.h" 325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "main/texstate.h" 335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "main/fbobject.h" 345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "drivers/common/meta.h" 365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "intel_screen.h" 385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "intel_context.h" 395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "intel_mipmap_tree.h" 405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "intel_regions.h" 415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "intel_fbo.h" 425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "intel_tex.h" 435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#include "intel_blit.h" 445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project#define FILE_DEBUG_FLAG DEBUG_TEXTURE 465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectbool 495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectintel_copy_texsubimage(struct intel_context *intel, 505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct intel_texture_image *intelImage, 515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GLint dstx, GLint dsty, 525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct intel_renderbuffer *irb, 535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GLint x, GLint y, GLsizei width, GLsizei height) 545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct gl_context *ctx = &intel->ctx; 565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct intel_region *region; 575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project const GLenum internalFormat = intelImage->base.Base.InternalFormat; 585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bool copy_supported = false; 595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project bool copy_supported_with_alpha_override = false; 605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project intel_prepare_render(intel); 625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!intelImage->mt || !irb || !irb->mt) { 645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (unlikely(INTEL_DEBUG & DEBUG_PERF)) 655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fprintf(stderr, "%s fail %p %p (0x%08x)\n", 665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project __FUNCTION__, intelImage->mt, irb, internalFormat); 675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return false; 685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } else { 695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project region = irb->mt->region; 705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project assert(region); 715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 735738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project copy_supported = intelImage->base.Base.TexFormat == intel_rb_format(irb); 745738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 755738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Converting ARGB8888 to XRGB8888 is trivial: ignore the alpha bits */ 765738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (intel_rb_format(irb) == MESA_FORMAT_ARGB8888 && 775738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project intelImage->base.Base.TexFormat == MESA_FORMAT_XRGB8888) { 785738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project copy_supported = true; 795738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 805738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 815738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Converting XRGB8888 to ARGB8888 requires setting the alpha bits to 1.0 */ 825738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (intel_rb_format(irb) == MESA_FORMAT_XRGB8888 && 835738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project intelImage->base.Base.TexFormat == MESA_FORMAT_ARGB8888) { 845738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project copy_supported_with_alpha_override = true; 855738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 865738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 875738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!copy_supported && !copy_supported_with_alpha_override) { 885738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (unlikely(INTEL_DEBUG & DEBUG_PERF)) 895738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fprintf(stderr, "%s mismatched formats %s, %s\n", 905738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project __FUNCTION__, 915738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project _mesa_get_format_name(intelImage->base.Base.TexFormat), 925738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project _mesa_get_format_name(intel_rb_format(irb))); 935738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return false; 945738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 955738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 965738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project { 975738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GLuint image_x, image_y; 985738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GLshort src_pitch; 995738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1005738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* get dest x/y in destination texture */ 1015738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project intel_miptree_get_image_offset(intelImage->mt, 1025738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project intelImage->base.Base.Level, 1035738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project intelImage->base.Base.Face, 1045738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, 1055738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project &image_x, &image_y); 1065738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1075738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* The blitter can't handle Y-tiled buffers. */ 1085738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (intelImage->mt->region->tiling == I915_TILING_Y) { 1095738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return false; 1105738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1115738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1125738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (_mesa_is_winsys_fbo(ctx->ReadBuffer)) { 1135738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* Flip vertical orientation for system framebuffers */ 1145738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project y = ctx->ReadBuffer->Height - (y + height); 1155738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_pitch = -region->pitch; 1165738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } else { 1175738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* reading from a FBO, y is already oriented the way we like */ 1185738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_pitch = region->pitch; 1195738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1205738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1215738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project /* blit from src buffer to texture */ 1225738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (!intelEmitCopyBlit(intel, 1235738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project intelImage->mt->cpp, 1245738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project src_pitch, 1255738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project region->bo, 1265738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, 1275738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project region->tiling, 1285738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project intelImage->mt->region->pitch, 1295738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project intelImage->mt->region->bo, 1305738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 0, 1315738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project intelImage->mt->region->tiling, 1325738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project irb->draw_x + x, irb->draw_y + y, 1335738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project image_x + dstx, image_y + dsty, 1345738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project width, height, 1355738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GL_COPY)) { 1365738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return false; 1375738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1385738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1395738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1405738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (copy_supported_with_alpha_override) 1415738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project intel_set_teximage_alpha_to_one(ctx, intelImage); 1425738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1435738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project return true; 1445738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1455738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1465738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1475738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectstatic void 1485738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectintelCopyTexSubImage(struct gl_context *ctx, GLuint dims, 1495738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct gl_texture_image *texImage, 1505738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GLint xoffset, GLint yoffset, GLint zoffset, 1515738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project struct gl_renderbuffer *rb, 1525738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GLint x, GLint y, 1535738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project GLsizei width, GLsizei height) 1545738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1555738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project if (dims == 3 || !intel_copy_texsubimage(intel_context(ctx), 1565738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project intel_texture_image(texImage), 1575738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project xoffset, yoffset, 1585738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project intel_renderbuffer(rb), x, y, width, height)) { 1595738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project fallback_debug("%s - fallback to swrast\n", __FUNCTION__); 1605738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project _mesa_meta_CopyTexSubImage(ctx, dims, texImage, 1615738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project xoffset, yoffset, zoffset, 1625738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project rb, x, y, width, height); 1635738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project } 1645738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1655738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1665738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project 1675738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Projectvoid 1685738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source ProjectintelInitTextureCopyImageFuncs(struct dd_function_table *functions) 1695738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project{ 1705738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project functions->CopyTexSubImage = intelCopyTexSubImage; 1715738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project} 1725738f83aeb59361a0a2eda2460113f6dc919427The Android Open Source Project