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