texstore.c revision 9fc7fa0a4cbe9dc8faa124744f623491fa754bd7
18e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 28e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Mesa 3-D graphics library 3a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul * Version: 7.5 48e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * 5501338d70e96e0388fd5198625d856c4ec07745fBrian Paul * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul * Copyright (c) 2008-2009 VMware, Inc. 78e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * 88e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 98e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * copy of this software and associated documentation files (the "Software"), 108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * to deal in the Software without restriction, including without limitation 118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense, 128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * and/or sell copies of the Software, and to permit persons to whom the 138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Software is furnished to do so, subject to the following conditions: 148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * 158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * The above copyright notice and this permission notice shall be included 168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * in all copies or substantial portions of the Software. 178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * 188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Authors: 288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Brian Paul 298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 31248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 3289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * The GL texture image functions in teximage.c basically just do 3389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * error checking and data structure allocation. They in turn call 3489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * device driver functions which actually copy/convert/store the user's 3589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * texture image data. 3689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * 3789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * However, most device drivers will be able to use the fallback functions 3889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * in this file. That is, most drivers will have the following bit of 3989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * code: 4089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * ctx->Driver.TexImage1D = _mesa_store_teximage1d; 4189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * ctx->Driver.TexImage2D = _mesa_store_teximage2d; 4289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * ctx->Driver.TexImage3D = _mesa_store_teximage3d; 4389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * etc... 4489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * 4589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Texture image processing is actually kind of complicated. We have to do: 4689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Format/type conversions 4789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * pixel unpacking 48a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt * pixel transfer (scale, bais, lookup, etc) 4989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * 5089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * These functions can handle most everything, including processing full 5189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * images and sub-images. 5289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 5389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 5489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 553c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "glheader.h" 567a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul#include "bufferobj.h" 57e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul#include "colormac.h" 588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "image.h" 598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "macros.h" 6024edd9015951dd41898902b6c3973fe605e5871aBrian Paul#include "mipmap.h" 611c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pack.h" 623c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pack.h" 6489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul#include "texcompress.h" 65da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_fxt1.h" 66da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_s3tc.h" 678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "teximage.h" 688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h" 692e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell#include "enums.h" 708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 71248200737398a7d6403a23930a6c9d93db06b942Brian Paul 72fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum { 73fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell ZERO = 4, 74fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell ONE = 5 75fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 7671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 77248200737398a7d6403a23930a6c9d93db06b942Brian Paul 78248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 79e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul * Texture image storage function. 80e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul */ 81e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paultypedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS); 82e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul 83e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul 84e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul/** 85248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Return GL_TRUE if the given image format is one that be converted 86248200737398a7d6403a23930a6c9d93db06b942Brian Paul * to another format by swizzling. 87248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 88248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic GLboolean 89248200737398a7d6403a23930a6c9d93db06b942Brian Paulcan_swizzle(GLenum logicalBaseFormat) 9071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 9171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell switch (logicalBaseFormat) { 9271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_RGBA: 9371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_RGB: 9471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_LUMINANCE_ALPHA: 9571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_INTENSITY: 9671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_ALPHA: 9771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_LUMINANCE: 983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_RED: 993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_GREEN: 1003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BLUE: 1013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGR: 1023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGRA: 1033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_ABGR_EXT: 1045d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG: 10571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell return GL_TRUE; 10671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell default: 10771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell return GL_FALSE; 10871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 10971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell} 11071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 1113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 113fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum { 114fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_LUMINANCE = 0, 115fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_ALPHA, 116fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_INTENSITY, 117fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_LUMINANCE_ALPHA, 118fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_RGB, 119fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_RGBA, 1203aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RED, 1213aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_GREEN, 1223aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BLUE, 1233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGR, 1243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGRA, 1253aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ABGR, 1265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick IDX_RG, 127fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell MAX_IDX 128fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 129fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 1303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP1(x) MAP4(x, ZERO, ZERO, ZERO) 1313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP2(x,y) MAP4(x, y, ZERO, ZERO) 1323aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP3(x,y,z) MAP4(x, y, z, ZERO) 1333aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE } 134fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 135fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 1362e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwellstatic const struct { 1373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte format_idx; 1383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte to_rgba[6]; 1393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte from_rgba[6]; 1403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell} mappings[MAX_IDX] = 141fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{ 142fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_LUMINANCE, 1443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,0,0,ONE), 1453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0) 146fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 147fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 148fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ALPHA, 1503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, ZERO, ZERO, 0), 1513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(3) 152fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 153fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 154fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_INTENSITY, 1563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0, 0, 0, 0), 1573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0), 158fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 159fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 160fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_LUMINANCE_ALPHA, 1623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,0,0,1), 1633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP2(0,3) 164fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 165fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 166fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RGB, 1683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,ONE), 1693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP3(0,1,2) 170fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 171fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 172fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RGBA, 1743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,3), 1753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,3), 1763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RED, 1803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0, ZERO, ZERO, ONE), 1813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0), 1823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_GREEN, 1863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, 0, ZERO, ONE), 1873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(1), 1883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BLUE, 1923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, ZERO, 0, ONE), 1933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(2), 1943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGR, 1983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,ONE), 1993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP3(2,1,0) 2003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 2033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGRA, 2043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,3), 2053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,3) 2063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 2093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ABGR, 2103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(3,2,1,0), 2113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(3,2,1,0) 2123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 2145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { 2155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick IDX_RG, 2165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick MAP4(0, 1, ZERO, ONE), 2175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick MAP2(0, 1) 2185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick }, 219fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 220fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 221fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 222fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 223248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 224248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Convert a GL image format enum to an IDX_* value (see above). 225248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 226248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic int 227248200737398a7d6403a23930a6c9d93db06b942Brian Paulget_map_idx(GLenum value) 228fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{ 229fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell switch (value) { 230fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_LUMINANCE: return IDX_LUMINANCE; 231fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_ALPHA: return IDX_ALPHA; 232fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_INTENSITY: return IDX_INTENSITY; 233fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA; 234fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_RGB: return IDX_RGB; 235fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_RGBA: return IDX_RGBA; 2363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_RED: return IDX_RED; 2373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_GREEN: return IDX_GREEN; 2383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BLUE: return IDX_BLUE; 2393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGR: return IDX_BGR; 2403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGRA: return IDX_BGRA; 2413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_ABGR_EXT: return IDX_ABGR; 2425d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG: return IDX_RG; 243fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell default: 244fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell _mesa_problem(NULL, "Unexpected inFormat"); 245fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell return 0; 246fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell } 247fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell} 248fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 249f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 250f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 251f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * When promoting texture formats (see below) we need to compute the 252f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * mapping of dest components back to source components. 253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * This function does that. 254fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param inFormat the incoming format of the texture 255fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param outFormat the final texture format 256fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \return map[6] a full 6-component map 257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 2583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellstatic void 2593aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellcompute_component_mapping(GLenum inFormat, GLenum outFormat, 2603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte *map) 261f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 262248200737398a7d6403a23930a6c9d93db06b942Brian Paul const int inFmt = get_map_idx(inFormat); 263248200737398a7d6403a23930a6c9d93db06b942Brian Paul const int outFmt = get_map_idx(outFormat); 264248200737398a7d6403a23930a6c9d93db06b942Brian Paul const GLubyte *in2rgba = mappings[inFmt].to_rgba; 265248200737398a7d6403a23930a6c9d93db06b942Brian Paul const GLubyte *rgba2out = mappings[outFmt].from_rgba; 2663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell int i; 2672e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell 2683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell for (i = 0; i < 4; i++) 2693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[i] = in2rgba[rgba2out[i]]; 2703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[ZERO] = ZERO; 2723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[ONE] = ONE; 2733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2746b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#if 0 275298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n", 276298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inFormat, _mesa_lookup_enum_by_nr(inFormat), 277298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg outFormat, _mesa_lookup_enum_by_nr(outFormat), 278298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[0], 279298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[1], 280298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[2], 281298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[3], 282298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[4], 283298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[5]); 2846b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#endif 285f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 287f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 288f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 289f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLfloat components. 290f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations. 291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters. 292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format 29339de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures. So, we might 294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead. 295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do. 296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx the rendering context 298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims image dimensions: 1, 2 or 3 299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat basic texture derived from the user's 300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * internal texture format value 301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat the actual basic format of the texture 302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth source image width 303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight source image height 304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth source image depth 305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat source image format 306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType source image type 307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr source image address 308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking source image pixel packing 309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLfloat. 310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulstatic GLfloat * 312f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergmake_temp_float_image(struct gl_context *ctx, GLuint dims, 313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLenum logicalBaseFormat, 314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLenum textureBaseFormat, 315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLenum srcFormat, GLenum srcType, 317f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLvoid *srcAddr, 318f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const struct gl_pixelstore_attrib *srcPacking) 319f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 320f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLuint transferOps = ctx->_ImageTransferState; 321f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *tempImage; 322a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt const GLint components = _mesa_components_in_format(logicalBaseFormat); 323a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt const GLint srcStride = 324a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 325a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt GLfloat *dst; 326a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt GLint img, row; 327f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 328f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(dims >= 1 && dims <= 3); 329f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 330f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(logicalBaseFormat == GL_RGBA || 331f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_RGB || 3325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RG || 3335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RED || 334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE_ALPHA || 335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE || 336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_ALPHA || 337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_INTENSITY || 338f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_COLOR_INDEX || 339f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_DEPTH_COMPONENT); 340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(textureBaseFormat == GL_RGBA || 342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_RGB || 3435d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RG || 3445d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RED || 345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA || 346f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE || 347f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_ALPHA || 348f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_INTENSITY || 349f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_COLOR_INDEX || 350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_DEPTH_COMPONENT); 351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 352a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt tempImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth 353a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt * components * sizeof(GLfloat)); 354a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt if (!tempImage) 355a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt return NULL; 356f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 357a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt dst = tempImage; 358a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt for (img = 0; img < srcDepth; img++) { 359a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt const GLubyte *src 360a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 361a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt srcWidth, srcHeight, 362a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt srcFormat, srcType, 363a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt img, 0, 0); 364a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt for (row = 0; row < srcHeight; row++) { 365a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat, 366a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt dst, srcFormat, srcType, src, 367a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt srcPacking, transferOps); 368a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt dst += srcWidth * components; 369a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt src += srcStride; 370f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 371f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 372f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 373f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (logicalBaseFormat != textureBaseFormat) { 374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* more work */ 375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint texComponents = _mesa_components_in_format(textureBaseFormat); 376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 377f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *newImage; 378f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i, n; 3793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[6]; 380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 38113ad04719e292a2bee7e1b3155da74a97921c035Brian Paul /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 38213ad04719e292a2bee7e1b3155da74a97921c035Brian Paul ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 38313ad04719e292a2bee7e1b3155da74a97921c035Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA); 384f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 385f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* The actual texture format should have at least as many components 386f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * as the logical texture format. 387f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 388f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(texComponents >= logComponents); 389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 39032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg newImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth 391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * texComponents * sizeof(GLfloat)); 392f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!newImage) { 39332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 394f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 395f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 396f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 398f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul n = srcWidth * srcHeight * srcDepth; 400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < n; i++) { 401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint k; 402f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (k = 0; k < texComponents; k++) { 403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint j = map[k]; 404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (j == ZERO) 405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 0.0F; 406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (j == ONE) 407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 1.0F; 408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else 409f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 411f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 412f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 41332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul tempImage = newImage; 415f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 417f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return tempImage; 418f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 419f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLchan components. 423f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations. 424f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters. 425f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format 42639de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures. So, we might 427f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead. 428f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do. 429f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 430f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx the rendering context 431f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims image dimensions: 1, 2 or 3 432f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat basic texture derived from the user's 433f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * internal texture format value 434f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat the actual basic format of the texture 435f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth source image width 436f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight source image height 437f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth source image depth 438f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat source image format 439f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType source image type 440f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr source image address 441f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking source image pixel packing 442f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLchan. 443f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 4448f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian PaulGLchan * 445f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_make_temp_chan_image(struct gl_context *ctx, GLuint dims, 4468f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul GLenum logicalBaseFormat, 4478f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul GLenum textureBaseFormat, 4488f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 4498f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul GLenum srcFormat, GLenum srcType, 4508f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLvoid *srcAddr, 4518f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const struct gl_pixelstore_attrib *srcPacking) 452f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 453f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLuint transferOps = ctx->_ImageTransferState; 454f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint components = _mesa_components_in_format(logicalBaseFormat); 455f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 456f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLchan *tempImage, *dst; 457f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 458f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(dims >= 1 && dims <= 3); 459f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 460f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(logicalBaseFormat == GL_RGBA || 461f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_RGB || 4625d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RG || 4635d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RED || 464f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE_ALPHA || 465f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE || 466f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_ALPHA || 467f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_INTENSITY); 468f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 469f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(textureBaseFormat == GL_RGBA || 470f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_RGB || 4715d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RG || 4725d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RED || 473f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA || 474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE || 475f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_ALPHA || 476f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_INTENSITY); 477f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 478f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* unpack and transfer the source image */ 47932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg tempImage = (GLchan *) malloc(srcWidth * srcHeight * srcDepth 480f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * components * sizeof(GLchan)); 48196128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee if (!tempImage) { 482f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 48396128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee } 484f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 485f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst = tempImage; 486f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 4878c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcStride = 4888c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 4898c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLubyte *src = 4908c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 4918c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcWidth, srcHeight, 4928c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcFormat, srcType, 4938c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul img, 0, 0); 494f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 4959c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul _mesa_unpack_color_span_chan(ctx, srcWidth, logicalBaseFormat, dst, 4969c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul srcFormat, srcType, src, srcPacking, 4979c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul transferOps); 498f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst += srcWidth * components; 499f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcStride; 500f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 501f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 502f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 503f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (logicalBaseFormat != textureBaseFormat) { 504f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* one more conversion step */ 505f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint texComponents = _mesa_components_in_format(textureBaseFormat); 506f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 507f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLchan *newImage; 508f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i, n; 5093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[6]; 510f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 51113ad04719e292a2bee7e1b3155da74a97921c035Brian Paul /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 51213ad04719e292a2bee7e1b3155da74a97921c035Brian Paul ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 51313ad04719e292a2bee7e1b3155da74a97921c035Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA); 514f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 515f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* The actual texture format should have at least as many components 516f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * as the logical texture format. 517f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 518f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(texComponents >= logComponents); 519f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 52032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg newImage = (GLchan *) malloc(srcWidth * srcHeight * srcDepth 5212dbffb30f05fcf67658c64b8101e9efaf07ca388Brian Paul * texComponents * sizeof(GLchan)); 522f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!newImage) { 52332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 525f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 526f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 5273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 528f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 529f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul n = srcWidth * srcHeight * srcDepth; 530f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < n; i++) { 531f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint k; 532f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (k = 0; k < texComponents; k++) { 533f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint j = map[k]; 534f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (j == ZERO) 535f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 0; 536f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (j == ONE) 537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = CHAN_MAX; 538f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else 539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 540f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 54332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul tempImage = newImage; 545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return tempImage; 548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 551c039af165d5919008c6df599795951f85dea164dBrian Paul/** 552c039af165d5919008c6df599795951f85dea164dBrian Paul * Copy GLubyte pixels from <src> to <dst> with swizzling. 553c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dst destination pixels 554c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dstComponents number of color components in destination pixels 555c039af165d5919008c6df599795951f85dea164dBrian Paul * \param src source pixels 556c039af165d5919008c6df599795951f85dea164dBrian Paul * \param srcComponents number of color components in source pixels 557248200737398a7d6403a23930a6c9d93db06b942Brian Paul * \param map the swizzle mapping. map[X] says where to find the X component 558248200737398a7d6403a23930a6c9d93db06b942Brian Paul * in the source image's pixels. For example, if the source image 559248200737398a7d6403a23930a6c9d93db06b942Brian Paul * is GL_BGRA and X = red, map[0] yields 2. 560c039af165d5919008c6df599795951f85dea164dBrian Paul * \param count number of pixels to copy/swizzle. 561c039af165d5919008c6df599795951f85dea164dBrian Paul */ 562c039af165d5919008c6df599795951f85dea164dBrian Paulstatic void 563c039af165d5919008c6df599795951f85dea164dBrian Paulswizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src, 564c039af165d5919008c6df599795951f85dea164dBrian Paul GLuint srcComponents, const GLubyte *map, GLuint count) 56571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 566501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#define SWZ_CPY(dst, src, count, dstComps, srcComps) \ 567501338d70e96e0388fd5198625d856c4ec07745fBrian Paul do { \ 568501338d70e96e0388fd5198625d856c4ec07745fBrian Paul GLuint i; \ 569501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (i = 0; i < count; i++) { \ 570501338d70e96e0388fd5198625d856c4ec07745fBrian Paul GLuint j; \ 571501338d70e96e0388fd5198625d856c4ec07745fBrian Paul if (srcComps == 4) { \ 572501338d70e96e0388fd5198625d856c4ec07745fBrian Paul COPY_4UBV(tmp, src); \ 573501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 574501338d70e96e0388fd5198625d856c4ec07745fBrian Paul else { \ 575501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (j = 0; j < srcComps; j++) { \ 576501338d70e96e0388fd5198625d856c4ec07745fBrian Paul tmp[j] = src[j]; \ 577501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 578501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 579501338d70e96e0388fd5198625d856c4ec07745fBrian Paul src += srcComps; \ 580501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (j = 0; j < dstComps; j++) { \ 581501338d70e96e0388fd5198625d856c4ec07745fBrian Paul dst[j] = tmp[map[j]]; \ 582501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 583501338d70e96e0388fd5198625d856c4ec07745fBrian Paul dst += dstComps; \ 584501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 585501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } while (0) 586501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 587248200737398a7d6403a23930a6c9d93db06b942Brian Paul GLubyte tmp[6]; 58871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 58971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell tmp[ZERO] = 0x0; 59071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell tmp[ONE] = 0xff; 59171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 592501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ASSERT(srcComponents <= 4); 593501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ASSERT(dstComponents <= 4); 594501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 59571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell switch (dstComponents) { 59671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 4: 597501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 598501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 599501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 4); 600501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 601501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 602501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 3); 603501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 604501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 605501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 2); 606501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 607501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 608501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 1); 609501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 610501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 611501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 61271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 61371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 61471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 3: 615501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 616501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 617501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 4); 618501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 619501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 620501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 3); 621501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 622501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 623501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 2); 624501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 625501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 626501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 1); 627501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 628501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 629501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 63071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 63171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 63271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 2: 633501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 634501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 635501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 4); 636501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 637501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 638501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 3); 639501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 640501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 641501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 2); 642501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 643501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 644501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 1); 645501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 646501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 647501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 64871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 64971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 6503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case 1: 651501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 652501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 653501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 4); 654501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 655501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 656501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 3); 657501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 658501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 659501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 2); 660501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 661501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 662501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 1); 663501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 664501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 665501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 6663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 6673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell break; 668501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 669501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 67071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 671501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#undef SWZ_CPY 67271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell} 67371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 67446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 675501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 676bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE }; 677bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE }; 67846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 67939de9251c4770fdcce3395643003aa626178446dBrian Paul 68039de9251c4770fdcce3395643003aa626178446dBrian Paul/** 68139de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a 68239de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on endianness. 683bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell */ 68446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte * 685bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwelltype_mapping( GLenum srcType ) 68646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{ 68746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell switch (srcType) { 688c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger case GL_BYTE: 68946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_BYTE: 69046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_identity; 691bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8: 692df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer return _mesa_little_endian() ? map_3210 : map_identity; 693bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8_REV: 694df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer return _mesa_little_endian() ? map_identity : map_3210; 69546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell default: 69646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return NULL; 69746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 69846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell} 69946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 70039de9251c4770fdcce3395643003aa626178446dBrian Paul 70139de9251c4770fdcce3395643003aa626178446dBrian Paul/** 70239de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a 70339de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on pixelstore byte swapping state. 70446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell */ 70546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte * 706bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellbyteswap_mapping( GLboolean swapBytes, 707bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell GLenum srcType ) 70846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{ 709bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell if (!swapBytes) 710bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell return map_identity; 711bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell 71246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell switch (srcType) { 713c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger case GL_BYTE: 71446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_BYTE: 71546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_identity; 71646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8: 71746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8_REV: 71846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_3210; 71946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell default: 72046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return NULL; 72146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 72246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell} 72346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 72446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 72546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 726c039af165d5919008c6df599795951f85dea164dBrian Paul/** 727c039af165d5919008c6df599795951f85dea164dBrian Paul * Transfer a GLubyte texture image with component swizzling. 728c039af165d5919008c6df599795951f85dea164dBrian Paul */ 72971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellstatic void 730f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_swizzle_ubyte_image(struct gl_context *ctx, 73171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLuint dimensions, 73271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLenum srcFormat, 73346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell GLenum srcType, 73446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 7350c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell GLenum baseInternalFormat, 7360c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell 73746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell const GLubyte *rgba2dst, 7380c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell GLuint dstComponents, 73971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 74071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLvoid *dstAddr, 74171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint dstXoffset, GLint dstYoffset, GLint dstZoffset, 742b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint dstRowStride, 743b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLuint *dstImageOffsets, 74471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 74571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint srcWidth, GLint srcHeight, GLint srcDepth, 74671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const GLvoid *srcAddr, 74771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const struct gl_pixelstore_attrib *srcPacking ) 74871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 74971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint srcComponents = _mesa_components_in_format(srcFormat); 750bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell const GLubyte *srctype2ubyte, *swap; 7513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[4], src2base[6], base2rgba[6]; 75271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint i; 753c039af165d5919008c6df599795951f85dea164dBrian Paul const GLint srcRowStride = 754c039af165d5919008c6df599795951f85dea164dBrian Paul _mesa_image_row_stride(srcPacking, srcWidth, 755c039af165d5919008c6df599795951f85dea164dBrian Paul srcFormat, GL_UNSIGNED_BYTE); 756c039af165d5919008c6df599795951f85dea164dBrian Paul const GLint srcImageStride 757c039af165d5919008c6df599795951f85dea164dBrian Paul = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat, 758c039af165d5919008c6df599795951f85dea164dBrian Paul GL_UNSIGNED_BYTE); 759c039af165d5919008c6df599795951f85dea164dBrian Paul const GLubyte *srcImage 760c039af165d5919008c6df599795951f85dea164dBrian Paul = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr, 761c039af165d5919008c6df599795951f85dea164dBrian Paul srcWidth, srcHeight, srcFormat, 762c039af165d5919008c6df599795951f85dea164dBrian Paul GL_UNSIGNED_BYTE, 0, 0, 0); 76371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 764edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul (void) ctx; 765edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul 7660c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell /* Translate from src->baseInternal->GL_RGBA->dst. This will 7670c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell * correctly deal with RGBA->RGB->RGBA conversions where the final 7680c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell * A value must be 0xff regardless of the incoming alpha values. 7690c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell */ 7703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(srcFormat, baseInternalFormat, src2base); 7713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba); 772bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell swap = byteswap_mapping(srcPacking->SwapBytes, srcType); 773bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell srctype2ubyte = type_mapping(srcType); 77446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 77571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 77671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (i = 0; i < 4; i++) 777bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]]; 77871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 779298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg/* printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]); */ 7802e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell 781b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul if (srcComponents == dstComponents && 782b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul srcRowStride == dstRowStride && 7839c09259b8bef8f120cc6f4bb1a44f0eae37d71b3Michel Dänzer srcRowStride == srcWidth * srcComponents && 784b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dimensions < 3) { 785b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* 1 and 2D images only */ 786b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstImage = (GLubyte *) dstAddr 787b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 788b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstXoffset * dstComponents; 78971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map, 790b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcWidth * srcHeight); 79171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 79271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else { 79371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint img, row; 79471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (img = 0; img < srcDepth; img++) { 79571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const GLubyte *srcRow = srcImage; 796b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 797b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstImageOffsets[dstZoffset + img] * dstComponents 798b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 799b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstXoffset * dstComponents; 80071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (row = 0; row < srcHeight; row++) { 80171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell swizzle_copy(dstRow, dstComponents, srcRow, srcComponents, map, srcWidth); 80271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 80371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 80471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 80571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcImage += srcImageStride; 80671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 80771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 80871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell} 80971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 81071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 811f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 812f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Teximage storage routine for when a simple memcpy will do. 813f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * No pixel transfer operations or special texel encodings allowed. 814f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 1D, 2D and 3D images supported. 815f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 816f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulstatic void 817f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergmemcpy_texture(struct gl_context *ctx, 81817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell GLuint dimensions, 8191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format dstFormat, 820f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLvoid *dstAddr, 821f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint dstXoffset, GLint dstYoffset, GLint dstZoffset, 822b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint dstRowStride, 823b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLuint *dstImageOffsets, 824f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 825f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLenum srcFormat, GLenum srcType, 826f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLvoid *srcAddr, 827f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const struct gl_pixelstore_attrib *srcPacking) 828f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 829f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, 830f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType); 831f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint srcImageStride = _mesa_image_image_stride(srcPacking, 832f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcFormat, srcType); 83360909388ab136d849d99eab49e782a53772a618fBrian Paul const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions, 83460909388ab136d849d99eab49e782a53772a618fBrian Paul srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); 8351f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 83622108bb571808542b89677752d62d3901698265fBrian Paul const GLint bytesPerRow = srcWidth * texelBytes; 837b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul 838b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul#if 0 839b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* XXX update/re-enable for dstImageOffsets array */ 840f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint bytesPerImage = srcHeight * bytesPerRow; 841f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint bytesPerTexture = srcDepth * bytesPerImage; 842f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLubyte *dstImage = (GLubyte *) dstAddr 843f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul + dstZoffset * dstImageStride 844f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul + dstYoffset * dstRowStride 84522108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 846f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 847f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (dstRowStride == srcRowStride && 848f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRowStride == bytesPerRow && 849f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ((dstImageStride == srcImageStride && 850f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstImageStride == bytesPerImage) || 851f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcDepth == 1))) { 852f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* one big memcpy */ 85317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell ctx->Driver.TextureMemCpy(dstImage, srcImage, bytesPerTexture); 854f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 855b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul else 856b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul { 857f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 858f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 859f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLubyte *srcRow = srcImage; 860f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLubyte *dstRow = dstImage; 861f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 86217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow); 863f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 864f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcRow += srcRowStride; 865f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 866f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcImage += srcImageStride; 867f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstImage += dstImageStride; 868f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 869f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 870b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul#endif 871b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul 872b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row; 873b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul for (img = 0; img < srcDepth; img++) { 874b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLubyte *srcRow = srcImage; 875b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 87622108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 877b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 87822108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 879b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul for (row = 0; row < srcHeight; row++) { 880b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow); 881b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 882b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcRow += srcRowStride; 883b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul } 884b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcImage += srcImageStride; 885b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul } 886f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 887f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 888f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 889f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 890f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 891a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul * Store a 32-bit integer depth component texture image. 892f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 89349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 894b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z32(TEXSTORE_PARAMS) 895f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 89625cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian const GLuint depthScale = 0xffffffff; 8971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 898a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 8991f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_Z32); 90022108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == sizeof(GLuint)); 901f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 902966e199e409a1b52eef88e48997442250997f45eBrian Paul if (ctx->Pixel.DepthScale == 1.0f && 903966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 904f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 905a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_DEPTH_COMPONENT && 906a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_DEPTH_COMPONENT && 907a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul srcType == GL_UNSIGNED_INT) { 908f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 90917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 91060909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 911b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 912b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 913f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 914f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 915f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 916f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 917f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 918f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 919f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 920b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 92122108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 922b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 92322108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 924f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 92560909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 926f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 9271ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 928a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul GL_UNSIGNED_INT, (GLuint *) dstRow, 929a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul depthScale, srcType, src, srcPacking); 930f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 931f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 932f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 933f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 934f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 935f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 936f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 937f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 938f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 939e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul * Store a 24-bit integer depth component texture image. 940f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 941e4c700dbbf2a802f32bf62256c801105998c3729Brian Paulstatic GLboolean 942e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul_mesa_texstore_x8_z24(TEXSTORE_PARAMS) 943f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 944e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul const GLuint depthScale = 0xffffff; 945e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul const GLuint texelBytes = 4; 946e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul 947a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 948e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul ASSERT(dstFormat == MESA_FORMAT_X8_Z24); 949f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 950e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul { 951f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 952f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 953f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 954b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 955e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 956b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 957e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul + dstXoffset * texelBytes; 958f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 95960909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 960f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 9611ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 962a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul GL_UNSIGNED_INT, (GLuint *) dstRow, 963a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul depthScale, srcType, src, srcPacking); 964f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 965f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 966f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 967f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 968f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 969f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 970f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 971e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul 972f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 973c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca * Store a 24-bit integer depth component texture image. 974c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca */ 975c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonsecastatic GLboolean 976c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca_mesa_texstore_z24_x8(TEXSTORE_PARAMS) 977c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca{ 978c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLuint depthScale = 0xffffff; 979c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLuint texelBytes = 4; 980c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 981c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca (void) dims; 982c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca ASSERT(dstFormat == MESA_FORMAT_Z24_X8); 983c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 984c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca { 985c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca /* general path */ 986c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLint img, row; 987c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (img = 0; img < srcDepth; img++) { 988c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLubyte *dstRow = (GLubyte *) dstAddr 989c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca + dstImageOffsets[dstZoffset + img] * texelBytes 990c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca + dstYoffset * dstRowStride 991c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca + dstXoffset * texelBytes; 992c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (row = 0; row < srcHeight; row++) { 993c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLvoid *src = _mesa_image_address(dims, srcPacking, 994c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 995c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLuint *dst = (GLuint *) dstRow; 996c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLint i; 997c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca _mesa_unpack_depth_span(ctx, srcWidth, 998c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GL_UNSIGNED_INT, dst, 999c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca depthScale, srcType, src, srcPacking); 1000c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (i = 0; i < srcWidth; i++) 1001c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca dst[i] <<= 8; 1002c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca dstRow += dstRowStride; 1003c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1004c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1005c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1006c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca return GL_TRUE; 1007c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca} 1008c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1009c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1010c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca/** 1011a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul * Store a 16-bit integer depth component texture image. 1012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 101349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1014b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z16(TEXSTORE_PARAMS) 1015f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 101625cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian const GLuint depthScale = 0xffff; 10171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 1018a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 10191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_Z16); 102022108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == sizeof(GLushort)); 1021f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1022966e199e409a1b52eef88e48997442250997f45eBrian Paul if (ctx->Pixel.DepthScale == 1.0f && 1023966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 1024f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1025f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_DEPTH_COMPONENT && 1026f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_DEPTH_COMPONENT && 1027a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_SHORT) { 1028f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 102917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 103060909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1031b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1032b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1033f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1034f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1035f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1036f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1037f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 10381ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul GLint img, row; 1039f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1040b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 104122108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1042b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 104322108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1044f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 104560909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 1046f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 1047a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dst16 = (GLushort *) dstRow; 10481ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 1049a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul GL_UNSIGNED_SHORT, dst16, depthScale, 1050f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType, src, srcPacking); 1051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1052f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1053f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1054f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1055f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1056f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1058f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1059f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1060defb035b6cf03c555318d9dd48864242ed036f39Brian Paul * Store an rgb565 or rgb565_rev texture image. 1061f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 106249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1063b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb565(TEXSTORE_PARAMS) 1064f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 10651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 10661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 106722108bb571808542b89677752d62d3901698265fBrian Paul 10681f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB565 || 10691f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB565_REV); 107022108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1071f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1072f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1073f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 10741f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB565 && 1075a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1076a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGB && 1077a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5) { 1078f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 107917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 108060909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1081b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1082b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1083f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1084f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1085f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1086a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else if (!ctx->_ImageTransferState && 1087a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1088a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1089a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGB && 1090a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE && 1091a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dims == 2) { 1092a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* do optimized tex store */ 10938c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 10948c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1095a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLubyte *src = (const GLubyte *) 109660909388ab136d849d99eab49e782a53772a618fBrian Paul _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight, 1097a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, 0, 0, 0); 1098a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLubyte *dst = (GLubyte *) dstAddr 1099a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul + dstYoffset * dstRowStride 110022108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1101a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLint row, col; 1102a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1103a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLubyte *srcUB = (const GLubyte *) src; 1104a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dstUS = (GLushort *) dst; 1105defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* check for byteswapped format */ 11061f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_RGB565) { 1107f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1108f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] ); 1109f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul srcUB += 3; 1110f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1111f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1112f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1113f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1114f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] ); 1115f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul srcUB += 3; 1116f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1117defb035b6cf03c555318d9dd48864242ed036f39Brian Paul } 1118a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dst += dstRowStride; 1119a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul src += srcRowStride; 1120a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1121a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1122f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1123f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1124a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1125a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat, 112622108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1127a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, 1128a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, srcAddr, 1129a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcPacking); 1130a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLchan *src = tempImage; 1131f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1132a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!tempImage) 1133a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_FALSE; 1134f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1135b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 113622108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1137b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 113822108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1139f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1140a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dstUS = (GLushort *) dstRow; 1141defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* check for byteswapped format */ 11421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_RGB565) { 1143f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1144f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565( CHAN_TO_UBYTE(src[RCOMP]), 1145f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1146f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1147f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 3; 1148f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1149f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1150f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1151f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1152f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565_REV( CHAN_TO_UBYTE(src[RCOMP]), 1153f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1154f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1155f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 3; 1156f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1157f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1159f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1160f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 116132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1162f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1163f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1166f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1167248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 1168248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV. 1169248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 117049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1171b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba8888(TEXSTORE_PARAMS) 1172f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1173184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 11741f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 11751f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 117671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 11771f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA8888 || 11781f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGBA8888_REV); 117922108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 4); 1180f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1181f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1182f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 11831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGBA8888 && 1184f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1185defb035b6cf03c555318d9dd48864242ed036f39Brian Paul ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) || 11862e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) || 11872e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) || 11882e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian))) { 11892e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger /* simple memcpy path */ 11902e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger memcpy_texture(ctx, dims, 11912e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 11922e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger dstRowStride, 11932e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger dstImageOffsets, 11942e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 11952e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger srcAddr, srcPacking); 11962e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger } 11972e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger else if (!ctx->_ImageTransferState && 11982e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger !srcPacking->SwapBytes && 11991f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGBA8888_REV && 12002e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger baseInternalFormat == GL_RGBA && 12012e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) || 12022e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) || 12032e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) || 12042e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian))) { 1205f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 120617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 120760909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1208b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1209b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1210f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1211f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1212f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 121371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 121446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell (srcType == GL_UNSIGNED_BYTE || 121546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8 || 121646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8_REV) && 1217528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger can_swizzle(baseInternalFormat) && 121871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell can_swizzle(srcFormat)) { 121946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 122071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte dstmap[4]; 122171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 1222528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger /* dstmap - how to swizzle from RGBA to dst format: 122371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell */ 12241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if ((littleEndian && dstFormat == MESA_FORMAT_RGBA8888) || 12251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_RGBA8888_REV)) { 122646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 0; 122746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 1; 122846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 2; 122946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 3; 123046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 123146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell else { 123246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 3; 123346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 2; 123446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 1; 123546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 0; 123646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 123771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 123871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 123971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat, 124046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType, 1241528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger baseInternalFormat, 124271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstmap, 4, 124371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 1244528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger dstRowStride, dstImageOffsets, 124571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 124671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcPacking); 124771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 1248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1249f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 12508f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1251f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 125222108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLchan *src = tempImage; 1257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1260f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1261b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 126222108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1263b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 126422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1265f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLuint *dstUI = (GLuint *) dstRow; 12671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_RGBA8888) { 1268f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1269f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[RCOMP]), 1270f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1271f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]), 1272f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[ACOMP]) ); 1273f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1274f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1275f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1276f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1277f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1278f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[RCOMP]), 1279f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1280f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]), 1281f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[ACOMP]) ); 1282f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1283f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1284a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1285a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1286a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1287a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 128832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1289a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1290a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1291a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1292a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1293a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 129449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1295b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb8888(TEXSTORE_PARAMS) 1296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1297184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 12981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 1299f920d496e1b5b01a3ba9bcd7dcff5c19bc109da2Brian Paul const GLenum baseFormat = GL_RGBA; 1300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 13011f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB8888 || 130274d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_ARGB8888_REV || 13032d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer dstFormat == MESA_FORMAT_XRGB8888 || 13042d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer dstFormat == MESA_FORMAT_XRGB8888_REV ); 130522108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 4); 1306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 130974d61d03b54d72217d463c248468cdcd09320efcBrian Paul (dstFormat == MESA_FORMAT_ARGB8888 || 131074d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_XRGB8888) && 1311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGRA && 1313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ((srcType == GL_UNSIGNED_BYTE && littleEndian) || 1314defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV)) { 1315defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* simple memcpy path (little endian) */ 131617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 131760909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1318b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1319b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1320f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1321f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1322f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1323defb035b6cf03c555318d9dd48864242ed036f39Brian Paul else if (!ctx->_ImageTransferState && 1324a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 13252d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (dstFormat == MESA_FORMAT_ARGB8888_REV || 13262d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer dstFormat == MESA_FORMAT_XRGB8888_REV) && 1327a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGBA && 1328a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_BGRA && 1329a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul ((srcType == GL_UNSIGNED_BYTE && !littleEndian) || 1330defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8)) { 1331defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* simple memcpy path (big endian) */ 133217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 133360909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1334b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1335b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1336a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1337a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcAddr, srcPacking); 1338a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 133971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 134071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell !srcPacking->SwapBytes && 134174d61d03b54d72217d463c248468cdcd09320efcBrian Paul (dstFormat == MESA_FORMAT_ARGB8888 || 134274d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_XRGB8888) && 134371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat == GL_RGB && 13440c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell (baseInternalFormat == GL_RGBA || 13450c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat == GL_RGB) && 134671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcType == GL_UNSIGNED_BYTE) { 134771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell int img, row, col; 134871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (img = 0; img < srcDepth; img++) { 13498c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 13508c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 135171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 135271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1353b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 135422108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1355b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 135622108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 135771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (row = 0; row < srcHeight; row++) { 1358259eacfa94a1086e4c99db83516989cc27832ef4Brian GLuint *d4 = (GLuint *) dstRow; 135971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (col = 0; col < srcWidth; col++) { 136024748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul d4[col] = PACK_COLOR_8888(0xff, 136124748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + RCOMP], 136224748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + GCOMP], 136324748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + BCOMP]); 136471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 136571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 136671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 136771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 136871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 136971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 137071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 137171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell !srcPacking->SwapBytes && 13721f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB8888 && 137371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat == GL_RGBA && 13740c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat == GL_RGBA && 137524748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcType == GL_UNSIGNED_BYTE) { 1376259eacfa94a1086e4c99db83516989cc27832ef4Brian /* same as above case, but src data has alpha too */ 1377b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row, col; 1378ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* For some reason, streaming copies to write-combined regions 1379ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * are extremely sensitive to the characteristics of how the 1380ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * source data is retrieved. By reordering the source reads to 1381ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * be in-order, the speed of this operation increases by half. 1382ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Strangely the same isn't required for the RGB path, above. 1383ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 1384ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (img = 0; img < srcDepth; img++) { 13858c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 13868c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1387ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 1388ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1389b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 139022108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1391b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 139222108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1393ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (row = 0; row < srcHeight; row++) { 1394259eacfa94a1086e4c99db83516989cc27832ef4Brian GLuint *d4 = (GLuint *) dstRow; 1395ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (col = 0; col < srcWidth; col++) { 139624748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP], 139724748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + RCOMP], 139824748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + GCOMP], 139924748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + BCOMP]); 140071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 140171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 140271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 140371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 140471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 140571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 140671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 140746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell (srcType == GL_UNSIGNED_BYTE || 140846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8 || 140946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8_REV) && 14100c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell can_swizzle(baseInternalFormat) && 141171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell can_swizzle(srcFormat)) { 141271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 141371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte dstmap[4]; 141471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 14150c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 141671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell */ 14171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 141874d61d03b54d72217d463c248468cdcd09320efcBrian Paul (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) || 14192d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) || 14202d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) { 142146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 3; /* alpha */ 142246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 0; /* red */ 142346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 1; /* green */ 142446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 2; /* blue */ 142546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 142646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell else { 14271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) || 142874d61d03b54d72217d463c248468cdcd09320efcBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 14292d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) || 143074d61d03b54d72217d463c248468cdcd09320efcBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888)); 143146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 2; 143246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 1; 143346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 0; 143446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 3; 143546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 143671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 143771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 143871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat, 143946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType, 14400c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat, 144171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstmap, 4, 144271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 1443b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1444b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 144571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 144671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcPacking); 144771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 1448a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else { 1449a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* general path */ 1450a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1451a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat, 145222108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1453a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, 1454a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, srcAddr, 1455a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcPacking); 1456a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLchan *src = tempImage; 1457a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLint img, row, col; 1458a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!tempImage) 1459a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_FALSE; 1460a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 1461b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 146222108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1463b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 146422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1465a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1466a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLuint *dstUI = (GLuint *) dstRow; 14671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_ARGB8888) { 1468f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1469f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[ACOMP]), 1470f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 1471f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1472f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1473f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1474f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1475a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 147674d61d03b54d72217d463c248468cdcd09320efcBrian Paul else if (dstFormat == MESA_FORMAT_XRGB8888) { 147774d61d03b54d72217d463c248468cdcd09320efcBrian Paul for (col = 0; col < srcWidth; col++) { 147874d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstUI[col] = PACK_COLOR_8888( 0xff, 147974d61d03b54d72217d463c248468cdcd09320efcBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 148074d61d03b54d72217d463c248468cdcd09320efcBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 148174d61d03b54d72217d463c248468cdcd09320efcBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 148274d61d03b54d72217d463c248468cdcd09320efcBrian Paul src += 4; 148374d61d03b54d72217d463c248468cdcd09320efcBrian Paul } 148474d61d03b54d72217d463c248468cdcd09320efcBrian Paul } 1485f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1486f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1487f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[ACOMP]), 1488f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 1489f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1490f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1491f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1492f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1493defb035b6cf03c555318d9dd48864242ed036f39Brian Paul } 1494a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1495a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1496a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 149732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1498a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1499a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1500a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1501a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1502f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 150349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1504b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb888(TEXSTORE_PARAMS) 1505f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1506184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 15071f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 15081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1509f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 15101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB888); 151122108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 3); 1512f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1513f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1514f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1515f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB && 1516f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGR && 1517f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE && 1518f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul littleEndian) { 1519f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 152017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 152160909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1522b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1523b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1525f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1526f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1527f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (!ctx->_ImageTransferState && 1528f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1529f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_RGBA && 1530f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 1531a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* extract RGB from RGBA */ 1532b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row, col; 1533f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 15348c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 15358c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 153660909388ab136d849d99eab49e782a53772a618fBrian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 153760909388ab136d849d99eab49e782a53772a618fBrian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1538b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 153922108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1540b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 154122108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP]; 1545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP]; 1547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcRow += srcRowStride; 1550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 15533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 15543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 15553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 15563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 15573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 15583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 15593aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 15603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 15613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 1562167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[0] = 2; 15633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 1; 1564167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[2] = 0; 15653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 15663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 15673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 15683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 15693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 15703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 15713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 3, 15723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 15733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstRowStride, dstImageOffsets, 15743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 15753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 15763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1577f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1578f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 15798f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1580f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 158122108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1582f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1584f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 15857c544d36850c6e3627adbbd66df9b12bbe0f185bBrian Paul const GLchan *src = (const GLchan *) tempImage; 1586f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1587f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1589f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1590b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 159122108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1592b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 159322108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1594f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1595f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#if 0 1596f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (littleEndian) { 1597f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1598f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[RCOMP]); 1599f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]); 1600f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[BCOMP]); 1601f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcUB += 3; 1602f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1603f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1604f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1605f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1606f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = srcUB[BCOMP]; 1607f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = srcUB[GCOMP]; 1608f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = srcUB[RCOMP]; 1609f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcUB += 3; 1610f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1611f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1612f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#else 1613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[BCOMP]); 1615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]); 1616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[RCOMP]); 1617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += 3; 1618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#endif 1620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1621f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 162332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1624f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1625f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1626f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1627f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 162949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1630b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_bgr888(TEXSTORE_PARAMS) 1631a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul{ 1632184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 16331f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 16341f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1635a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 16361f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_BGR888); 163722108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 3); 1638a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1639a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!ctx->_ImageTransferState && 1640a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1641a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1642a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGB && 1643a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE && 1644a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul littleEndian) { 1645a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* simple memcpy path */ 164617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 164760909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1648b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1649b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1650a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1651a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcAddr, srcPacking); 1652a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1653a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else if (!ctx->_ImageTransferState && 1654a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1655a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGBA && 1656a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE) { 1657a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* extract BGR from RGBA */ 1658a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul int img, row, col; 1659a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 16608c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 16618c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 166260909388ab136d849d99eab49e782a53772a618fBrian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 166360909388ab136d849d99eab49e782a53772a618fBrian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1664b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 166522108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1666b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 166722108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1668a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1669a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (col = 0; col < srcWidth; col++) { 1670a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP]; 1671a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1672a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP]; 1673a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1674a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1675a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcRow += srcRowStride; 1676a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1677a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1678a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 16793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 16803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 16813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 16823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 16833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 16843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 16853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 16863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 16873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 1688167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[0] = 0; 16893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 1; 1690167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[2] = 2; 16913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 16923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 16933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 16943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 16953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 16963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 16973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 3, 16983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 16993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstRowStride, dstImageOffsets, 17003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 17013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 17023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1703a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else { 1704a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* general path */ 1705a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1706a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat, 170722108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1708a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, 1709a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, srcAddr, 1710a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcPacking); 17117c544d36850c6e3627adbbd66df9b12bbe0f185bBrian Paul const GLchan *src = (const GLchan *) tempImage; 1712a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLint img, row, col; 1713a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!tempImage) 1714a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_FALSE; 1715a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 1716b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 171722108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1718b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 171922108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1720a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1721a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (col = 0; col < srcWidth; col++) { 1722a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[RCOMP]); 1723a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]); 1724a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[BCOMP]); 1725a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul src += 3; 1726a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1727a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1728a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1729a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 173032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1731a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1732a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1733a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1734a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1735a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 173649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1737b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb4444(TEXSTORE_PARAMS) 1738f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 17391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 17401f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 174122108bb571808542b89677752d62d3901698265fBrian Paul 17421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB4444 || 17431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB4444_REV); 174422108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1745f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1746f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1747f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 17481f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB4444 && 1749f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1750f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGRA && 1751defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV) { 1752f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 175317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 175460909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1755b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1756b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1757f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1758f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1759f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1760f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1761f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 17628f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1763f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 176422108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1765f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1766f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1767f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1768f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLchan *src = tempImage; 1769f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1770f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1771f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1772f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1773b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 177422108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1775b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 177622108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1777f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1778f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 17791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_ARGB4444) { 1780f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1781f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_4444( CHAN_TO_UBYTE(src[ACOMP]), 1782f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 1783f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1784f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1785f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1786f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1787f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1788f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1789f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1790f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_4444_REV( CHAN_TO_UBYTE(src[ACOMP]), 1791f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 1792f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1793f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1794f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1795f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1796a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1797a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1798a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1799a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 180032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1801a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1802a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1803a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1804a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 180549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1806dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom_mesa_texstore_rgba5551(TEXSTORE_PARAMS) 1807dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom{ 18081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 18091f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 181022108bb571808542b89677752d62d3901698265fBrian Paul 18111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA5551); 181222108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1813a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1814dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom if (!ctx->_ImageTransferState && 1815dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom !srcPacking->SwapBytes && 18161f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGBA5551 && 1817dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom baseInternalFormat == GL_RGBA && 1818dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcFormat == GL_RGBA && 1819dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcType == GL_UNSIGNED_SHORT_5_5_5_1) { 1820dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom /* simple memcpy path */ 1821dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom memcpy_texture(ctx, dims, 1822dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1823dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstRowStride, 1824dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstImageOffsets, 1825dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1826dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcAddr, srcPacking); 1827dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1828dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom else { 1829dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom /* general path */ 1830dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1831dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom baseInternalFormat, 183222108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1833dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcWidth, srcHeight, srcDepth, 1834dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcFormat, srcType, srcAddr, 1835dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcPacking); 1836dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom const GLchan *src =tempImage; 1837dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom GLint img, row, col; 1838dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom if (!tempImage) 1839dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom return GL_FALSE; 1840dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom for (img = 0; img < srcDepth; img++) { 1841dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom GLubyte *dstRow = (GLubyte *) dstAddr 184222108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1843dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom + dstYoffset * dstRowStride 184422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1845dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom for (row = 0; row < srcHeight; row++) { 1846dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom GLushort *dstUS = (GLushort *) dstRow; 1847dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom for (col = 0; col < srcWidth; col++) { 1848dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstUS[col] = PACK_COLOR_5551( CHAN_TO_UBYTE(src[RCOMP]), 1849dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom CHAN_TO_UBYTE(src[GCOMP]), 1850dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom CHAN_TO_UBYTE(src[BCOMP]), 1851dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom CHAN_TO_UBYTE(src[ACOMP]) ); 1852dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom src += 4; 1853dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1854dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstRow += dstRowStride; 1855dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1856dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 185732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1858dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1859dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom return GL_TRUE; 1860dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom} 1861defb035b6cf03c555318d9dd48864242ed036f39Brian Paul 186249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1863b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb1555(TEXSTORE_PARAMS) 1864f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 18651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 18661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 186722108bb571808542b89677752d62d3901698265fBrian Paul 18681f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB1555 || 18691f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB1555_REV); 187022108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1871f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1872f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1873f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 18741f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB1555 && 1875f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1876f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGRA && 1877defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV) { 1878f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 187917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 188060909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1881b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1882b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1883f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1884f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1885f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1886f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1887f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 18888f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1889f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 189022108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1891f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1892f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1893f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1894f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLchan *src =tempImage; 1895f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1896f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1897f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1898f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1899b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 190022108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1901b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 190222108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1903f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1904f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 19051f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_ARGB1555) { 1906f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1907f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_1555( CHAN_TO_UBYTE(src[ACOMP]), 1908f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 1909f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1910f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1911f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1912f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1913f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1914f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1915f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1916f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_1555_REV( CHAN_TO_UBYTE(src[ACOMP]), 1917f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 1918f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1919f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1920f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1921f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1922a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1923a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1924a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1925a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 192632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1927a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1928a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1929a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1930a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1931f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 193239de9251c4770fdcce3395643003aa626178446dBrian Paul/** 193339de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats. 193439de9251c4770fdcce3395643003aa626178446dBrian Paul */ 193549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 19365d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm88(TEXSTORE_PARAMS) 1937f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1938184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 19391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 19401f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1941f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 19421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_AL88 || 19435d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_AL88_REV || 19445d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG88 || 19455d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG88_REV); 194622108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1947f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1948f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1949f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 19505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_RG88) && 19515d1387b2da3626326410804026f8b92f1a121fdcIan Romanick baseInternalFormat == srcFormat && 1952f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE && 1953f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul littleEndian) { 1954f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 195517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 195660909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1957b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1958b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1959f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1960f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1961f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 19623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 1963bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell littleEndian && 19643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 19653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 19663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 19673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 19683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 19693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 19703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 19715d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) { 19725d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if ((littleEndian && dstFormat == MESA_FORMAT_AL88) || 19735d1387b2da3626326410804026f8b92f1a121fdcIan Romanick (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) { 19745d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 0; 19755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 3; 19765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 19775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 19785d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 3; 19795d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 0; 19805d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 19813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 19823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else { 19835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if ((littleEndian && dstFormat == MESA_FORMAT_RG88) || 19845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick (!littleEndian && dstFormat == MESA_FORMAT_RG88_REV)) { 19855d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 0; 19865d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 1; 19875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 19885d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 19895d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 1; 19905d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 0; 19915d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 19923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 19933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[2] = ZERO; /* ? */ 19943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 19953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 19963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 19973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 19983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 19993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 20003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 2, 20013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 20023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstRowStride, dstImageOffsets, 20033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 20043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 20053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 2006f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 20088f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 2009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 201022108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2011f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2013f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2014f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLchan *src = tempImage; 2015f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2016f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2017f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2018f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2019b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 202022108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2021b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 202222108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2023f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2024f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 20255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL88 || 20265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG88) { 2027f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 2028f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul /* src[0] is luminance, src[1] is alpha */ 2029f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_88( CHAN_TO_UBYTE(src[1]), 2030f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[0]) ); 2031f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 2; 2032f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 2033f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2034f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 2035f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 2036f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul /* src[0] is luminance, src[1] is alpha */ 2037f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_88_REV( CHAN_TO_UBYTE(src[1]), 2038f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[0]) ); 2039f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 2; 2040f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 2041a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2042a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 2043a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2044a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 204532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2046a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2047a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 2048a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 2049a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 2050a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 205139de9251c4770fdcce3395643003aa626178446dBrian Paul/** 205239de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats. 205339de9251c4770fdcce3395643003aa626178446dBrian Paul */ 205449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 20555d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm1616(TEXSTORE_PARAMS) 20563325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick{ 20573325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLboolean littleEndian = _mesa_little_endian(); 20583325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 20593325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 20603325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 20613325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick ASSERT(dstFormat == MESA_FORMAT_AL1616 || 20625d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_AL1616_REV || 20635d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616 || 20645d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616_REV); 20653325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick ASSERT(texelBytes == 4); 20663325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 20673325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick if (!ctx->_ImageTransferState && 20683325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick !srcPacking->SwapBytes && 20695d1387b2da3626326410804026f8b92f1a121fdcIan Romanick (dstFormat == MESA_FORMAT_AL1616 || dstFormat == MESA_FORMAT_RG1616) && 20705d1387b2da3626326410804026f8b92f1a121fdcIan Romanick baseInternalFormat == srcFormat && 20713325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcType == GL_UNSIGNED_SHORT && 20723325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick littleEndian) { 20733325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick /* simple memcpy path */ 20743325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick memcpy_texture(ctx, dims, 20753325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 20763325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick dstRowStride, 20773325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick dstImageOffsets, 20783325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcWidth, srcHeight, srcDepth, srcFormat, srcType, 20793325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcAddr, srcPacking); 20803325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 20813325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick else { 20823325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick /* general path */ 20833325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLfloat *tempImage = make_temp_float_image(ctx, dims, 20843325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick baseInternalFormat, 20853325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick baseFormat, 20863325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcWidth, srcHeight, srcDepth, 20873325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcFormat, srcType, srcAddr, 20883325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcPacking); 20893325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLfloat *src = tempImage; 20903325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick GLint img, row, col; 20913325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick if (!tempImage) 20923325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick return GL_FALSE; 20933325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (img = 0; img < srcDepth; img++) { 20943325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick GLubyte *dstRow = (GLubyte *) dstAddr 20953325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick + dstImageOffsets[dstZoffset + img] * texelBytes 20963325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick + dstYoffset * dstRowStride 20973325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick + dstXoffset * texelBytes; 20983325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (row = 0; row < srcHeight; row++) { 20993325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick GLuint *dstUI = (GLuint *) dstRow; 21005d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL1616 || 21015d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616) { 21023325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (col = 0; col < srcWidth; col++) { 2103db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt GLushort l, a; 2104db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt 2105db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(l, src[0]); 2106db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(a, src[1]); 2107db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt dstUI[col] = PACK_COLOR_1616(a, l); 2108db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt src += 2; 21093325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 21103325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 21113325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick else { 21123325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (col = 0; col < srcWidth; col++) { 2113db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt GLushort l, a; 2114db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt 2115db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(l, src[0]); 2116db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(a, src[1]); 2117db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt dstUI[col] = PACK_COLOR_1616_REV(a, l); 2118db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt src += 2; 21193325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 21203325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 21213325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick dstRow += dstRowStride; 21223325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 21233325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 212432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 21253325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 21263325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick return GL_TRUE; 21273325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick} 21283325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 21293325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 21303325dc91be2534079ebf7997700b6e5f17a75283Ian Romanickstatic GLboolean 21315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_r16(TEXSTORE_PARAMS) 21325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick{ 21335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLboolean littleEndian = _mesa_little_endian(); 21345d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 21355d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 21365d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 21375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick ASSERT(dstFormat == MESA_FORMAT_R16); 21385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick ASSERT(texelBytes == 2); 21395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 21405d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (!ctx->_ImageTransferState && 21415d1387b2da3626326410804026f8b92f1a121fdcIan Romanick !srcPacking->SwapBytes && 21425d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_R16 && 21435d1387b2da3626326410804026f8b92f1a121fdcIan Romanick baseInternalFormat == GL_RED && 21445d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcFormat == GL_RED && 21455d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcType == GL_UNSIGNED_SHORT && 21465d1387b2da3626326410804026f8b92f1a121fdcIan Romanick littleEndian) { 21475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick /* simple memcpy path */ 21485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick memcpy_texture(ctx, dims, 21495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 21505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstRowStride, 21515d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstImageOffsets, 21525d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, srcFormat, srcType, 21535d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcAddr, srcPacking); 21545d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 21555d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 21565d1387b2da3626326410804026f8b92f1a121fdcIan Romanick /* general path */ 21575d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLfloat *tempImage = make_temp_float_image(ctx, dims, 21585d1387b2da3626326410804026f8b92f1a121fdcIan Romanick baseInternalFormat, 21595d1387b2da3626326410804026f8b92f1a121fdcIan Romanick baseFormat, 21605d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, 21615d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcFormat, srcType, srcAddr, 21625d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcPacking); 21635d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLfloat *src = tempImage; 21645d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLint img, row, col; 21655d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (!tempImage) 21665d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return GL_FALSE; 21675d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (img = 0; img < srcDepth; img++) { 21685d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLubyte *dstRow = (GLubyte *) dstAddr 21695d1387b2da3626326410804026f8b92f1a121fdcIan Romanick + dstImageOffsets[dstZoffset + img] * texelBytes 21705d1387b2da3626326410804026f8b92f1a121fdcIan Romanick + dstYoffset * dstRowStride 21715d1387b2da3626326410804026f8b92f1a121fdcIan Romanick + dstXoffset * texelBytes; 21725d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (row = 0; row < srcHeight; row++) { 21735d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLushort *dstUS = (GLushort *) dstRow; 21745d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (col = 0; col < srcWidth; col++) { 21755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLushort r; 21765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 21775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick UNCLAMPED_FLOAT_TO_USHORT(r, src[0]); 21785d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstUS[col] = r; 21795d1387b2da3626326410804026f8b92f1a121fdcIan Romanick src += 1; 21805d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 21815d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstRow += dstRowStride; 21825d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 21835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 21845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick free((void *) tempImage); 21855d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 21865d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return GL_TRUE; 21875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick} 21885d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 21895d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 21905d1387b2da3626326410804026f8b92f1a121fdcIan Romanickstatic GLboolean 219117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul_mesa_texstore_rgba_16(TEXSTORE_PARAMS) 219217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul{ 219317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 219417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 219517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 219617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_16); 219717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul ASSERT(texelBytes == 8); 219817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 219917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul if (!ctx->_ImageTransferState && 220017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul !srcPacking->SwapBytes && 220117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseInternalFormat == GL_RGBA && 220217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcFormat == GL_RGBA && 220317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcType == GL_UNSIGNED_SHORT) { 220417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul /* simple memcpy path */ 220517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul memcpy_texture(ctx, dims, 220617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 220717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstRowStride, 220817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstImageOffsets, 220917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 221017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcAddr, srcPacking); 221117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 221217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul else { 221317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul /* general path */ 221417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 221517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseInternalFormat, 221617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseFormat, 221717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcWidth, srcHeight, srcDepth, 221817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcFormat, srcType, srcAddr, 221917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcPacking); 222017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLfloat *src = tempImage; 222117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLint img, row, col; 222217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul if (!tempImage) 222317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul return GL_FALSE; 222417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (img = 0; img < srcDepth; img++) { 222517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 222617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 222717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul + dstYoffset * dstRowStride 222817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul + dstXoffset * texelBytes; 222917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (row = 0; row < srcHeight; row++) { 223017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLushort *dstUS = (GLushort *) dstRow; 223117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (col = 0; col < srcWidth; col++) { 223217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLushort r, g, b, a; 223317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 223417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(r, src[0]); 223517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(g, src[1]); 223617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(b, src[2]); 223717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(a, src[3]); 223817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+0] = r; 223917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+1] = g; 224017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+2] = b; 224117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+3] = a; 224217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul src += 4; 224317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 224417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstRow += dstRowStride; 224517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 224617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 224717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul free((void *) tempImage); 224817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 224917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul return GL_TRUE; 225017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul} 225117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 225217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 225317e96718946486ef77927fcf3bb299d8bff32b98Brian Paulstatic GLboolean 2254279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS) 2255279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul{ 2256279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2257279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2258279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2259279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_R_16 || 2260279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat == MESA_FORMAT_SIGNED_RG_16 || 2261279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat == MESA_FORMAT_SIGNED_RGB_16 || 2262279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA_16); 2263279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2264279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul if (!ctx->_ImageTransferState && 2265279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul !srcPacking->SwapBytes && 2266279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseInternalFormat == GL_RGBA && 2267279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA_16 && 2268279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcFormat == GL_RGBA && 2269279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcType == GL_SHORT) { 2270279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* simple memcpy path */ 2271279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul memcpy_texture(ctx, dims, 2272279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2273279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstRowStride, 2274279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstImageOffsets, 2275279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2276279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcAddr, srcPacking); 2277279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2278279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul else { 2279279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* general path */ 2280279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 2281279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseInternalFormat, 2282279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseFormat, 2283279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcWidth, srcHeight, srcDepth, 2284279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcFormat, srcType, srcAddr, 2285279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcPacking); 2286279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLfloat *src = tempImage; 2287279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2; 2288279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLint img, row, col; 2289279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2290279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul if (!tempImage) 2291279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul return GL_FALSE; 2292279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2293279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* Note: tempImage is always float[4] / RGBA. We convert to 1, 2, 2294279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul * 3 or 4 components/pixel here. 2295279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul */ 2296279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul for (img = 0; img < srcDepth; img++) { 2297279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 2298279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2299279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul + dstYoffset * dstRowStride 2300279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul + dstXoffset * texelBytes; 2301279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul for (row = 0; row < srcHeight; row++) { 2302279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLshort *dstRowS = (GLshort *) dstRow; 2303279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul for (col = 0; col < srcWidth; col++) { 2304279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLuint c; 2305279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul for (c = 0; c < comps; c++) { 2306279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLshort p; 2307279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]); 2308279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstRowS[col * comps + c] = p; 2309279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2310279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2311279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstRow += dstRowStride; 2312279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul src += 4 * srcWidth; 2313279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2314279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2315279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul free((void *) tempImage); 2316279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2317279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul return GL_TRUE; 2318279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul} 2319279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2320279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2321279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paulstatic GLboolean 2322b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb332(TEXSTORE_PARAMS) 2323f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 23241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 23251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 232622108bb571808542b89677752d62d3901698265fBrian Paul 23271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB332); 232822108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 1); 2329f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2330f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2331f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2332f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB && 2333f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_RGB && srcType == GL_UNSIGNED_BYTE_3_3_2) { 2334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 233517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 233660909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2337b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2338b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2339f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 23448f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 2345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 234622108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2347f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2348f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2349f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLchan *src = tempImage; 2351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2355b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 235622108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2357b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 235822108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2359f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2360f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 2361f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col] = PACK_COLOR_332( CHAN_TO_UBYTE(src[RCOMP]), 2362f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul CHAN_TO_UBYTE(src[GCOMP]), 2363f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 2364f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += 3; 2365f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2366f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 2367f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2368f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 236932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2370f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2371f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2372f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2373f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 2376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8. 2377f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 237849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2379b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_a8(TEXSTORE_PARAMS) 2380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 23811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 23821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 238322108bb571808542b89677752d62d3901698265fBrian Paul 23841f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_A8 || 23851f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_L8 || 23865d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_I8 || 23875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_R8); 238822108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 1); 2389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2390f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2392f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 2393f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 2394f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 239517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 239660909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2397b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2398b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 24023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 24033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 24043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 24053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 24063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 24073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 24083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 24093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 24101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_A8) { 24113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 3; 24123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 24133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else { 24143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 0; 24153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 24163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = ZERO; /* ? */ 24173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[2] = ZERO; /* ? */ 24183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 24193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 24203aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 24213aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 24223aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 24233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 24243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 1, 24253aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 24263aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstRowStride, dstImageOffsets, 24273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 24283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 24293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 2430f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2431f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 24328f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 2433f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 243422108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2435f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2436f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2437f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2438f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLchan *src = tempImage; 2439f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2440f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2441f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2442f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2443b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 244422108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2445b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 244622108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2447f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2448f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 2449f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col] = CHAN_TO_UBYTE(src[col]); 2450f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2451f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 2452f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcWidth; 2453f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2454f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 245532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2456f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2457f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2458f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2459f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2460f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2461f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 246249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2463b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ci8(TEXSTORE_PARAMS) 2464f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 24651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 246622108bb571808542b89677752d62d3901698265fBrian Paul 2467a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; (void) baseInternalFormat; 24681f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_CI8); 246922108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 1); 2470f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_COLOR_INDEX); 2471f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2472f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2473f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_COLOR_INDEX && 2475f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 2476f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 247717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 247860909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2479b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2480b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2481f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2482f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2483f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2484f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2485f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 2486f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 2487f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2488b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 248922108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2490b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 249122108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2492f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 249360909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 2494f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 2495f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_unpack_index_span(ctx, srcWidth, GL_UNSIGNED_BYTE, dstRow, 2496f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType, src, srcPacking, 2497f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ctx->_ImageTransferState); 2498f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 2499f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2500f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2501f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2502f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2503f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2504f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2505f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2506f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 25071f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV. 2508f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 250949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2510b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ycbcr(TEXSTORE_PARAMS) 2511f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 2512184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 25131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 251422108bb571808542b89677752d62d3901698265fBrian Paul 2515a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; (void) dims; (void) baseInternalFormat; 2516f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 25171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT((dstFormat == MESA_FORMAT_YCBCR) || 25181f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (dstFormat == MESA_FORMAT_YCBCR_REV)); 251922108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 2520f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(ctx->Extensions.MESA_ycbcr_texture); 2521f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(srcFormat == GL_YCBCR_MESA); 2522f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) || 2523f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA)); 2524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_YCBCR_MESA); 2525f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2526f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* always just memcpy since no pixel transfer ops apply */ 252717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 252860909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2529b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2530b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2531f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2532f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2533f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2534f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* Check if we need byte swapping */ 2535f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* XXX the logic here _might_ be wrong */ 2536f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (srcPacking->SwapBytes ^ 2537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^ 25381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (dstFormat == MESA_FORMAT_YCBCR_REV) ^ 2539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !littleEndian) { 2540f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 2541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2542b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 254322108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2544b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 254522108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2547b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul _mesa_swap2((GLushort *) dstRow, srcWidth); 2548b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 2549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2554f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 255549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2556114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_texstore_dudv8(TEXSTORE_PARAMS) 2557114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 2558114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const GLboolean littleEndian = _mesa_little_endian(); 25591f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2560114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 25611f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_DUDV8); 256222108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 2563114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT(ctx->Extensions.ATI_envmap_bumpmap); 2564114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT((srcFormat == GL_DU8DV8_ATI) || 2565114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger (srcFormat == GL_DUDV_ATI)); 2566114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT(baseInternalFormat == GL_DUDV_ATI); 2567114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2568114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!srcPacking->SwapBytes && srcType == GL_BYTE && 2569114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger littleEndian) { 2570114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* simple memcpy path */ 2571114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger memcpy_texture(ctx, dims, 2572114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2573114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstRowStride, 2574114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstImageOffsets, 2575114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2576114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcAddr, srcPacking); 2577114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2578114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (srcType == GL_BYTE) { 2579114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLubyte dstmap[4]; 2580114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2581114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* dstmap - how to swizzle from RGBA to dst format: 2582114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger */ 2583114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (littleEndian) { 2584114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[0] = 0; 2585114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[1] = 3; 2586114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2587114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 2588114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[0] = 3; 2589114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[1] = 0; 2590114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2591114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[2] = ZERO; /* ? */ 2592114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[3] = ONE; /* ? */ 2593114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2594114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_swizzle_ubyte_image(ctx, dims, 2595114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_LUMINANCE_ALPHA, /* hack */ 2596114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_UNSIGNED_BYTE, /* hack */ 2597114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_LUMINANCE_ALPHA, /* hack */ 2598114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap, 2, 2599114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstAddr, dstXoffset, dstYoffset, dstZoffset, 2600114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstRowStride, dstImageOffsets, 2601114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, srcDepth, srcAddr, 2602114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcPacking); 2603114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2604114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 2605114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* general path - note this is defined for 2d textures only */ 2606114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const GLint components = _mesa_components_in_format(baseInternalFormat); 26078c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth, 26088c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcFormat, srcType); 2609114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLbyte *tempImage, *dst, *src; 2610114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLint row; 2611114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 261232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth 2613114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger * components * sizeof(GLbyte)); 2614114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!tempImage) 2615114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_FALSE; 2616114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2617114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2618114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, 2619114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcFormat, srcType, 2620114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 0, 0, 0); 2621114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2622114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst = tempImage; 2623114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (row = 0; row < srcHeight; row++) { 2624114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat, 2625114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst, srcFormat, srcType, src, 2626114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcPacking, 0); 2627114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst += srcWidth * components; 2628114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src += srcStride; 2629114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2630114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2631114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src = tempImage; 2632114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst = (GLbyte *) dstAddr 2633114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger + dstYoffset * dstRowStride 263422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2635114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (row = 0; row < srcHeight; row++) { 263622108bb571808542b89677752d62d3901698265fBrian Paul memcpy(dst, src, srcWidth * texelBytes); 2637114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst += dstRowStride; 263822108bb571808542b89677752d62d3901698265fBrian Paul src += srcWidth * texelBytes; 2639114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 264032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2641114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2642114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_TRUE; 2643114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 2644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 264584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 264684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 264784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_R8 format. 264884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 264984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 265084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_r8(TEXSTORE_PARAMS) 265184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 265284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 265384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 265484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 265584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_R8); 265684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(texelBytes == 1); 265784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 265884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* XXX look at adding optimized paths */ 265984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul { 266084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 266184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 266284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 266384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 266484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 266584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 266684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcPacking); 266784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLfloat *srcRow = tempImage; 266884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 266984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 267084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 267184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 267284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 267384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 267484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstYoffset * dstRowStride 267584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstXoffset * texelBytes; 267684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 267784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLubyte *dstB = (GLubyte *) dstRow; 267884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 267984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstB[col] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 268084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 268184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 268284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 268384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 268484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 268584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 268684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 268784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 268884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 268984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 269084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 269184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_RG88 format. 269284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 269384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 269484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_rg88(TEXSTORE_PARAMS) 269584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 269684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 269784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 269884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 269984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_RG88); 270084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(texelBytes == 1); 270184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 270284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* XXX look at adding optimized paths */ 270384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul { 270484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 270584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 270684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 270784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 270884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 270984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 271084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcPacking); 271184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLfloat *srcRow = tempImage; 271284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 271384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 271484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 271584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 271684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 271784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 271884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstYoffset * dstRowStride 271984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstXoffset * texelBytes; 272084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 272184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLushort *dstUS = (GLushort *) dstRow; 272284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 272384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstUS[col] = PACK_COLOR_88(FLOAT_TO_BYTE_TEX(srcRow[RCOMP]), 272484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul FLOAT_TO_BYTE_TEX(srcRow[GCOMP])); 272584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 272684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 272784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 272884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 272984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 273084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 273184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 273284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 273384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 273484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 273584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 273684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBX8888. 273784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 273884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 273984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS) 274084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 274184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 274284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 274384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 274484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888); 274584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(texelBytes == 4); 274684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 274784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul { 274884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 274984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 275084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 275184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 275284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 275384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 275484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcPacking); 275584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLfloat *srcRow = tempImage; 275684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 275784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 275884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 275984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 276084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 276184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 276284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstYoffset * dstRowStride 276384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstXoffset * texelBytes; 276484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 276584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLuint *dstUI = (GLuint *) dstRow; 276684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 276784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstUI[col] = PACK_COLOR_8888( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]), 276884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul FLOAT_TO_BYTE_TEX(srcRow[GCOMP]), 276984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul FLOAT_TO_BYTE_TEX(srcRow[BCOMP]), 277084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 0xff ); 277184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcRow += 4; 277284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 277384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 277484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 277584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 277684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 277784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 277884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 277984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 278084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 278184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 278284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2783c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger/** 278439de9251c4770fdcce3395643003aa626178446dBrian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or 278539de9251c4770fdcce3395643003aa626178446dBrian Paul * MESA_FORMAT_SIGNED_RGBA8888_REV 2786c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */ 278749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2788c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS) 2789c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger{ 2790c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger const GLboolean littleEndian = _mesa_little_endian(); 27911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 27921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2793c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 27941f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 || 27951f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV); 279622108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 4); 2797c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 2798c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger if (!ctx->_ImageTransferState && 2799c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger !srcPacking->SwapBytes && 28001f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888 && 2801c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat == GL_RGBA && 2802c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger ((srcFormat == GL_RGBA && srcType == GL_BYTE && !littleEndian) || 2803c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && littleEndian))) { 2804c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* simple memcpy path */ 2805c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger memcpy_texture(ctx, dims, 2806c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2807c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstRowStride, 2808c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstImageOffsets, 2809c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2810c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcAddr, srcPacking); 2811c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2812c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger else if (!ctx->_ImageTransferState && 2813bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger !srcPacking->SwapBytes && 28141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV && 2815bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger baseInternalFormat == GL_RGBA && 2816bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger ((srcFormat == GL_RGBA && srcType == GL_BYTE && littleEndian) || 2817bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && !littleEndian))) { 2818bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger /* simple memcpy path */ 2819bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger memcpy_texture(ctx, dims, 2820bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2821bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger dstRowStride, 2822bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger dstImageOffsets, 2823bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2824bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcAddr, srcPacking); 2825bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 2826bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger else if (!ctx->_ImageTransferState && 2827c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger (srcType == GL_BYTE) && 2828c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger can_swizzle(baseInternalFormat) && 2829c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger can_swizzle(srcFormat)) { 2830c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 2831c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger GLubyte dstmap[4]; 2832c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 2833c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* dstmap - how to swizzle from RGBA to dst format: 2834c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */ 28351f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if ((littleEndian && dstFormat == MESA_FORMAT_SIGNED_RGBA8888) || 28361f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV)) { 2837c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[3] = 0; 2838c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[2] = 1; 2839c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[1] = 2; 2840c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[0] = 3; 2841c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2842c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger else { 2843c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[3] = 3; 2844c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[2] = 2; 2845c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[1] = 1; 2846c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[0] = 0; 2847c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2848c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 2849c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger _mesa_swizzle_ubyte_image(ctx, dims, 2850c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcFormat, 2851c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcType, 2852c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat, 2853c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap, 4, 2854c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstAddr, dstXoffset, dstYoffset, dstZoffset, 2855c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstRowStride, dstImageOffsets, 2856c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, srcAddr, 2857c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcPacking); 2858c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2859c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger else { 2860c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* general path */ 2861c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger const GLfloat *tempImage = make_temp_float_image(ctx, dims, 2862c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat, 286322108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2864c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, 2865c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcFormat, srcType, srcAddr, 2866c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcPacking); 2867c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger const GLfloat *srcRow = tempImage; 2868c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger GLint img, row, col; 2869c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger if (!tempImage) 2870c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger return GL_FALSE; 2871c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (img = 0; img < srcDepth; img++) { 2872c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger GLubyte *dstRow = (GLubyte *) dstAddr 287322108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2874c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger + dstYoffset * dstRowStride 287522108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2876c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (row = 0; row < srcHeight; row++) { 2877c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger GLuint *dstUI = (GLuint *) dstRow; 28781f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) { 2879c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (col = 0; col < srcWidth; col++) { 2880c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstUI[col] = PACK_COLOR_8888( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]), 2881c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger FLOAT_TO_BYTE_TEX(srcRow[GCOMP]), 2882c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger FLOAT_TO_BYTE_TEX(srcRow[BCOMP]), 2883c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger FLOAT_TO_BYTE_TEX(srcRow[ACOMP]) ); 2884c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcRow += 4; 2885c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2886c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2887bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger else { 2888bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger for (col = 0; col < srcWidth; col++) { 2889bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger dstUI[col] = PACK_COLOR_8888_REV( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]), 2890bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger FLOAT_TO_BYTE_TEX(srcRow[GCOMP]), 2891bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger FLOAT_TO_BYTE_TEX(srcRow[BCOMP]), 2892bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger FLOAT_TO_BYTE_TEX(srcRow[ACOMP]) ); 2893bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcRow += 4; 2894bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 2895bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 2896c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstRow += dstRowStride; 2897c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2898c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 289932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2900c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2901c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger return GL_TRUE; 2902c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger} 2903f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 290484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2905184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul/** 2906184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul * Store a combined depth/stencil texture image. 2907184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul */ 290849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2909b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z24_s8(TEXSTORE_PARAMS) 2910184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul{ 291192098438784887fd6005918794476cfbbeac5035Karl Schultz const GLuint depthScale = 0xffffff; 2912c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz const GLint srcRowStride 2913c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType) 2914c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz / sizeof(GLuint); 2915c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz GLint img, row; 291625cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian 29171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_Z24_S8); 2918c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || srcFormat == GL_DEPTH_COMPONENT); 2919c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT); 2920184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 2921c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (srcFormat != GL_DEPTH_COMPONENT && ctx->Pixel.DepthScale == 1.0f && 2922966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 2923184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul !srcPacking->SwapBytes) { 2924ef8653a83800bc4b8e116e03ad52604097224378Brian Paul /* simple path */ 2925184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul memcpy_texture(ctx, dims, 2926184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2927b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2928b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2929184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2930184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul srcAddr, srcPacking); 293139de9251c4770fdcce3395643003aa626178446dBrian Paul } 293239de9251c4770fdcce3395643003aa626178446dBrian Paul else if (srcFormat == GL_DEPTH_COMPONENT) { 2933c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* In case we only upload depth we need to preserve the stencil */ 2934ef8653a83800bc4b8e116e03ad52604097224378Brian Paul for (img = 0; img < srcDepth; img++) { 2935c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLuint *dstRow = (GLuint *) dstAddr 2936b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstImageOffsets[dstZoffset + img] 2937b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride / sizeof(GLuint) 2938b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstXoffset; 2939ef8653a83800bc4b8e116e03ad52604097224378Brian Paul const GLuint *src 2940ef8653a83800bc4b8e116e03ad52604097224378Brian Paul = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr, 2941c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcWidth, srcHeight, 2942c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcFormat, srcType, 2943c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie img, 0, 0); 2944ef8653a83800bc4b8e116e03ad52604097224378Brian Paul for (row = 0; row < srcHeight; row++) { 2945c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLuint depth[MAX_WIDTH]; 2946c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLubyte stencil[MAX_WIDTH]; 2947ef8653a83800bc4b8e116e03ad52604097224378Brian Paul GLint i; 2948c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; 2949c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2950c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */ 2951c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil = GL_TRUE; 295239de9251c4770fdcce3395643003aa626178446dBrian Paul } 295339de9251c4770fdcce3395643003aa626178446dBrian Paul else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */ 2954c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepdepth = GL_TRUE; 2955c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 2956c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2957c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepdepth == GL_FALSE) 2958c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* the 24 depth bits will be in the low position: */ 2959c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_depth_span(ctx, srcWidth, 2960c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_INT, /* dst type */ 2961c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil ? depth : dstRow, /* dst addr */ 2962c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie depthScale, 2963c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking); 2964c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2965c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil == GL_FALSE) 2966c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* get the 8-bit stencil values */ 2967c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_stencil_span(ctx, srcWidth, 2968c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_BYTE, /* dst type */ 2969c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie stencil, /* dst addr */ 2970c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking, 2971c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie ctx->_ImageTransferState); 2972c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2973c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (i = 0; i < srcWidth; i++) { 2974c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil) 2975c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF); 2976c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie else 2977c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF); 2978c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 2979ef8653a83800bc4b8e116e03ad52604097224378Brian Paul 2980ef8653a83800bc4b8e116e03ad52604097224378Brian Paul src += srcRowStride; 2981b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride / sizeof(GLuint); 2982ef8653a83800bc4b8e116e03ad52604097224378Brian Paul } 2983ef8653a83800bc4b8e116e03ad52604097224378Brian Paul } 2984184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul } 2985184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul return GL_TRUE; 2986184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul} 2987184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 2988184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 2989a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz/** 2990a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz * Store a combined depth/stencil texture image. 2991a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz */ 299249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2993a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz_mesa_texstore_s8_z24(TEXSTORE_PARAMS) 2994a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz{ 2995a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz const GLuint depthScale = 0xffffff; 2996a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz const GLint srcRowStride 2997a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType) 2998a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz / sizeof(GLuint); 2999a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz GLint img, row; 3000a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz 30011f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_S8_Z24); 300239de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || 300339de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat == GL_DEPTH_COMPONENT || 300439de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat == GL_STENCIL_INDEX); 300539de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || 300639de9251c4770fdcce3395643003aa626178446dBrian Paul srcType == GL_UNSIGNED_INT_24_8_EXT); 3007c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca 3008c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (img = 0; img < srcDepth; img++) { 3009c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLuint *dstRow = (GLuint *) dstAddr 3010c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie + dstImageOffsets[dstZoffset + img] 3011c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie + dstYoffset * dstRowStride / sizeof(GLuint) 3012c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie + dstXoffset; 3013c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie const GLuint *src 3014c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr, 3015c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcWidth, srcHeight, 3016c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcFormat, srcType, 3017c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie img, 0, 0); 3018c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (row = 0; row < srcHeight; row++) { 3019c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLuint depth[MAX_WIDTH]; 3020c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLubyte stencil[MAX_WIDTH]; 3021c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLint i; 3022c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; 3023c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3024c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */ 3025c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil = GL_TRUE; 302639de9251c4770fdcce3395643003aa626178446dBrian Paul } 302739de9251c4770fdcce3395643003aa626178446dBrian Paul else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */ 3028c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepdepth = GL_TRUE; 3029c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 3030666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz 3031c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepdepth == GL_FALSE) 3032c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* the 24 depth bits will be in the low position: */ 3033c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_depth_span(ctx, srcWidth, 3034c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_INT, /* dst type */ 3035c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil ? depth : dstRow, /* dst addr */ 3036c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie depthScale, 3037c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking); 3038c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3039c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil == GL_FALSE) 3040c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* get the 8-bit stencil values */ 3041c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_stencil_span(ctx, srcWidth, 3042c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_BYTE, /* dst type */ 3043c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie stencil, /* dst addr */ 3044c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking, 3045c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie ctx->_ImageTransferState); 3046c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3047c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* merge stencil values into depth values */ 3048c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (i = 0; i < srcWidth; i++) { 3049c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil) 3050c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000); 3051c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie else 3052c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24); 3053666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz 3054c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 3055c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie src += srcRowStride; 3056c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow += dstRowStride / sizeof(GLuint); 3057a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz } 3058a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz } 3059a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz return GL_TRUE; 3060a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz} 3061f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 306239de9251c4770fdcce3395643003aa626178446dBrian Paul 306339de9251c4770fdcce3395643003aa626178446dBrian Paul/** 306439de9251c4770fdcce3395643003aa626178446dBrian Paul * Store simple 8-bit/value stencil texture data. 306539de9251c4770fdcce3395643003aa626178446dBrian Paul */ 306639de9251c4770fdcce3395643003aa626178446dBrian Paulstatic GLboolean 306739de9251c4770fdcce3395643003aa626178446dBrian Paul_mesa_texstore_s8(TEXSTORE_PARAMS) 306839de9251c4770fdcce3395643003aa626178446dBrian Paul{ 306939de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(dstFormat == MESA_FORMAT_S8); 307039de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat == GL_STENCIL_INDEX); 307139de9251c4770fdcce3395643003aa626178446dBrian Paul 307239de9251c4770fdcce3395643003aa626178446dBrian Paul if (!ctx->_ImageTransferState && 307339de9251c4770fdcce3395643003aa626178446dBrian Paul !srcPacking->SwapBytes && 307439de9251c4770fdcce3395643003aa626178446dBrian Paul baseInternalFormat == srcFormat && 307539de9251c4770fdcce3395643003aa626178446dBrian Paul srcType == GL_UNSIGNED_BYTE) { 307639de9251c4770fdcce3395643003aa626178446dBrian Paul /* simple memcpy path */ 307739de9251c4770fdcce3395643003aa626178446dBrian Paul memcpy_texture(ctx, dims, 307839de9251c4770fdcce3395643003aa626178446dBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 307939de9251c4770fdcce3395643003aa626178446dBrian Paul dstRowStride, 308039de9251c4770fdcce3395643003aa626178446dBrian Paul dstImageOffsets, 308139de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 308239de9251c4770fdcce3395643003aa626178446dBrian Paul srcAddr, srcPacking); 308339de9251c4770fdcce3395643003aa626178446dBrian Paul } 308439de9251c4770fdcce3395643003aa626178446dBrian Paul else { 308539de9251c4770fdcce3395643003aa626178446dBrian Paul const GLint srcRowStride 308639de9251c4770fdcce3395643003aa626178446dBrian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType) 308739de9251c4770fdcce3395643003aa626178446dBrian Paul / sizeof(GLuint); 308839de9251c4770fdcce3395643003aa626178446dBrian Paul GLint img, row; 308939de9251c4770fdcce3395643003aa626178446dBrian Paul 309039de9251c4770fdcce3395643003aa626178446dBrian Paul for (img = 0; img < srcDepth; img++) { 309139de9251c4770fdcce3395643003aa626178446dBrian Paul GLubyte *dstRow = (GLubyte *) dstAddr 309239de9251c4770fdcce3395643003aa626178446dBrian Paul + dstImageOffsets[dstZoffset + img] 309339de9251c4770fdcce3395643003aa626178446dBrian Paul + dstYoffset * dstRowStride / sizeof(GLuint) 309439de9251c4770fdcce3395643003aa626178446dBrian Paul + dstXoffset; 309539de9251c4770fdcce3395643003aa626178446dBrian Paul const GLuint *src 309639de9251c4770fdcce3395643003aa626178446dBrian Paul = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr, 309739de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, 309839de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat, srcType, 309939de9251c4770fdcce3395643003aa626178446dBrian Paul img, 0, 0); 310039de9251c4770fdcce3395643003aa626178446dBrian Paul for (row = 0; row < srcHeight; row++) { 310139de9251c4770fdcce3395643003aa626178446dBrian Paul GLubyte stencil[MAX_WIDTH]; 310239de9251c4770fdcce3395643003aa626178446dBrian Paul GLint i; 310339de9251c4770fdcce3395643003aa626178446dBrian Paul 310439de9251c4770fdcce3395643003aa626178446dBrian Paul /* get the 8-bit stencil values */ 310539de9251c4770fdcce3395643003aa626178446dBrian Paul _mesa_unpack_stencil_span(ctx, srcWidth, 310639de9251c4770fdcce3395643003aa626178446dBrian Paul GL_UNSIGNED_BYTE, /* dst type */ 310739de9251c4770fdcce3395643003aa626178446dBrian Paul stencil, /* dst addr */ 310839de9251c4770fdcce3395643003aa626178446dBrian Paul srcType, src, srcPacking, 310939de9251c4770fdcce3395643003aa626178446dBrian Paul ctx->_ImageTransferState); 311039de9251c4770fdcce3395643003aa626178446dBrian Paul /* merge stencil values into depth values */ 311139de9251c4770fdcce3395643003aa626178446dBrian Paul for (i = 0; i < srcWidth; i++) 311239de9251c4770fdcce3395643003aa626178446dBrian Paul dstRow[i] = stencil[i]; 311339de9251c4770fdcce3395643003aa626178446dBrian Paul 311439de9251c4770fdcce3395643003aa626178446dBrian Paul src += srcRowStride; 311539de9251c4770fdcce3395643003aa626178446dBrian Paul dstRow += dstRowStride / sizeof(GLubyte); 311639de9251c4770fdcce3395643003aa626178446dBrian Paul } 311739de9251c4770fdcce3395643003aa626178446dBrian Paul } 311839de9251c4770fdcce3395643003aa626178446dBrian Paul 311939de9251c4770fdcce3395643003aa626178446dBrian Paul } 312039de9251c4770fdcce3395643003aa626178446dBrian Paul 312139de9251c4770fdcce3395643003aa626178446dBrian Paul return GL_TRUE; 312239de9251c4770fdcce3395643003aa626178446dBrian Paul} 312339de9251c4770fdcce3395643003aa626178446dBrian Paul 312439de9251c4770fdcce3395643003aa626178446dBrian Paul 3125f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 3126f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Store an image in any of the formats: 3127f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_rgba_float32 3128f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_rgb_float32 3129f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_alpha_float32 3130f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_luminance_float32 3131f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_luminance_alpha_float32 3132f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_intensity_float32 3133f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 313449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3135b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float32(TEXSTORE_PARAMS) 3136f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 31371f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 31381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 313922108bb571808542b89677752d62d3901698265fBrian Paul const GLint components = _mesa_components_in_format(baseFormat); 3140f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 31411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 || 31421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB_FLOAT32 || 31431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ALPHA_FLOAT32 || 31441f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 || 31451f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 || 31461f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_INTENSITY_FLOAT32); 3147f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3148f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB || 3149f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_ALPHA || 3150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE || 3151f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3152f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_INTENSITY); 315322108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == components * sizeof(GLfloat)); 3154f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3155f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 3156f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 3157f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 3158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_FLOAT) { 3159f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 316017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 316160909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3162b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 3163b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 3164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 3166f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3167f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 3168f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 3169f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 3170f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 317122108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 3172f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 3173f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 3174f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 3175b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLfloat *srcRow = tempImage; 31769c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul GLint bytesPerRow; 3177f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 3178f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 3179f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 31809c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul bytesPerRow = srcWidth * components * sizeof(GLfloat); 3181f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 3182b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 318322108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3184b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 318522108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 3186f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 3187c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy(dstRow, srcRow, bytesPerRow); 3188b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 3189b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcRow += srcWidth * components; 3190f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3191f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3192f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 319332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 3194f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3195f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 3196f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 3197f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3198c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3199f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3200f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 3201f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * As above, but store 16-bit floats. 3202f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 320349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3204b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float16(TEXSTORE_PARAMS) 3205f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 32061f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 32071f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 320822108bb571808542b89677752d62d3901698265fBrian Paul const GLint components = _mesa_components_in_format(baseFormat); 3209f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 32101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 || 32111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB_FLOAT16 || 32121f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ALPHA_FLOAT16 || 32131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 || 32141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 || 32151f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_INTENSITY_FLOAT16); 3216f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3217f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB || 3218f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_ALPHA || 3219f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE || 3220f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3221f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_INTENSITY); 322222108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == components * sizeof(GLhalfARB)); 3223f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3224f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 3225f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 3226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 3227f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_HALF_FLOAT_ARB) { 3228f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 322917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 323060909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3231b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 3232b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 3233f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3234f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 3235f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3236f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 3237f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 3238f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 3239f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 324022108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 3241f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 3242f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 3243f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 3244f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLfloat *src = tempImage; 3245f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 3246f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 3247f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 3248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 3249b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 325022108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3251b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 325222108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 3253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 3254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLhalfARB *dstTexel = (GLhalfARB *) dstRow; 3255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i; 3256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < srcWidth * components; i++) { 3257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstTexel[i] = _mesa_float_to_half(src[i]); 3258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 3260f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcWidth * components; 3261f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3262f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3263f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 326432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 3265f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 3267f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 3268f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3269f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3270abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int8 */ 3271abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3272abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int8(TEXSTORE_PARAMS) 3273abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3274abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3275abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3276abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3277abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3278abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_INT8); 3279abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3280abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3281abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3282abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3283abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3284abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3285abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLbyte)); 3286abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3287abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!ctx->_ImageTransferState && 3288abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul !srcPacking->SwapBytes && 3289abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3290abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_BYTE) { 3291abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3292abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3293abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3294abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRowStride, 3295abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstImageOffsets, 3296abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3297abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3298abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3299abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3300abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3301abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 3302abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat, 3303abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseFormat, 3304abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, 3305abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcFormat, srcType, srcAddr, 3306abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcPacking); 3307abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *src = tempImage; 3308abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3309abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3310abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3311abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3312abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 3313abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3314abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3315abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3316abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3317abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLbyte *dstTexel = (GLbyte *) dstRow; 3318abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3319abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3320abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLbyte) src[i]; 3321abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3322abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3323abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3324abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3325abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3326abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3327abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3328abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3329abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3330abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3331abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3332abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3333abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int16 */ 3334abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3335abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int16(TEXSTORE_PARAMS) 3336abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3337abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3338abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3339abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3340abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3341abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_INT16); 3342abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3343abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3344abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3345abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3346abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3347abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3348abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLshort)); 3349abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3350abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!ctx->_ImageTransferState && 3351abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul !srcPacking->SwapBytes && 3352abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 33539fc7fa0a4cbe9dc8faa124744f623491fa754bd7Brian Paul srcType == GL_SHORT) { 3354abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3355abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3356abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3357abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRowStride, 3358abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstImageOffsets, 3359abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3360abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3361abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3362abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3363abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3364abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 3365abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat, 3366abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseFormat, 3367abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, 3368abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcFormat, srcType, srcAddr, 3369abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcPacking); 3370abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *src = tempImage; 3371abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3372abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3373abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3374abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3375abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 3376abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3377abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3378abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3379abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3380abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLshort *dstTexel = (GLshort *) dstRow; 3381abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3382abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3383abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLint) src[i]; 3384abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3385abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3386abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3387abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3388abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3389abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3390abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3391abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3392abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3393abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3394abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3395abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3396abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int32 */ 3397abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3398abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int32(TEXSTORE_PARAMS) 3399abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3400abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3401abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3402abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3403abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3404abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_INT32); 3405abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3406abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3407abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3408abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3409abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3410abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3411abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLint)); 3412abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3413abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!ctx->_ImageTransferState && 3414abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul !srcPacking->SwapBytes && 3415abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3416abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_INT) { 3417abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3418abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3419abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3420abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRowStride, 3421abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstImageOffsets, 3422abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3423abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3424abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3425abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3426abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3427abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 3428abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat, 3429abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseFormat, 3430abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, 3431abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcFormat, srcType, srcAddr, 3432abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcPacking); 3433abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *src = tempImage; 3434abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3435abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3436abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3437abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3438abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 3439abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3440abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3441abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3442abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3443abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint *dstTexel = (GLint *) dstRow; 3444abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3445abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3446abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLint) src[i]; 3447abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3448abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3449abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3450abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3451abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3452abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3453abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3454abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3455abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3456abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3457abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3458abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3459abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int8 */ 3460abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3461abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS) 3462abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3463abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3464abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3465abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3466abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3467abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT8); 3468abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3469abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3470abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3471abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3472abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3473abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3474abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLubyte)); 3475abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3476abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!ctx->_ImageTransferState && 3477abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul !srcPacking->SwapBytes && 3478abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3479abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_BYTE) { 3480abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3481abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3482abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3483abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRowStride, 3484abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstImageOffsets, 3485abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3486abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3487abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3488abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3489abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3490abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 3491abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat, 3492abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseFormat, 3493abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, 3494abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcFormat, srcType, srcAddr, 3495abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcPacking); 3496abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *src = tempImage; 3497abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3498abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3499abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3500abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3501abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 3502abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3503abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3504abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3505abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3506abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstTexel = (GLubyte *) dstRow; 3507abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3508abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3509abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLubyte) src[i]; 3510abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3511abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3512abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3513abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3514abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3515abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3516abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3517abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3518abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3519abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3520abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3521abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3522abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int16 */ 3523abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3524abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS) 3525abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3526abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3527abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3528abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3529abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3530abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT16); 3531abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3532abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3533abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3534abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3535abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3536abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3537abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLushort)); 3538abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3539abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!ctx->_ImageTransferState && 3540abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul !srcPacking->SwapBytes && 3541abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3542abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_SHORT) { 3543abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3544abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3545abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3546abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRowStride, 3547abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstImageOffsets, 3548abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3549abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3550abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3551abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3552abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3553abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 3554abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat, 3555abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseFormat, 3556abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, 3557abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcFormat, srcType, srcAddr, 3558abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcPacking); 3559abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *src = tempImage; 3560abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3561abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3562abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3563abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3564abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 3565abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3566abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3567abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3568abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3569abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLushort *dstTexel = (GLushort *) dstRow; 3570abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3571abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3572abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLushort) src[i]; 3573abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3574abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3575abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3576abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3577abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3578abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3579abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3580abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3581abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3582abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3583abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3584abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3585abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int32 */ 3586abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3587abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS) 3588abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3589abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3590abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3591abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3592abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3593abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT32); 3594abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3595abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3596abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3597abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3598abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3599abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3600abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLuint)); 3601abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3602abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!ctx->_ImageTransferState && 3603abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul !srcPacking->SwapBytes && 3604abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3605abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_INT) { 3606abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3607abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3608abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3609abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRowStride, 3610abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstImageOffsets, 3611abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3612abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3613abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3614abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3615abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3616abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 3617abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat, 3618abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseFormat, 3619abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, 3620abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcFormat, srcType, srcAddr, 3621abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcPacking); 3622abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *src = tempImage; 3623abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3624abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3625abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3626abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3627abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 3628abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3629abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3630abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3631abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3632abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLuint *dstTexel = (GLuint *) dstRow; 3633abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3634abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3635abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLuint) src[i]; 3636abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3637abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3638abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3639abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3640abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3641abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3642abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3643abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3644abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3645abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3646abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3647abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3648abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3649abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 36508d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#if FEATURE_EXT_texture_sRGB 365149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 36528d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgb8(TEXSTORE_PARAMS) 36538d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 36541f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 365546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 365646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 36571f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SRGB8); 365846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 365946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal rgb texstore code */ 36601f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_RGB888; 366146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 36620f91e4461fb3a7410c948acde270d97caa851ed6Brian Paul k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat, 366339de9251c4770fdcce3395643003aa626178446dBrian Paul newDstFormat, dstAddr, 366439de9251c4770fdcce3395643003aa626178446dBrian Paul dstXoffset, dstYoffset, dstZoffset, 366539de9251c4770fdcce3395643003aa626178446dBrian Paul dstRowStride, dstImageOffsets, 366639de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, srcDepth, 366739de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat, srcType, 366839de9251c4770fdcce3395643003aa626178446dBrian Paul srcAddr, srcPacking); 366946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 36708d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 36718d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 367254e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 367349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 36748d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgba8(TEXSTORE_PARAMS) 36758d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 36761f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 367746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 367846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 36791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SRGBA8); 368046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 368146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal rgba texstore code */ 36821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_RGBA8888; 368346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat, 368446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul newDstFormat, dstAddr, 368546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul dstXoffset, dstYoffset, dstZoffset, 368646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul dstRowStride, dstImageOffsets, 368746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcWidth, srcHeight, srcDepth, 368846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcFormat, srcType, 368946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcAddr, srcPacking); 369046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 36918d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 36928d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 369354e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 369449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 36955bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger_mesa_texstore_sargb8(TEXSTORE_PARAMS) 36965bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{ 36971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 36985bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger GLboolean k; 36995bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 37001f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SARGB8); 37015bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 37025bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger /* reuse normal rgba texstore code */ 37031f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_ARGB8888; 37045bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 37055bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat, 37065bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger newDstFormat, dstAddr, 37075bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger dstXoffset, dstYoffset, dstZoffset, 37085bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger dstRowStride, dstImageOffsets, 37095bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcWidth, srcHeight, srcDepth, 37105bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcFormat, srcType, 37115bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcAddr, srcPacking); 37125bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger return k; 37135bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger} 37145bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 37155bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 371649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 37178d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sl8(TEXSTORE_PARAMS) 37188d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 37191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 372046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 372146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 37221f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SL8); 372346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 37241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_L8; 372546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 372654e15d65858c1d1eeea7291059766686cf2e1671Brian Paul /* _mesa_textore_a8 handles luminance8 too */ 372754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul k = _mesa_texstore_a8(ctx, dims, baseInternalFormat, 372854e15d65858c1d1eeea7291059766686cf2e1671Brian Paul newDstFormat, dstAddr, 372954e15d65858c1d1eeea7291059766686cf2e1671Brian Paul dstXoffset, dstYoffset, dstZoffset, 373054e15d65858c1d1eeea7291059766686cf2e1671Brian Paul dstRowStride, dstImageOffsets, 373154e15d65858c1d1eeea7291059766686cf2e1671Brian Paul srcWidth, srcHeight, srcDepth, 373254e15d65858c1d1eeea7291059766686cf2e1671Brian Paul srcFormat, srcType, 373354e15d65858c1d1eeea7291059766686cf2e1671Brian Paul srcAddr, srcPacking); 373446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 37358d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 37368d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 373754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 373849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 37398d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sla8(TEXSTORE_PARAMS) 37408d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 37411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 374246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 374346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 37441f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SLA8); 374546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 374646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal luminance/alpha texstore code */ 37471f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_AL88; 374846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 37495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat, 37505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick newDstFormat, dstAddr, 37515d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstXoffset, dstYoffset, dstZoffset, 37525d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstRowStride, dstImageOffsets, 37535d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, 37545d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcFormat, srcType, 37555d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcAddr, srcPacking); 375646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 37578d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 37588d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 37599927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#else 37609927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu 37619927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu/* these are used only in texstore_funcs[] below */ 37629927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgb8 NULL 37639927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgba8 NULL 37649927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sargb8 NULL 37659927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sl8 NULL 37669927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sla8 NULL 37679927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu 37688d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#endif /* FEATURE_EXT_texture_sRGB */ 37698d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 3770f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3771485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3772485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3773485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/** 377439de9251c4770fdcce3395643003aa626178446dBrian Paul * Table mapping MESA_FORMAT_* to _mesa_texstore_*() 3775485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * XXX this is somewhat temporary. 3776485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */ 3777b1616b2a811b9a161d1ee2a8251e0efe32a8c192Ian Romanickstatic const struct { 3778485105ed182e2e997b084f047e72d5a2c3460057Brian Paul gl_format Name; 3779485105ed182e2e997b084f047e72d5a2c3460057Brian Paul StoreTexImageFunc Store; 3780485105ed182e2e997b084f047e72d5a2c3460057Brian Paul} 3781485105ed182e2e997b084f047e72d5a2c3460057Brian Paultexstore_funcs[MESA_FORMAT_COUNT] = 3782485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{ 3783bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_NONE, NULL }, 3784485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGBA8888, _mesa_texstore_rgba8888 }, 3785485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGBA8888_REV, _mesa_texstore_rgba8888 }, 3786485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB8888, _mesa_texstore_argb8888 }, 3787485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB8888_REV, _mesa_texstore_argb8888 }, 378874d61d03b54d72217d463c248468cdcd09320efcBrian Paul { MESA_FORMAT_XRGB8888, _mesa_texstore_argb8888 }, 37892d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer { MESA_FORMAT_XRGB8888_REV, _mesa_texstore_argb8888 }, 3790485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGB888, _mesa_texstore_rgb888 }, 3791485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_BGR888, _mesa_texstore_bgr888 }, 3792485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGB565, _mesa_texstore_rgb565 }, 3793485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGB565_REV, _mesa_texstore_rgb565 }, 3794485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB4444, _mesa_texstore_argb4444 }, 3795485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB4444_REV, _mesa_texstore_argb4444 }, 3796485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGBA5551, _mesa_texstore_rgba5551 }, 3797485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB1555, _mesa_texstore_argb1555 }, 3798485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB1555_REV, _mesa_texstore_argb1555 }, 37995d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_AL88, _mesa_texstore_unorm88 }, 38005d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_AL88_REV, _mesa_texstore_unorm88 }, 38015d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_AL1616, _mesa_texstore_unorm1616 }, 38025d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_AL1616_REV, _mesa_texstore_unorm1616 }, 3803485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGB332, _mesa_texstore_rgb332 }, 3804485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_A8, _mesa_texstore_a8 }, 3805485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_L8, _mesa_texstore_a8 }, 3806485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_I8, _mesa_texstore_a8 }, 3807485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_CI8, _mesa_texstore_ci8 }, 3808485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_YCBCR, _mesa_texstore_ycbcr }, 3809485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_YCBCR_REV, _mesa_texstore_ycbcr }, 38105d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_R8, _mesa_texstore_a8 }, 38115d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_RG88, _mesa_texstore_unorm88 }, 38125d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_RG88_REV, _mesa_texstore_unorm88 }, 38135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_R16, _mesa_texstore_r16 }, 38145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_RG1616, _mesa_texstore_unorm1616 }, 38155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_RG1616_REV, _mesa_texstore_unorm1616 }, 3816485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_Z24_S8, _mesa_texstore_z24_s8 }, 3817485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_S8_Z24, _mesa_texstore_s8_z24 }, 3818485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_Z16, _mesa_texstore_z16 }, 3819e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul { MESA_FORMAT_X8_Z24, _mesa_texstore_x8_z24 }, 3820c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca { MESA_FORMAT_Z24_X8, _mesa_texstore_z24_x8 }, 3821485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_Z32, _mesa_texstore_z32 }, 3822c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie { MESA_FORMAT_S8, _mesa_texstore_s8 }, 3823bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGB8, _mesa_texstore_srgb8 }, 3824bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGBA8, _mesa_texstore_srgba8 }, 3825bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SARGB8, _mesa_texstore_sargb8 }, 3826bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SL8, _mesa_texstore_sl8 }, 3827bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SLA8, _mesa_texstore_sla8 }, 3828bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGB_DXT1, _mesa_texstore_rgb_dxt1 }, 3829bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGBA_DXT1, _mesa_texstore_rgba_dxt1 }, 3830bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGBA_DXT3, _mesa_texstore_rgba_dxt3 }, 3831bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGBA_DXT5, _mesa_texstore_rgba_dxt5 }, 3832bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGB_FXT1, _mesa_texstore_rgb_fxt1 }, 3833bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_FXT1, _mesa_texstore_rgba_fxt1 }, 3834bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGB_DXT1, _mesa_texstore_rgb_dxt1 }, 3835bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_DXT1, _mesa_texstore_rgba_dxt1 }, 3836bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_DXT3, _mesa_texstore_rgba_dxt3 }, 3837bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_DXT5, _mesa_texstore_rgba_dxt5 }, 3838bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_FLOAT32, _mesa_texstore_rgba_float32 }, 3839bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_FLOAT16, _mesa_texstore_rgba_float16 }, 3840bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGB_FLOAT32, _mesa_texstore_rgba_float32 }, 3841bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGB_FLOAT16, _mesa_texstore_rgba_float16 }, 3842bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 }, 3843bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 }, 3844bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_LUMINANCE_FLOAT32, _mesa_texstore_rgba_float32 }, 3845bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_LUMINANCE_FLOAT16, _mesa_texstore_rgba_float16 }, 3846bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 }, 3847bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 }, 3848bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_INTENSITY_FLOAT32, _mesa_texstore_rgba_float32 }, 3849bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_INTENSITY_FLOAT16, _mesa_texstore_rgba_float16 }, 3850abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3851abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul { MESA_FORMAT_RGBA_INT8, _mesa_texstore_rgba_int8 }, 3852abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul { MESA_FORMAT_RGBA_INT16, _mesa_texstore_rgba_int16 }, 3853abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul { MESA_FORMAT_RGBA_INT32, _mesa_texstore_rgba_int32 }, 3854abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul { MESA_FORMAT_RGBA_UINT8, _mesa_texstore_rgba_uint8 }, 3855abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul { MESA_FORMAT_RGBA_UINT16, _mesa_texstore_rgba_uint16 }, 3856abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul { MESA_FORMAT_RGBA_UINT32, _mesa_texstore_rgba_uint32 }, 3857abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3858bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_DUDV8, _mesa_texstore_dudv8 }, 385984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 386084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul { MESA_FORMAT_SIGNED_R8, _mesa_texstore_signed_r8 }, 386184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul { MESA_FORMAT_SIGNED_RG88, _mesa_texstore_signed_rg88 }, 386284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul { MESA_FORMAT_SIGNED_RGBX8888, _mesa_texstore_signed_rgbx8888 }, 386384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 3864bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SIGNED_RGBA8888, _mesa_texstore_signed_rgba8888 }, 3865bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SIGNED_RGBA8888_REV, _mesa_texstore_signed_rgba8888 }, 386684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 3867279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul { MESA_FORMAT_SIGNED_R_16, _mesa_texstore_signed_rgba_16 }, 3868279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul { MESA_FORMAT_SIGNED_RG_16, _mesa_texstore_signed_rgba_16 }, 3869279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul { MESA_FORMAT_SIGNED_RGB_16, _mesa_texstore_signed_rgba_16 }, 387017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul { MESA_FORMAT_SIGNED_RGBA_16, _mesa_texstore_signed_rgba_16 }, 387117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul { MESA_FORMAT_RGBA_16, _mesa_texstore_rgba_16 } 3872485105ed182e2e997b084f047e72d5a2c3460057Brian Paul}; 3873485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3874485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3875920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wustatic GLboolean 3876920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu_mesa_texstore_null(TEXSTORE_PARAMS) 3877920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu{ 3878920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) ctx; (void) dims; 3879920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) baseInternalFormat; 3880920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstFormat; 3881920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstAddr; 3882920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstXoffset; (void) dstYoffset; (void) dstZoffset; 3883920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstRowStride; (void) dstImageOffsets; 3884920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcWidth; (void) srcHeight; (void) srcDepth; 3885920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcFormat; (void) srcType; 3886920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcAddr; 3887920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcPacking; 3888920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 3889920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu /* should never happen */ 3890920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu _mesa_problem(NULL, "_mesa_texstore_null() is called"); 3891920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu return GL_FALSE; 3892920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu} 3893920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 3894920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 3895485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/** 3896485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Return the StoreTexImageFunc pointer to store an image in the given format. 3897485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */ 3898e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paulstatic StoreTexImageFunc 3899485105ed182e2e997b084f047e72d5a2c3460057Brian Paul_mesa_get_texstore_func(gl_format format) 3900485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{ 3901bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul#ifdef DEBUG 39021f1bfe8cb5c74ee8708fb717a19d8389c9fadb80Brian Paul GLuint i; 3903485105ed182e2e997b084f047e72d5a2c3460057Brian Paul for (i = 0; i < MESA_FORMAT_COUNT; i++) { 3904bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul ASSERT(texstore_funcs[i].Name == i); 3905485105ed182e2e997b084f047e72d5a2c3460057Brian Paul } 3906bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul#endif 3907bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul ASSERT(texstore_funcs[format].Name == format); 3908920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 3909920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu if (texstore_funcs[format].Store) 3910920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu return texstore_funcs[format].Store; 3911920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu else 3912920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu return _mesa_texstore_null; 3913485105ed182e2e997b084f047e72d5a2c3460057Brian Paul} 3914485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3915485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3916660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul/** 3917660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Store user data into texture memory. 3918660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Called via glTex[Sub]Image1/2/3D() 3919660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul */ 3920660ca9c5a23240abca084089a626d4a94ef0799fBrian PaulGLboolean 3921660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul_mesa_texstore(TEXSTORE_PARAMS) 3922660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul{ 3923660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul StoreTexImageFunc storeImage; 3924660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul GLboolean success; 3925660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 39261f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul storeImage = _mesa_get_texstore_func(dstFormat); 3927660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 3928660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul success = storeImage(ctx, dims, baseInternalFormat, 3929660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3930660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul dstRowStride, dstImageOffsets, 3931660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul srcWidth, srcHeight, srcDepth, 3932660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul srcFormat, srcType, srcAddr, srcPacking); 3933660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul return success; 3934660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul} 3935660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 3936485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 39377a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul/** 3938c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Check if an unpack PBO is active prior to fetching a texture image. 3939c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * If so, do bounds checking and map the buffer into main memory. 3940c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Any errors detected will be recorded. 394171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell * The caller _must_ call _mesa_unmap_teximage_pbo() too! 39427a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul */ 394371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellconst GLvoid * 3944f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_validate_pbo_teximage(struct gl_context *ctx, GLuint dimensions, 394571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLsizei width, GLsizei height, GLsizei depth, 394671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLenum format, GLenum type, const GLvoid *pixels, 394771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const struct gl_pixelstore_attrib *unpack, 394871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const char *funcName) 39497a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul{ 3950c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul GLubyte *buf; 3951c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 3952434ec3ada841915a00ffc23f699401eb3e7b37eeBrian Paul if (!_mesa_is_bufferobj(unpack->BufferObj)) { 39537a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul /* no PBO */ 39547a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return pixels; 39557a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul } 395660909388ab136d849d99eab49e782a53772a618fBrian Paul if (!_mesa_validate_pbo_access(dimensions, unpack, width, height, depth, 395760909388ab136d849d99eab49e782a53772a618fBrian Paul format, type, pixels)) { 3958c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(invalid PBO access"); 3959c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul return NULL; 39607a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul } 3961c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 3962a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, 3963a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul GL_READ_ONLY_ARB, unpack->BufferObj); 3964c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul if (!buf) { 3965c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(PBO is mapped"); 3966c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul return NULL; 3967c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul } 3968c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 3969c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul return ADD_POINTERS(buf, pixels); 39707a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul} 39717a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 39727a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 39737a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul/** 3974c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Check if an unpack PBO is active prior to fetching a compressed texture 3975c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * image. 3976c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * If so, do bounds checking and map the buffer into main memory. 3977c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Any errors detected will be recorded. 397871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell * The caller _must_ call _mesa_unmap_teximage_pbo() too! 39797a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul */ 398071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellconst GLvoid * 3981f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_validate_pbo_compressed_teximage(struct gl_context *ctx, 3982c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul GLsizei imageSize, const GLvoid *pixels, 3983c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul const struct gl_pixelstore_attrib *packing, 3984c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul const char *funcName) 39857a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul{ 3986c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul GLubyte *buf; 3987c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 3988434ec3ada841915a00ffc23f699401eb3e7b37eeBrian Paul if (!_mesa_is_bufferobj(packing->BufferObj)) { 39897a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul /* not using a PBO - return pointer unchanged */ 39907a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return pixels; 39917a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul } 3992c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul if ((const GLubyte *) pixels + imageSize > 3993f285f0d8f60adafdfba5c1f0563b81c68bd398d3Brian Paul ((const GLubyte *) 0) + packing->BufferObj->Size) { 3994c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul /* out of bounds read! */ 3995c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(invalid PBO access"); 3996c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul return NULL; 3997c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul } 3998c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 3999a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul buf = (GLubyte*) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, 4000a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul GL_READ_ONLY_ARB, packing->BufferObj); 4001c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul if (!buf) { 4002c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(PBO is mapped"); 4003c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul return NULL; 40047a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul } 4005c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 4006c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul return ADD_POINTERS(buf, pixels); 40077a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul} 40087a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 40097a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 4010c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul/** 4011c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * This function must be called after either of the validate_pbo_*_teximage() 4012c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * functions. It unmaps the PBO buffer if it was mapped earlier. 4013c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul */ 401471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellvoid 4015f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_unmap_teximage_pbo(struct gl_context *ctx, 4016c039af165d5919008c6df599795951f85dea164dBrian Paul const struct gl_pixelstore_attrib *unpack) 4017c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul{ 4018434ec3ada841915a00ffc23f699401eb3e7b37eeBrian Paul if (_mesa_is_bufferobj(unpack->BufferObj)) { 4019c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, 4020c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul unpack->BufferObj); 4021c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul } 4022c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul} 4023c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 402489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 4025b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul/** Return texture size in bytes */ 4026b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paulstatic GLuint 4027b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paultexture_size(const struct gl_texture_image *texImage) 4028da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul{ 402932aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul GLuint sz = _mesa_format_image_size(texImage->TexFormat, texImage->Width, 403032aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul texImage->Height, texImage->Depth); 4031b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul return sz; 4032da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul} 4033da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul 4034da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul 4035b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul/** Return row stride in bytes */ 4036b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paulstatic GLuint 4037b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paultexture_row_stride(const struct gl_texture_image *texImage) 40385999c5b620236fb6a996cf56759aec31f01c126bBrian Paul{ 403982bcc1c5d27b825db7f002c3c183bd1dc7833438Brian Paul GLuint stride = _mesa_format_row_stride(texImage->TexFormat, 4040b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Width); 4041b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul return stride; 40425999c5b620236fb6a996cf56759aec31f01c126bBrian Paul} 40435999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 40445999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 40455999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 4046ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul/** 404789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexImage1D() 4048f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * and Driver.CopyTexImage1D(). 40496b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d() 40508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 40518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4052f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage1d(struct gl_context *ctx, GLenum target, GLint level, 40538e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 40548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint border, 40558e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 40568e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 40578e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 40588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 40598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 406032aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul GLuint sizeInBytes; 4061a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 40628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 40638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul /* allocate memory */ 4064b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul sizeInBytes = texture_size(texImage); 40654cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul texImage->Data = _mesa_alloc_texmemory(sizeInBytes); 40667d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul if (!texImage->Data) { 40677d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); 40687d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 40697d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 40708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 4071e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type, 4072e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexImage1D"); 40736b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul if (!pixels) { 40746b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul /* Note: we check for a NULL image pointer here, _after_ we allocated 40756b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * memory for the texture. That's what the GL spec calls for. 40766b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul */ 407789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 40786b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul } 40796b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul else { 4080b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLint dstRowStride = 0; 4081b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLboolean success = _mesa_texstore(ctx, 1, texImage->_BaseFormat, 4082b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->TexFormat, 4083b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Data, 4084b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 4085b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul dstRowStride, 4086b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->ImageOffsets, 4087b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul width, 1, 1, 4088b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul format, type, pixels, packing); 4089f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!success) { 4090f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); 4091f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 4092f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 4093f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul 409471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 40958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 40968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 40978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 40986b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/** 409989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexImage2D() 410089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexImage2D(). 41016b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * 4102b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * This function is oriented toward storing images in main memory, rather 4103b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * than VRAM. Device driver's can easily plug in their own replacement. 41048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 41058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4106f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage2d(struct gl_context *ctx, GLenum target, GLint level, 41078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 41088e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint border, 41098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 41108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 41118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 41128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 41138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 411432aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul GLuint sizeInBytes; 4115a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 41168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 41178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul /* allocate memory */ 4118b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul sizeInBytes = texture_size(texImage); 41194cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul texImage->Data = _mesa_alloc_texmemory(sizeInBytes); 41207d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul if (!texImage->Data) { 41217d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); 41227d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 41237d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 41248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 412571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type, 4126e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexImage2D"); 41276b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul if (!pixels) { 41286b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul /* Note: we check for a NULL image pointer here, _after_ we allocated 41296b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * memory for the texture. That's what the GL spec calls for. 41306b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul */ 413189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 41326b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul } 41336b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul else { 4134b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLint dstRowStride = texture_row_stride(texImage); 4135b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLboolean success = _mesa_texstore(ctx, 2, texImage->_BaseFormat, 4136b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->TexFormat, 4137b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Data, 4138b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 4139b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul dstRowStride, 4140b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->ImageOffsets, 4141b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul width, height, 1, 4142b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul format, type, pixels, packing); 4143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!success) { 4144f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); 4145f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 4146f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 4147f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul 414871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 41498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 41508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 41518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 41528e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 41536b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/** 415489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexImage3D() 415589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexImage3D(). 41566b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d() 41578e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 41588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4159f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage3d(struct gl_context *ctx, GLenum target, GLint level, 41608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 41618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, GLint border, 41628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 41638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 41648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 41658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 41668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 416732aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul GLuint sizeInBytes; 4168a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 41698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 41708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul /* allocate memory */ 4171b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul sizeInBytes = texture_size(texImage); 41724cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul texImage->Data = _mesa_alloc_texmemory(sizeInBytes); 41737d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul if (!texImage->Data) { 41747d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D"); 41757d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 41767d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 41778e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 4178e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format, 4179e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul type, pixels, packing, "glTexImage3D"); 41806b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul if (!pixels) { 41816b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul /* Note: we check for a NULL image pointer here, _after_ we allocated 41826b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * memory for the texture. That's what the GL spec calls for. 41836b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul */ 418489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 41856b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul } 41866b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul else { 4187b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLint dstRowStride = texture_row_stride(texImage); 4188b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLboolean success = _mesa_texstore(ctx, 3, texImage->_BaseFormat, 4189b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->TexFormat, 4190b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Data, 4191b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 4192b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul dstRowStride, 4193b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->ImageOffsets, 4194b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul width, height, depth, 4195b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul format, type, pixels, packing); 4196f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!success) { 4197f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D"); 4198f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 4199f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 4200f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul 420171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 42028e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 42038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 420889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage1D() 420989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage1D(). 42108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 42118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4212f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage1d(struct gl_context *ctx, GLenum target, GLint level, 42138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint width, 42148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 42158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 42168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 42178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 42188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 4219b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 4220e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type, 4221e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexSubImage1D"); 42227a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!pixels) 42237a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 42247a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 4225f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul { 4226b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLint dstRowStride = 0; 4227b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLboolean success = _mesa_texstore(ctx, 1, texImage->_BaseFormat, 4228b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->TexFormat, 4229b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Data, 4230b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul xoffset, 0, 0, /* offsets */ 4231b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul dstRowStride, 4232b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->ImageOffsets, 4233b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul width, 1, 1, 4234b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul format, type, pixels, packing); 4235f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!success) { 4236f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D"); 4237f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 4238f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 42393893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul 424071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 42418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 42428e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 424489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 4245f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 424689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage2D() 424789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage2D(). 42488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 42498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4250f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage2d(struct gl_context *ctx, GLenum target, GLint level, 42518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint yoffset, 42528e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, 42538e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 42548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 42558e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 42568e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 42578e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 4258b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 425971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type, 4260e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexSubImage2D"); 42617a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!pixels) 42627a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 42637a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 4264f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul { 4265b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLint dstRowStride = texture_row_stride(texImage); 4266b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLboolean success = _mesa_texstore(ctx, 2, texImage->_BaseFormat, 4267b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->TexFormat, 4268b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Data, 4269b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul xoffset, yoffset, 0, 4270b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul dstRowStride, 4271b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->ImageOffsets, 4272b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul width, height, 1, 4273b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul format, type, pixels, packing); 4274f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!success) { 4275f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D"); 4276f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 4277f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 42783893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul 427971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 42808e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 42818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42828e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42838e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 42848e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * This is the software fallback for Driver.TexSubImage3D(). 428589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage3D(). 42868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 42878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4288f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage3d(struct gl_context *ctx, GLenum target, GLint level, 42898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 42908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, 42918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 42928e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 42938e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 42948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 42958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 4296b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 4297e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format, 4298e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul type, pixels, packing, 4299e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul "glTexSubImage3D"); 4300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!pixels) 4301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return; 4302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 4303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul { 4304b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLint dstRowStride = texture_row_stride(texImage); 4305b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLboolean success = _mesa_texstore(ctx, 3, texImage->_BaseFormat, 4306b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->TexFormat, 4307b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Data, 4308b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul xoffset, yoffset, zoffset, 4309b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul dstRowStride, 4310b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->ImageOffsets, 4311b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul width, height, depth, 4312b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul format, type, pixels, packing); 4313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!success) { 4314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage3D"); 4315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 4316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 43178f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul 431871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 43198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 43208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43222aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul/* 43238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage1D() 43248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 43258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4326f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_teximage1d(struct gl_context *ctx, GLenum target, GLint level, 43278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 43288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint border, 43298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLsizei imageSize, const GLvoid *data, 43308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 43318e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 43328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 433389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* this space intentionally left blank */ 4334a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 4335a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 4336a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) internalFormat; 4337a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) border; 4338a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 4339a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 4340a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 43418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 43428e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 4345b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul/** 43468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage2D() 43478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 43488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4349f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_teximage2d(struct gl_context *ctx, GLenum target, GLint level, 43508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 43518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint border, 43528e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLsizei imageSize, const GLvoid *data, 43538e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 43548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 43558e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 4356a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) height; (void) border; 4357a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul 435889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* This is pretty simple, basically just do a memcpy without worrying 435989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * about the usual image unpacking or image transfer operations. 43608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 436189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texObj); 436289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage); 436389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Width > 0); 436489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Height > 0); 436589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Depth == 1); 436689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Data == NULL); /* was freed in glCompressedTexImage2DARB */ 436789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 436889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* allocate storage */ 43694cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul texImage->Data = _mesa_alloc_texmemory(imageSize); 437089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (!texImage->Data) { 437189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2DARB"); 437289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 437389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 437489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 4375e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data, 4376e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul &ctx->Unpack, 4377e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul "glCompressedTexImage2D"); 43787a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!data) 43797a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 43807a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 438189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* copy the data */ 4382e197de56cdb86835f1437688a9161cd909792d80Brian Paul memcpy(texImage->Data, data, imageSize); 43838f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul 438471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack); 43858e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 43868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43888e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 43908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage3D() 43918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 43928e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4393f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_teximage3d(struct gl_context *ctx, GLenum target, GLint level, 43948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 43958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, 43968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint border, 43978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLsizei imageSize, const GLvoid *data, 43988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 43998e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 44008e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 440189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* this space intentionally left blank */ 4402a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 4403a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 4404a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) internalFormat; 4405a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) height; (void) depth; 4406a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 4407a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 4408a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 4409a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 44108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 44118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 44128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 44138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 441489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 441589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage1D() 4416e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul */ 4417e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paulvoid 4418f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage1d(struct gl_context *ctx, GLenum target, 441989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint level, 442089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLsizei width, 442189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 442289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei imageSize, const GLvoid *data, 442389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_object *texObj, 442489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage) 4425e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul{ 44265999c5b620236fb6a996cf56759aec31f01c126bBrian Paul /* there are no compressed 1D texture formats yet */ 4427a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 4428a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 4429a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) xoffset; (void) width; 4430a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) format; 4431a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 4432a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 4433a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 4434e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul} 4435e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 4436e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 443789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 443889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage2D() 443989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 444089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid 4441f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage2d(struct gl_context *ctx, GLenum target, 444289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint level, 444389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLint yoffset, 444489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei width, GLsizei height, 444589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 444689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei imageSize, const GLvoid *data, 444789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_object *texObj, 444889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage) 444989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 445089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint bytesPerRow, destRowStride, srcRowStride; 445189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint i, rows; 445289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLubyte *dest; 445389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul const GLubyte *src; 44541f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const gl_format texFormat = texImage->TexFormat; 4455bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul const GLint destWidth = texImage->Width; 4456d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul GLuint bw, bh; 44575999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 4458d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul _mesa_get_format_block_size(texFormat, &bw, &bh); 44595999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 4460d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul (void) level; 4461a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) format; 446289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 446389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* these should have been caught sooner */ 4464d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((width % bw) == 0 || width == 2 || width == 1); 4465d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((height % bh) == 0 || height == 2 || height == 1); 4466d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((xoffset % bw) == 0); 4467d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((yoffset % bh) == 0); 446889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 4469b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 4470e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data, 4471e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul &ctx->Unpack, 4472e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul "glCompressedTexSubImage2D"); 44737a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!data) 44747a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 44757a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 44762594168e9f3cdc4ac53c925486491167837cda30Brian Paul srcRowStride = _mesa_format_row_stride(texFormat, width); 447789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul src = (const GLubyte *) data; 447889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 44792594168e9f3cdc4ac53c925486491167837cda30Brian Paul destRowStride = _mesa_format_row_stride(texFormat, destWidth); 448089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul dest = _mesa_compressed_image_address(xoffset, yoffset, 0, 4481bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul texFormat, destWidth, 4482a5467697336f201abee19cba1521be80e5c87d3bBrian Paul (GLubyte *) texImage->Data); 448389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 4484bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul bytesPerRow = srcRowStride; /* bytes per row of blocks */ 4485d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul rows = height / bh; /* rows in blocks */ 448689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 4487bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul /* copy rows of blocks */ 448889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul for (i = 0; i < rows; i++) { 4489e197de56cdb86835f1437688a9161cd909792d80Brian Paul memcpy(dest, src, bytesPerRow); 449089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul dest += destRowStride; 449189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul src += srcRowStride; 449289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 44938f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul 449471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack); 449589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 449689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 449789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 449889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 449989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage3D() 450089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 450189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid 4502f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage3d(struct gl_context *ctx, GLenum target, 450389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint level, 450489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 450589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei width, GLsizei height, GLsizei depth, 450689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 450789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei imageSize, const GLvoid *data, 450889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_object *texObj, 450989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage) 451089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 45115999c5b620236fb6a996cf56759aec31f01c126bBrian Paul /* there are no compressed 3D texture formats yet */ 4512a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 4513a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 4514a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) xoffset; (void) yoffset; (void) zoffset; 4515a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) height; (void) depth; 4516a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) format; 4517a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 4518a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 4519a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 452089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 4521