1333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner/* 2333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner * Copyright (C) 2009 Maciej Cencora <m.cencora@gmail.com> 3333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner * 4333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner * All Rights Reserved. 54ee451de366474b9c228b4e5fa573795a715216dChris Lattner * 64ee451de366474b9c228b4e5fa573795a715216dChris Lattner * Permission is hereby granted, free of charge, to any person obtaining 7333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner * a copy of this software and associated documentation files (the 8333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner * "Software"), to deal in the Software without restriction, including 9333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner * without limitation the rights to use, copy, modify, merge, publish, 10333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner * distribute, sublicense, and/or sell copies of the Software, and to 11333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner * permit persons to whom the Software is furnished to do so, subject to 12333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner * the following conditions: 13333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner * 14333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner * The above copyright notice and this permission notice (including the 1511da4cf25c3de590ecf434316973e9f25eec34c3Chris Lattner * next paragraph) shall be included in all copies or substantial 165745fbce1674b29f4dce6b6e31556c4c1e83dc89Benjamin Kramer * portions of the Software. 17c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines * 181f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 193f85144a8958ef2365e7a145859a26f870ba8445Kaelyn Uhrain * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 211f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer * IN NO EVENT SHALL THE COPYRIGHT OWNER(S) AND/OR ITS SUPPLIERS BE 221f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 231f6efa3996dd1929fbc129203ce5009b620e6969Michael J. Spencer * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 249bc406019ef8e8c682afc10c46a9c4d4d6840d42Jeff Cohen * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth * 26333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner */ 27476b242fe7a61e5f9ac6214b0bc5c680d24f152eNick Lewycky 28d04a8d4b33ff316ca4cf961e06c9e312eff8e64fChandler Carruth#include "radeon_common.h" 29c6a4f5e819217e1e12c458aed8e7b122e23a3a58Stephen Hines#include "radeon_texture.h" 3011da4cf25c3de590ecf434316973e9f25eec34c3Chris Lattner 3111da4cf25c3de590ecf434316973e9f25eec34c3Chris Lattner#include "main/enums.h" 3211da4cf25c3de590ecf434316973e9f25eec34c3Chris Lattner#include "main/image.h" 3311da4cf25c3de590ecf434316973e9f25eec34c3Chris Lattner#include "main/teximage.h" 3411da4cf25c3de590ecf434316973e9f25eec34c3Chris Lattner#include "main/texstate.h" 35333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner#include "drivers/common/meta.h" 36333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 37333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner#include "radeon_mipmap_tree.h" 38333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 39333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattnerstatic GLboolean 40333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattnerdo_copy_texsubimage(struct gl_context *ctx, 41d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer struct radeon_tex_obj *tobj, 42333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner radeon_texture_image *timg, 43333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner GLint dstx, GLint dsty, 44333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner struct radeon_renderbuffer *rrb, 45f7fdad15d910fc27bc9334faab5b71c101455e1aRafael Espindola GLint x, GLint y, 46f7fdad15d910fc27bc9334faab5b71c101455e1aRafael Espindola GLsizei width, GLsizei height) 4749ab1207df3d7d5a4bb3b3e3dcc611e78d262714Rafael Espindola{ 48f7fdad15d910fc27bc9334faab5b71c101455e1aRafael Espindola radeonContextPtr radeon = RADEON_CONTEXT(ctx); 49333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner const GLuint face = timg->base.Base.Face; 50333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner const GLuint level = timg->base.Base.Level; 51333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner unsigned src_bpp; 52333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner unsigned dst_bpp; 53333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner mesa_format src_mesaformat; 54333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner mesa_format dst_mesaformat; 55333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner unsigned flip_y; 56333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 57d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer if (!radeon->vtbl.blit) { 58d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer return GL_FALSE; 59d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer } 60f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar 61f3ef5332fa3f4d5ec72c178a2b19dac363a19383Pirama Arumuga Nainar // This is software renderbuffer, fallback to swrast 62d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer if (!rrb) { 63d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer return GL_FALSE; 64d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer } 65ddcc82b871e2033ed3e566be8e7303aac5cde471Benjamin Kramer 66cc189bfb08864ef615e5dc48476b992b81f29167Michael J. Spencer if (_mesa_get_format_bits(timg->base.Base.TexFormat, GL_DEPTH_BITS) > 0) { 6737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /* copying depth values */ 6837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines flip_y = ctx->ReadBuffer->Attachment[BUFFER_DEPTH].Type == GL_NONE; 69cc189bfb08864ef615e5dc48476b992b81f29167Michael J. Spencer } else { 70ddcc82b871e2033ed3e566be8e7303aac5cde471Benjamin Kramer /* copying color */ 71cc189bfb08864ef615e5dc48476b992b81f29167Michael J. Spencer flip_y = ctx->ReadBuffer->Attachment[BUFFER_COLOR0].Type == GL_NONE; 72cc189bfb08864ef615e5dc48476b992b81f29167Michael J. Spencer } 7337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 7437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (!timg->mt) { 7537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines radeon_validate_texture_miptree(ctx, &tobj->base.Sampler, &tobj->base); 7637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 7737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 78cc189bfb08864ef615e5dc48476b992b81f29167Michael J. Spencer assert(rrb->bo); 79d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer assert(timg->mt); 80d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer assert(timg->mt->bo); 81333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner assert(timg->base.Base.Width >= dstx + width); 82d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer assert(timg->base.Base.Height >= dsty + height); 83333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 84333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner intptr_t src_offset = rrb->draw_offset; 85f7fdad15d910fc27bc9334faab5b71c101455e1aRafael Espindola intptr_t dst_offset = radeon_miptree_image_offset(timg->mt, face, level); 86f7fdad15d910fc27bc9334faab5b71c101455e1aRafael Espindola 87333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner if (0) { 88d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer fprintf(stderr, "%s: copying to face %d, level %d\n", 89de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar __func__, face, level); 90de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar fprintf(stderr, "to: x %d, y %d, offset %d\n", dstx, dsty, (uint32_t) dst_offset); 91de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar fprintf(stderr, "from (%dx%d) width %d, height %d, offset %d, pitch %d\n", 92de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar x, y, rrb->base.Base.Width, rrb->base.Base.Height, (uint32_t) src_offset, rrb->pitch/rrb->cpp); 9336b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines fprintf(stderr, "src size %d, dst size %d\n", rrb->bo->size, timg->mt->bo->size); 94d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer 95d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer } 96333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner 97a96a1824747632ce87ef065b4a13fb777d2b14d6Craig Topper src_mesaformat = rrb->base.Base.Format; 9836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines dst_mesaformat = timg->base.Base.TexFormat; 995d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek src_bpp = _mesa_get_format_bytes(src_mesaformat); 1005d86759e0ff44e07ead4982673fe10abec50f765Ted Kremenek dst_bpp = _mesa_get_format_bytes(dst_mesaformat); 101333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner if (!radeon->vtbl.check_blit(dst_mesaformat, rrb->pitch / rrb->cpp)) { 102333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner /* depth formats tend to be special */ 103333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner if (_mesa_get_format_bits(dst_mesaformat, GL_DEPTH_BITS) > 0) 10437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return GL_FALSE; 10537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 10637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines if (src_bpp != dst_bpp) 10737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return GL_FALSE; 10837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 10937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines switch (dst_bpp) { 11037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case 2: 11137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines src_mesaformat = MESA_FORMAT_B5G6R5_UNORM; 112cc189bfb08864ef615e5dc48476b992b81f29167Michael J. Spencer dst_mesaformat = MESA_FORMAT_B5G6R5_UNORM; 11337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines break; 11437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case 4: 11537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines src_mesaformat = MESA_FORMAT_B8G8R8A8_UNORM; 11637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines dst_mesaformat = MESA_FORMAT_B8G8R8A8_UNORM; 11737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines break; 11837ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines case 1: 11937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines src_mesaformat = MESA_FORMAT_A_UNORM8; 120333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner dst_mesaformat = MESA_FORMAT_A_UNORM8; 121333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner break; 12237ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines default: 12337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines return GL_FALSE; 12437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 12537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 12637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 12737ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines /* blit from src buffer to texture */ 128d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer return radeon->vtbl.blit(ctx, rrb->bo, src_offset, src_mesaformat, rrb->pitch/rrb->cpp, 129d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer rrb->base.Base.Width, rrb->base.Base.Height, x, y, 130d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer timg->mt->bo, dst_offset, dst_mesaformat, 1313daae2701b76293c31c1cbdafc9782352321e1f0Chris Lattner timg->mt->levels[level].rowstride / dst_bpp, 1323daae2701b76293c31c1cbdafc9782352321e1f0Chris Lattner timg->base.Base.Width, timg->base.Base.Height, 13337ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines dstx, dsty, width, height, flip_y); 13437ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 135d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer 136d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramervoid 13736b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen HinesradeonCopyTexSubImage(struct gl_context *ctx, GLuint dims, 13836b56886974eae4f9c5ebc96befd3e7bfe5de338Stephen Hines struct gl_texture_image *texImage, 13937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines GLint xoffset, GLint yoffset, GLint slice, 14037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines struct gl_renderbuffer *rb, 141d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer GLint x, GLint y, 142de2d8694e25a814696358e95141f4b1aa4d8847ePirama Arumuga Nainar GLsizei width, GLsizei height) 143d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer{ 144d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer radeonContextPtr radeon = RADEON_CONTEXT(ctx); 14537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines radeon_prepare_render(radeon); 14637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 147d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer if (slice != 0 || !do_copy_texsubimage(ctx, 148d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer radeon_tex_obj(texImage->TexObject), 14937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines (radeon_texture_image *)texImage, 150d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer xoffset, yoffset, 151d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer radeon_renderbuffer(rb), x, y, width, height)) { 152d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer 153d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer radeon_print(RADEON_FALLBACKS, RADEON_NORMAL, 154d4d1f85aa751cadf69768746afd2c6c43c116ac2Benjamin Kramer "Falling back to sw for glCopyTexSubImage2D\n"); 15537ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines 15637ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines _mesa_meta_CopyTexSubImage(ctx, dims, texImage, 157333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner xoffset, yoffset, slice, 158333ffd4abfcc3be32a945dc73c81adeafde1ba6bChris Lattner rb, x, y, width, height); 15937ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines } 16037ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines} 16137ed9c199ca639565f6ce88105f9e39e898d82d0Stephen Hines