texstore.c revision 229ebf511dcd9b501d9299cfc06d029d1d50079d
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" 61db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h" 620117da40cd7edd3d165bb28569c289b37eca12b9Vinson Lee#include "mtypes.h" 631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pack.h" 64b70610b9823fc7dc3672735c11be1a75fbb1a2a4Brian Paul#include "pbo.h" 653c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 6689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul#include "texcompress.h" 67da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_fxt1.h" 688d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "texcompress_rgtc.h" 69da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_s3tc.h" 708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "teximage.h" 718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h" 722e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell#include "enums.h" 731271424615b62544662a606bb23f6d7117a8b0e7Marek Olšák#include "../../gallium/auxiliary/util/u_format_rgb9e5.h" 74631d23daa91c569bf268a2191bd466df73a64263Marek Olšák#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h" 758e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 76248200737398a7d6403a23930a6c9d93db06b942Brian Paul 77fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum { 78fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell ZERO = 4, 79fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell ONE = 5 80fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 8171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 82248200737398a7d6403a23930a6c9d93db06b942Brian Paul 83248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 84e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul * Texture image storage function. 85e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul */ 86e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paultypedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS); 87e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul 88e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul 89e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul/** 90248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Return GL_TRUE if the given image format is one that be converted 91248200737398a7d6403a23930a6c9d93db06b942Brian Paul * to another format by swizzling. 92248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 93248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic GLboolean 94248200737398a7d6403a23930a6c9d93db06b942Brian Paulcan_swizzle(GLenum logicalBaseFormat) 9571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 9671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell switch (logicalBaseFormat) { 9771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_RGBA: 9871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_RGB: 9971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_LUMINANCE_ALPHA: 10071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_INTENSITY: 10171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_ALPHA: 10271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_LUMINANCE: 1033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_RED: 1043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_GREEN: 1053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BLUE: 1063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGR: 1073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGRA: 1083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_ABGR_EXT: 1095d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG: 11071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell return GL_TRUE; 11171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell default: 11271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell return GL_FALSE; 11371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 11471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell} 11571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 1163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 118fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum { 119fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_LUMINANCE = 0, 120fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_ALPHA, 121fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_INTENSITY, 122fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_LUMINANCE_ALPHA, 123fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_RGB, 124fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_RGBA, 1253aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RED, 1263aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_GREEN, 1273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BLUE, 1283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGR, 1293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGRA, 1303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ABGR, 1315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick IDX_RG, 132fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell MAX_IDX 133fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 134fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 1353aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP1(x) MAP4(x, ZERO, ZERO, ZERO) 1363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP2(x,y) MAP4(x, y, ZERO, ZERO) 1373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP3(x,y,z) MAP4(x, y, z, ZERO) 1383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE } 139fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 140fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 1412e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwellstatic const struct { 1423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte format_idx; 1433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte to_rgba[6]; 1443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte from_rgba[6]; 1453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell} mappings[MAX_IDX] = 146fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{ 147fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_LUMINANCE, 1493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,0,0,ONE), 1503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0) 151fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 152fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 153fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ALPHA, 1553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, ZERO, ZERO, 0), 1563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(3) 157fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 158fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 159fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_INTENSITY, 1613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0, 0, 0, 0), 1623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0), 163fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 164fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 165fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_LUMINANCE_ALPHA, 1673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,0,0,1), 1683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP2(0,3) 169fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 170fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 171fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RGB, 1733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,ONE), 1743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP3(0,1,2) 175fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 176fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 177fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RGBA, 1793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,3), 1803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,3), 1813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RED, 1853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0, ZERO, ZERO, ONE), 1863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0), 1873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_GREEN, 1913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, 0, ZERO, ONE), 1923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(1), 1933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BLUE, 1973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, ZERO, 0, ONE), 1983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(2), 1993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 2023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGR, 2033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,ONE), 2043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP3(2,1,0) 2053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 2083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGRA, 2093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,3), 2103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,3) 2113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 2143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ABGR, 2153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(3,2,1,0), 2163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(3,2,1,0) 2173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 2195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { 2205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick IDX_RG, 2215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick MAP4(0, 1, ZERO, ONE), 2225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick MAP2(0, 1) 2235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick }, 224fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 225fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 226fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 227fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 228248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 229248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Convert a GL image format enum to an IDX_* value (see above). 230248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 231248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic int 232248200737398a7d6403a23930a6c9d93db06b942Brian Paulget_map_idx(GLenum value) 233fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{ 234fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell switch (value) { 235fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_LUMINANCE: return IDX_LUMINANCE; 236fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_ALPHA: return IDX_ALPHA; 237fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_INTENSITY: return IDX_INTENSITY; 238fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA; 239fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_RGB: return IDX_RGB; 240fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_RGBA: return IDX_RGBA; 2413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_RED: return IDX_RED; 2423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_GREEN: return IDX_GREEN; 2433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BLUE: return IDX_BLUE; 2443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGR: return IDX_BGR; 2453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGRA: return IDX_BGRA; 2463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_ABGR_EXT: return IDX_ABGR; 2475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG: return IDX_RG; 248fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell default: 249fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell _mesa_problem(NULL, "Unexpected inFormat"); 250fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell return 0; 251fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell } 252fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell} 253fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * When promoting texture formats (see below) we need to compute the 257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * mapping of dest components back to source components. 258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * This function does that. 259fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param inFormat the incoming format of the texture 260fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param outFormat the final texture format 261fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \return map[6] a full 6-component map 262f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 2633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellstatic void 2643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellcompute_component_mapping(GLenum inFormat, GLenum outFormat, 2653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte *map) 266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 267248200737398a7d6403a23930a6c9d93db06b942Brian Paul const int inFmt = get_map_idx(inFormat); 268248200737398a7d6403a23930a6c9d93db06b942Brian Paul const int outFmt = get_map_idx(outFormat); 269248200737398a7d6403a23930a6c9d93db06b942Brian Paul const GLubyte *in2rgba = mappings[inFmt].to_rgba; 270248200737398a7d6403a23930a6c9d93db06b942Brian Paul const GLubyte *rgba2out = mappings[outFmt].from_rgba; 2713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell int i; 2722e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell 2733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell for (i = 0; i < 4; i++) 2743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[i] = in2rgba[rgba2out[i]]; 2753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[ZERO] = ZERO; 2773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[ONE] = ONE; 2783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2796b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#if 0 280298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n", 281298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inFormat, _mesa_lookup_enum_by_nr(inFormat), 282298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg outFormat, _mesa_lookup_enum_by_nr(outFormat), 283298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[0], 284298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[1], 285298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[2], 286298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[3], 287298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[4], 288298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[5]); 2896b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#endif 290f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLfloat components. 295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations. 296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters. 297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format 29839de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures. So, we might 299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead. 300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do. 301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx the rendering context 303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims image dimensions: 1, 2 or 3 304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat basic texture derived from the user's 305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * internal texture format value 306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat the actual basic format of the texture 307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth source image width 308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight source image height 309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth source image depth 310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat source image format 311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType source image type 312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr source image address 313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking source image pixel packing 314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLfloat. 315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 316e792e79f5ae6be008d9521eccf1c647492cd682aDave AirlieGLfloat * 317e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie_mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims, 318e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLenum logicalBaseFormat, 319e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLenum textureBaseFormat, 320e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLint srcWidth, GLint srcHeight, GLint srcDepth, 321e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLenum srcFormat, GLenum srcType, 322e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLvoid *srcAddr, 323e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const struct gl_pixelstore_attrib *srcPacking, 324e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLbitfield transferOps) 325f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 326f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *tempImage; 327a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt const GLint components = _mesa_components_in_format(logicalBaseFormat); 328a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt const GLint srcStride = 329a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 330a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt GLfloat *dst; 331a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt GLint img, row; 332f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 333f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(dims >= 1 && dims <= 3); 334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(logicalBaseFormat == GL_RGBA || 336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_RGB || 3375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RG || 3385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RED || 339f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE_ALPHA || 340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE || 341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_ALPHA || 342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_INTENSITY || 343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_DEPTH_COMPONENT); 344f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(textureBaseFormat == GL_RGBA || 346f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_RGB || 3475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RG || 3485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RED || 349f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA || 350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE || 351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_ALPHA || 352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_INTENSITY || 353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_DEPTH_COMPONENT); 354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 355a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt tempImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth 356a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt * components * sizeof(GLfloat)); 357a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt if (!tempImage) 358a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt return NULL; 359f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 360a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt dst = tempImage; 361a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt for (img = 0; img < srcDepth; img++) { 362a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt const GLubyte *src 363a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 364a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt srcWidth, srcHeight, 365a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt srcFormat, srcType, 366a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt img, 0, 0); 367a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt for (row = 0; row < srcHeight; row++) { 368a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat, 369a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt dst, srcFormat, srcType, src, 370a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt srcPacking, transferOps); 371a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt dst += srcWidth * components; 372a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt src += srcStride; 373f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (logicalBaseFormat != textureBaseFormat) { 377f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* more work */ 378f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint texComponents = _mesa_components_in_format(textureBaseFormat); 379f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *newImage; 381f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i, n; 3823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[6]; 383f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 38413ad04719e292a2bee7e1b3155da74a97921c035Brian Paul /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 38513ad04719e292a2bee7e1b3155da74a97921c035Brian Paul ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 38613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA); 387f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 388f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* The actual texture format should have at least as many components 389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * as the logical texture format. 390f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(texComponents >= logComponents); 392f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 39332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg newImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth 394f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * texComponents * sizeof(GLfloat)); 395f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!newImage) { 39632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 397f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 398f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 4003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 402f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul n = srcWidth * srcHeight * srcDepth; 403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < n; i++) { 404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint k; 405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (k = 0; k < texComponents; k++) { 406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint j = map[k]; 407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (j == ZERO) 408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 0.0F; 409f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (j == ONE) 410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 1.0F; 411f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else 412f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 413f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 415f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 41632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 417f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul tempImage = newImage; 418f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 419f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return tempImage; 421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 423f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 424f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 425dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * Make temporary image with uint pixel values. Used for unsigned 426dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * integer-valued textures. 427dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul */ 428dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulstatic GLuint * 429dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulmake_temp_uint_image(struct gl_context *ctx, GLuint dims, 430dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLenum logicalBaseFormat, 431dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLenum textureBaseFormat, 432dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 433dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLenum srcFormat, GLenum srcType, 434dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLvoid *srcAddr, 435dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const struct gl_pixelstore_attrib *srcPacking) 436dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul{ 437dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLuint *tempImage; 438dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLint components = _mesa_components_in_format(logicalBaseFormat); 439dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLint srcStride = 440dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 441dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLuint *dst; 442dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint img, row; 443dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 444dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(dims >= 1 && dims <= 3); 445dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 446dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(logicalBaseFormat == GL_RGBA || 447dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_RGB || 448dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_RG || 449dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_RED || 450dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_LUMINANCE_ALPHA || 451dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_LUMINANCE || 452dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_INTENSITY || 453dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_ALPHA); 454dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 455dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(textureBaseFormat == GL_RGBA || 456dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_RGB || 457dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_RG || 458dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_RED || 459dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA || 460dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_LUMINANCE || 461dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_ALPHA); 462dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 463dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul tempImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth 464dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * components * sizeof(GLuint)); 465dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul if (!tempImage) 466dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul return NULL; 467dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 468dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dst = tempImage; 469dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul for (img = 0; img < srcDepth; img++) { 470dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLubyte *src 471dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 472dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, 473dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, 474dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul img, 0, 0); 475dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul for (row = 0; row < srcHeight; row++) { 476dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul _mesa_unpack_color_span_uint(ctx, srcWidth, logicalBaseFormat, 477dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dst, srcFormat, srcType, src, 478dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcPacking); 479dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dst += srcWidth * components; 480dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul src += srcStride; 481dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 482dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 483dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 484dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul if (logicalBaseFormat != textureBaseFormat) { 485dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul /* more work */ 486dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint texComponents = _mesa_components_in_format(textureBaseFormat); 487dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 488dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLuint *newImage; 489dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint i, n; 490dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLubyte map[6]; 491dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 492dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 493dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 494dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA); 495dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 496dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul /* The actual texture format should have at least as many components 497dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * as the logical texture format. 498dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul */ 499dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(texComponents >= logComponents); 500dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 501dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul newImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth 502dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * texComponents * sizeof(GLuint)); 503dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul if (!newImage) { 504dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul free(tempImage); 505dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul return NULL; 506dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 507dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 508dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 509dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 510dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul n = srcWidth * srcHeight * srcDepth; 511dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul for (i = 0; i < n; i++) { 512dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint k; 513dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul for (k = 0; k < texComponents; k++) { 514dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint j = map[k]; 515dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul if (j == ZERO) 516dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul newImage[i * texComponents + k] = 0.0F; 517dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul else if (j == ONE) 518dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul newImage[i * texComponents + k] = 1.0F; 519dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul else 520dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 521dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 522dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 523dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 524dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul free(tempImage); 525dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul tempImage = newImage; 526dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 527dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 528dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul return tempImage; 529dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul} 530dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 531dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 532dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 533dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul/** 534663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * Make a temporary (color) texture image with GLubyte components. 535f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations. 536f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters. 537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format 53839de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures. So, we might 539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead. 540f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do. 541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx the rendering context 543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims image dimensions: 1, 2 or 3 544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat basic texture derived from the user's 545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * internal texture format value 546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat the actual basic format of the texture 547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth source image width 548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight source image height 549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth source image depth 550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat source image format 551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType source image type 552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr source image address 553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking source image pixel packing 554663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * \return resulting image with format = textureBaseFormat and type = GLubyte. 555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 556663f61a3e177a443c36f414a16a9d5f94e74135dBrian PaulGLubyte * 557663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul_mesa_make_temp_ubyte_image(struct gl_context *ctx, GLuint dims, 558663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLenum logicalBaseFormat, 559663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLenum textureBaseFormat, 560663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 561663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLenum srcFormat, GLenum srcType, 562663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLvoid *srcAddr, 563663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const struct gl_pixelstore_attrib *srcPacking) 564f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 565f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLuint transferOps = ctx->_ImageTransferState; 566f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint components = _mesa_components_in_format(logicalBaseFormat); 567f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 568663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLubyte *tempImage, *dst; 569f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 570f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(dims >= 1 && dims <= 3); 571f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 572f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(logicalBaseFormat == GL_RGBA || 573f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_RGB || 5745d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RG || 5755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RED || 576f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE_ALPHA || 577f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE || 578f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_ALPHA || 579f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_INTENSITY); 580f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 581f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(textureBaseFormat == GL_RGBA || 582f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_RGB || 5835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RG || 5845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RED || 585f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA || 586f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE || 587f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_ALPHA || 588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_INTENSITY); 589f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 590f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* unpack and transfer the source image */ 591663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul tempImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth 592663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * components * sizeof(GLubyte)); 59396128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee if (!tempImage) { 594f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 59596128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee } 596f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 597f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst = tempImage; 598f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 5998c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcStride = 6008c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 6018c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLubyte *src = 6028c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 6038c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcWidth, srcHeight, 6048c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcFormat, srcType, 6058c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul img, 0, 0); 606f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 607e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul _mesa_unpack_color_span_ubyte(ctx, srcWidth, logicalBaseFormat, dst, 608e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul srcFormat, srcType, src, srcPacking, 609e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul transferOps); 610f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst += srcWidth * components; 611f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcStride; 612f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (logicalBaseFormat != textureBaseFormat) { 616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* one more conversion step */ 617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint texComponents = _mesa_components_in_format(textureBaseFormat); 618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 619663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLubyte *newImage; 620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i, n; 6213aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[6]; 622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 62313ad04719e292a2bee7e1b3155da74a97921c035Brian Paul /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 62413ad04719e292a2bee7e1b3155da74a97921c035Brian Paul ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 62513ad04719e292a2bee7e1b3155da74a97921c035Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA); 626f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 627f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* The actual texture format should have at least as many components 628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * as the logical texture format. 629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(texComponents >= logComponents); 631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 632663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul newImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth 633663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * texComponents * sizeof(GLubyte)); 634f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!newImage) { 63532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 637f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 6393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 641f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul n = srcWidth * srcHeight * srcDepth; 642f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < n; i++) { 643f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint k; 644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (k = 0; k < texComponents; k++) { 645f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint j = map[k]; 646f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (j == ZERO) 647f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 0; 648f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (j == ONE) 649663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul newImage[i * texComponents + k] = 255; 650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else 651f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 654f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 65532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul tempImage = newImage; 657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 658f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 659f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return tempImage; 660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 663c039af165d5919008c6df599795951f85dea164dBrian Paul/** 664c039af165d5919008c6df599795951f85dea164dBrian Paul * Copy GLubyte pixels from <src> to <dst> with swizzling. 665c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dst destination pixels 666c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dstComponents number of color components in destination pixels 667c039af165d5919008c6df599795951f85dea164dBrian Paul * \param src source pixels 668c039af165d5919008c6df599795951f85dea164dBrian Paul * \param srcComponents number of color components in source pixels 669248200737398a7d6403a23930a6c9d93db06b942Brian Paul * \param map the swizzle mapping. map[X] says where to find the X component 670248200737398a7d6403a23930a6c9d93db06b942Brian Paul * in the source image's pixels. For example, if the source image 671248200737398a7d6403a23930a6c9d93db06b942Brian Paul * is GL_BGRA and X = red, map[0] yields 2. 672c039af165d5919008c6df599795951f85dea164dBrian Paul * \param count number of pixels to copy/swizzle. 673c039af165d5919008c6df599795951f85dea164dBrian Paul */ 674c039af165d5919008c6df599795951f85dea164dBrian Paulstatic void 675c039af165d5919008c6df599795951f85dea164dBrian Paulswizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src, 676c039af165d5919008c6df599795951f85dea164dBrian Paul GLuint srcComponents, const GLubyte *map, GLuint count) 67771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 678501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#define SWZ_CPY(dst, src, count, dstComps, srcComps) \ 679501338d70e96e0388fd5198625d856c4ec07745fBrian Paul do { \ 680501338d70e96e0388fd5198625d856c4ec07745fBrian Paul GLuint i; \ 681501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (i = 0; i < count; i++) { \ 682501338d70e96e0388fd5198625d856c4ec07745fBrian Paul GLuint j; \ 683501338d70e96e0388fd5198625d856c4ec07745fBrian Paul if (srcComps == 4) { \ 684501338d70e96e0388fd5198625d856c4ec07745fBrian Paul COPY_4UBV(tmp, src); \ 685501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 686501338d70e96e0388fd5198625d856c4ec07745fBrian Paul else { \ 687501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (j = 0; j < srcComps; j++) { \ 688501338d70e96e0388fd5198625d856c4ec07745fBrian Paul tmp[j] = src[j]; \ 689501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 690501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 691501338d70e96e0388fd5198625d856c4ec07745fBrian Paul src += srcComps; \ 692501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (j = 0; j < dstComps; j++) { \ 693501338d70e96e0388fd5198625d856c4ec07745fBrian Paul dst[j] = tmp[map[j]]; \ 694501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 695501338d70e96e0388fd5198625d856c4ec07745fBrian Paul dst += dstComps; \ 696501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 697501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } while (0) 698501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 699248200737398a7d6403a23930a6c9d93db06b942Brian Paul GLubyte tmp[6]; 70071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 70171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell tmp[ZERO] = 0x0; 70271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell tmp[ONE] = 0xff; 70371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 704501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ASSERT(srcComponents <= 4); 705501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ASSERT(dstComponents <= 4); 706501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 70771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell switch (dstComponents) { 70871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 4: 709501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 710501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 711501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 4); 712501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 713501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 714501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 3); 715501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 716501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 717501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 2); 718501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 719501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 720501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 1); 721501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 722501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 723501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 72471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 72571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 72671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 3: 727501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 728501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 729501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 4); 730501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 731501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 732501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 3); 733501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 734501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 735501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 2); 736501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 737501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 738501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 1); 739501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 740501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 741501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 74271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 74371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 74471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 2: 745501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 746501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 747501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 4); 748501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 749501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 750501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 3); 751501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 752501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 753501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 2); 754501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 755501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 756501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 1); 757501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 758501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 759501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 76071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 76171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 7623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case 1: 763501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 764501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 765501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 4); 766501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 767501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 768501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 3); 769501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 770501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 771501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 2); 772501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 773501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 774501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 1); 775501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 776501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 777501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 7783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 7793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell break; 780501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 781501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 78271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 783501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#undef SWZ_CPY 78471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell} 78571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 78646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 787501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 788bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE }; 789bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE }; 79046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 79139de9251c4770fdcce3395643003aa626178446dBrian Paul 79239de9251c4770fdcce3395643003aa626178446dBrian Paul/** 79339de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a 79439de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on endianness. 795bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell */ 79646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte * 797bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwelltype_mapping( GLenum srcType ) 79846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{ 79946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell switch (srcType) { 800c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger case GL_BYTE: 80146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_BYTE: 80246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_identity; 803bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8: 804df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer return _mesa_little_endian() ? map_3210 : map_identity; 805bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8_REV: 806df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer return _mesa_little_endian() ? map_identity : map_3210; 80746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell default: 80846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return NULL; 80946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 81046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell} 81146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 81239de9251c4770fdcce3395643003aa626178446dBrian Paul 81339de9251c4770fdcce3395643003aa626178446dBrian Paul/** 81439de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a 81539de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on pixelstore byte swapping state. 81646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell */ 81746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte * 818bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellbyteswap_mapping( GLboolean swapBytes, 819bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell GLenum srcType ) 82046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{ 821bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell if (!swapBytes) 822bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell return map_identity; 823bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell 82446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell switch (srcType) { 825c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger case GL_BYTE: 82646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_BYTE: 82746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_identity; 82846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8: 82946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8_REV: 83046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_3210; 83146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell default: 83246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return NULL; 83346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 83446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell} 83546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 83646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 83746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 838c039af165d5919008c6df599795951f85dea164dBrian Paul/** 839c039af165d5919008c6df599795951f85dea164dBrian Paul * Transfer a GLubyte texture image with component swizzling. 840c039af165d5919008c6df599795951f85dea164dBrian Paul */ 84171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellstatic void 842f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_swizzle_ubyte_image(struct gl_context *ctx, 84371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLuint dimensions, 84471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLenum srcFormat, 84546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell GLenum srcType, 84646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 8470c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell GLenum baseInternalFormat, 8480c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell 84946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell const GLubyte *rgba2dst, 8500c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell GLuint dstComponents, 85171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 85271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLvoid *dstAddr, 85371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint dstXoffset, GLint dstYoffset, GLint dstZoffset, 854b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint dstRowStride, 855b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLuint *dstImageOffsets, 85671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 85771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint srcWidth, GLint srcHeight, GLint srcDepth, 85871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const GLvoid *srcAddr, 85971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const struct gl_pixelstore_attrib *srcPacking ) 86071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 86171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint srcComponents = _mesa_components_in_format(srcFormat); 862bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell const GLubyte *srctype2ubyte, *swap; 8633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[4], src2base[6], base2rgba[6]; 86471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint i; 865c039af165d5919008c6df599795951f85dea164dBrian Paul const GLint srcRowStride = 866c039af165d5919008c6df599795951f85dea164dBrian Paul _mesa_image_row_stride(srcPacking, srcWidth, 867c039af165d5919008c6df599795951f85dea164dBrian Paul srcFormat, GL_UNSIGNED_BYTE); 868c039af165d5919008c6df599795951f85dea164dBrian Paul const GLint srcImageStride 869c039af165d5919008c6df599795951f85dea164dBrian Paul = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat, 870c039af165d5919008c6df599795951f85dea164dBrian Paul GL_UNSIGNED_BYTE); 871c039af165d5919008c6df599795951f85dea164dBrian Paul const GLubyte *srcImage 872c039af165d5919008c6df599795951f85dea164dBrian Paul = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr, 873c039af165d5919008c6df599795951f85dea164dBrian Paul srcWidth, srcHeight, srcFormat, 874c039af165d5919008c6df599795951f85dea164dBrian Paul GL_UNSIGNED_BYTE, 0, 0, 0); 87571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 876edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul (void) ctx; 877edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul 8780c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell /* Translate from src->baseInternal->GL_RGBA->dst. This will 8790c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell * correctly deal with RGBA->RGB->RGBA conversions where the final 8800c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell * A value must be 0xff regardless of the incoming alpha values. 8810c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell */ 8823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(srcFormat, baseInternalFormat, src2base); 8833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba); 884bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell swap = byteswap_mapping(srcPacking->SwapBytes, srcType); 885bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell srctype2ubyte = type_mapping(srcType); 88646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 88771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 88871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (i = 0; i < 4; i++) 889bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]]; 89071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 891298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg/* printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]); */ 8922e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell 893b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul if (srcComponents == dstComponents && 894b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul srcRowStride == dstRowStride && 8959c09259b8bef8f120cc6f4bb1a44f0eae37d71b3Michel Dänzer srcRowStride == srcWidth * srcComponents && 896b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dimensions < 3) { 897b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* 1 and 2D images only */ 898b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstImage = (GLubyte *) dstAddr 899b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 900b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstXoffset * dstComponents; 90171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map, 902b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcWidth * srcHeight); 90371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 90471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else { 90571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint img, row; 90671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (img = 0; img < srcDepth; img++) { 90771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const GLubyte *srcRow = srcImage; 908b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 909b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstImageOffsets[dstZoffset + img] * dstComponents 910b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 911b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstXoffset * dstComponents; 91271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (row = 0; row < srcHeight; row++) { 91371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell swizzle_copy(dstRow, dstComponents, srcRow, srcComponents, map, srcWidth); 91471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 91571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 91671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 91771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcImage += srcImageStride; 91871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 91971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 92071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell} 92171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 92271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 923f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 924f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Teximage storage routine for when a simple memcpy will do. 925f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * No pixel transfer operations or special texel encodings allowed. 926f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 1D, 2D and 3D images supported. 927f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 928f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulstatic void 929f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergmemcpy_texture(struct gl_context *ctx, 93017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell GLuint dimensions, 9311f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format dstFormat, 932f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLvoid *dstAddr, 933f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint dstXoffset, GLint dstYoffset, GLint dstZoffset, 934b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint dstRowStride, 935b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLuint *dstImageOffsets, 936f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 937f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLenum srcFormat, GLenum srcType, 938f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLvoid *srcAddr, 939f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const struct gl_pixelstore_attrib *srcPacking) 940f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 941f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, 942f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType); 943f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint srcImageStride = _mesa_image_image_stride(srcPacking, 944f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcFormat, srcType); 94560909388ab136d849d99eab49e782a53772a618fBrian Paul const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions, 94660909388ab136d849d99eab49e782a53772a618fBrian Paul srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); 9471f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 94822108bb571808542b89677752d62d3901698265fBrian Paul const GLint bytesPerRow = srcWidth * texelBytes; 949b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul 950b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul#if 0 951b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* XXX update/re-enable for dstImageOffsets array */ 952f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint bytesPerImage = srcHeight * bytesPerRow; 953f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint bytesPerTexture = srcDepth * bytesPerImage; 954f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLubyte *dstImage = (GLubyte *) dstAddr 955f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul + dstZoffset * dstImageStride 956f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul + dstYoffset * dstRowStride 95722108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 958f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 959f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (dstRowStride == srcRowStride && 960f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRowStride == bytesPerRow && 961f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ((dstImageStride == srcImageStride && 962f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstImageStride == bytesPerImage) || 963f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcDepth == 1))) { 964f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* one big memcpy */ 96517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell ctx->Driver.TextureMemCpy(dstImage, srcImage, bytesPerTexture); 966f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 967b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul else 968b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul { 969f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 970f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 971f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLubyte *srcRow = srcImage; 972f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLubyte *dstRow = dstImage; 973f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 97417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow); 975f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 976f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcRow += srcRowStride; 977f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 978f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcImage += srcImageStride; 979f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstImage += dstImageStride; 980f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 981f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 982b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul#endif 983b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul 984b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row; 985b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul for (img = 0; img < srcDepth; img++) { 986b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLubyte *srcRow = srcImage; 987b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 98822108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 989b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 99022108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 991b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul for (row = 0; row < srcHeight; row++) { 992b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow); 993b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 994b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcRow += srcRowStride; 995b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul } 996b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcImage += srcImageStride; 997b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul } 998f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 999f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1000f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1001f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1002f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1003bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák * Store a 32-bit integer or float depth component texture image. 1004f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 100549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1006b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z32(TEXSTORE_PARAMS) 1007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 100825cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian const GLuint depthScale = 0xffffffff; 10091f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 1010bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák const GLenum dstType = _mesa_get_format_datatype(dstFormat); 1011a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 1012bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák ASSERT(dstFormat == MESA_FORMAT_Z32 || 1013bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák dstFormat == MESA_FORMAT_Z32_FLOAT); 101422108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == sizeof(GLuint)); 1015f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1016966e199e409a1b52eef88e48997442250997f45eBrian Paul if (ctx->Pixel.DepthScale == 1.0f && 1017966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 1018f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1019a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_DEPTH_COMPONENT && 1020a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_DEPTH_COMPONENT && 1021bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák srcType == dstType) { 1022f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 102317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 102460909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1025b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1026b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1027f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1028f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1029f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1030f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1031f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1032f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 1033f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1034b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 103522108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1036b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 103722108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1038f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 103960909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 1040f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 10411ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 1042bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák dstType, dstRow, 1043a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul depthScale, srcType, src, srcPacking); 1044f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1045f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1046f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1047f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1048f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1049f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1050f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1052f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1053e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul * Store a 24-bit integer depth component texture image. 1054f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 1055e4c700dbbf2a802f32bf62256c801105998c3729Brian Paulstatic GLboolean 1056e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul_mesa_texstore_x8_z24(TEXSTORE_PARAMS) 1057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1058e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul const GLuint depthScale = 0xffffff; 1059e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul const GLuint texelBytes = 4; 1060e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul 1061a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 1062e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul ASSERT(dstFormat == MESA_FORMAT_X8_Z24); 1063f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1064e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul { 1065f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1066f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 1067f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1068b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 1069e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1070b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 1071e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul + dstXoffset * texelBytes; 1072f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 107360909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 1074f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 10751ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 1076a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul GL_UNSIGNED_INT, (GLuint *) dstRow, 1077a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul depthScale, srcType, src, srcPacking); 1078f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1079f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1080f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1081f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1082f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1083f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1084f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1085e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul 1086f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1087c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca * Store a 24-bit integer depth component texture image. 1088c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca */ 1089c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonsecastatic GLboolean 1090c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca_mesa_texstore_z24_x8(TEXSTORE_PARAMS) 1091c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca{ 1092c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLuint depthScale = 0xffffff; 1093c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLuint texelBytes = 4; 1094c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1095c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca (void) dims; 1096c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca ASSERT(dstFormat == MESA_FORMAT_Z24_X8); 1097c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1098c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca { 1099c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca /* general path */ 1100c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLint img, row; 1101c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (img = 0; img < srcDepth; img++) { 1102c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLubyte *dstRow = (GLubyte *) dstAddr 1103c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca + dstImageOffsets[dstZoffset + img] * texelBytes 1104c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca + dstYoffset * dstRowStride 1105c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca + dstXoffset * texelBytes; 1106c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (row = 0; row < srcHeight; row++) { 1107c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLvoid *src = _mesa_image_address(dims, srcPacking, 1108c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 1109c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLuint *dst = (GLuint *) dstRow; 1110c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLint i; 1111c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca _mesa_unpack_depth_span(ctx, srcWidth, 1112c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GL_UNSIGNED_INT, dst, 1113c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca depthScale, srcType, src, srcPacking); 1114c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (i = 0; i < srcWidth; i++) 1115c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca dst[i] <<= 8; 1116c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca dstRow += dstRowStride; 1117c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1118c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1119c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1120c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca return GL_TRUE; 1121c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca} 1122c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1123c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1124c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca/** 1125a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul * Store a 16-bit integer depth component texture image. 1126f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 112749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1128b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z16(TEXSTORE_PARAMS) 1129f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 113025cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian const GLuint depthScale = 0xffff; 11311f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 1132a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 11331f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_Z16); 113422108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == sizeof(GLushort)); 1135f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1136966e199e409a1b52eef88e48997442250997f45eBrian Paul if (ctx->Pixel.DepthScale == 1.0f && 1137966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 1138f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1139f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_DEPTH_COMPONENT && 1140f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_DEPTH_COMPONENT && 1141a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_SHORT) { 1142f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 114317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 114460909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1145b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1146b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1147f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1148f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1149f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1151f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 11521ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul GLint img, row; 1153f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1154b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 115522108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1156b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 115722108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 115960909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 1160f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 1161a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dst16 = (GLushort *) dstRow; 11621ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 1163a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul GL_UNSIGNED_SHORT, dst16, depthScale, 1164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType, src, srcPacking); 1165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1166f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1167f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1168f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1169f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1170f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1171f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1172f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1173f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1174defb035b6cf03c555318d9dd48864242ed036f39Brian Paul * Store an rgb565 or rgb565_rev texture image. 1175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 117649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1177b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb565(TEXSTORE_PARAMS) 1178f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 11791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 11801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 118122108bb571808542b89677752d62d3901698265fBrian Paul 11821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB565 || 11831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB565_REV); 118422108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1185f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1186f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1187f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 11881f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB565 && 1189a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1190a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGB && 1191a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5) { 1192f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 119317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 119460909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1195b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1196b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1197f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1198f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1199f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1200a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else if (!ctx->_ImageTransferState && 1201a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1202a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1203a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGB && 1204a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE && 1205a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dims == 2) { 1206a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* do optimized tex store */ 12078c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 12088c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1209a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLubyte *src = (const GLubyte *) 121060909388ab136d849d99eab49e782a53772a618fBrian Paul _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight, 1211a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, 0, 0, 0); 1212a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLubyte *dst = (GLubyte *) dstAddr 1213a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul + dstYoffset * dstRowStride 121422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1215a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLint row, col; 1216a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1217a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLubyte *srcUB = (const GLubyte *) src; 1218a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dstUS = (GLushort *) dst; 1219defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* check for byteswapped format */ 12201f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_RGB565) { 1221f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1222f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] ); 1223f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul srcUB += 3; 1224f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1225f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1226f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1227f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1228f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] ); 1229f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul srcUB += 3; 1230f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1231defb035b6cf03c555318d9dd48864242ed036f39Brian Paul } 1232a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dst += dstRowStride; 1233a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul src += srcRowStride; 1234a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1235a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1236f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1237f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1238663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1239a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat, 124022108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1241a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, 1242a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, srcAddr, 1243a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcPacking); 1244663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 1245f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1246a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!tempImage) 1247a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_FALSE; 1248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1249b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 125022108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1251b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 125222108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1254a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dstUS = (GLushort *) dstRow; 1255defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* check for byteswapped format */ 12561f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_RGB565) { 1257f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1258663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_565( src[RCOMP], 1259663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1260663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1261f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 3; 1262f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1263f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1264f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1265f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1266663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_565_REV( src[RCOMP], 1267663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1268663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1269f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 3; 1270f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1271f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1272f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1273f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1274f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 127532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1276f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1277f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1278f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1279f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1280f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1281248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 1282248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV. 1283248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 128449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1285b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba8888(TEXSTORE_PARAMS) 1286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1287184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 12881f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 12891f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 129071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 12911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA8888 || 12921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGBA8888_REV); 129322108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 4); 1294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 12971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGBA8888 && 1298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1299defb035b6cf03c555318d9dd48864242ed036f39Brian Paul ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) || 13002e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) || 13012e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) || 13022e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian))) { 13032e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger /* simple memcpy path */ 13042e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger memcpy_texture(ctx, dims, 13052e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 13062e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger dstRowStride, 13072e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger dstImageOffsets, 13082e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 13092e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger srcAddr, srcPacking); 13102e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger } 13112e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger else if (!ctx->_ImageTransferState && 13122e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger !srcPacking->SwapBytes && 13131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGBA8888_REV && 13142e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger baseInternalFormat == GL_RGBA && 13152e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) || 13162e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) || 13172e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) || 13182e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian))) { 1319f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 132017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 132160909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1322b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1323b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1324f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1325f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1326f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 132771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 132846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell (srcType == GL_UNSIGNED_BYTE || 132946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8 || 133046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8_REV) && 1331528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger can_swizzle(baseInternalFormat) && 133271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell can_swizzle(srcFormat)) { 133346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 133471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte dstmap[4]; 133571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 1336528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger /* dstmap - how to swizzle from RGBA to dst format: 133771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell */ 13381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if ((littleEndian && dstFormat == MESA_FORMAT_RGBA8888) || 13391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_RGBA8888_REV)) { 134046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 0; 134146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 1; 134246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 2; 134346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 3; 134446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 134546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell else { 134646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 3; 134746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 2; 134846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 1; 134946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 0; 135046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 135171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 135271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 135371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat, 135446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType, 1355528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger baseInternalFormat, 135671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstmap, 4, 135771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 1358528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger dstRowStride, dstImageOffsets, 135971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 136071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcPacking); 136171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 1362f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1363f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1364663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1365f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 136622108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1367f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1368f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1369f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1370663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 1371f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1372f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1373f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1375b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 137622108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1377b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 137822108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1379f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLuint *dstUI = (GLuint *) dstRow; 13811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_RGBA8888) { 1382f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1383663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUI[col] = PACK_COLOR_8888( src[RCOMP], 1384663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1385663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP], 1386663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[ACOMP] ); 1387f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1388f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1390f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1391f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1392663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUI[col] = PACK_COLOR_8888_REV( src[RCOMP], 1393663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1394663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP], 1395663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[ACOMP] ); 1396f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1397f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1398a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1399a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1400a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1401a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 140232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1403a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1404a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1405a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1406a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1407a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 140849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1409b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb8888(TEXSTORE_PARAMS) 1410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1411184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 14121f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 1413f920d496e1b5b01a3ba9bcd7dcff5c19bc109da2Brian Paul const GLenum baseFormat = GL_RGBA; 1414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 14151f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB8888 || 141674d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_ARGB8888_REV || 14172d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer dstFormat == MESA_FORMAT_XRGB8888 || 14182d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer dstFormat == MESA_FORMAT_XRGB8888_REV ); 141922108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 4); 1420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 142374d61d03b54d72217d463c248468cdcd09320efcBrian Paul (dstFormat == MESA_FORMAT_ARGB8888 || 142474d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_XRGB8888) && 1425f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1426f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGRA && 1427f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ((srcType == GL_UNSIGNED_BYTE && littleEndian) || 1428defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV)) { 1429defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* simple memcpy path (little endian) */ 143017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 143160909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1432b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1433b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1434f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1435f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1436f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1437defb035b6cf03c555318d9dd48864242ed036f39Brian Paul else if (!ctx->_ImageTransferState && 1438a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 14392d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (dstFormat == MESA_FORMAT_ARGB8888_REV || 14402d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer dstFormat == MESA_FORMAT_XRGB8888_REV) && 1441a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGBA && 1442a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_BGRA && 1443a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul ((srcType == GL_UNSIGNED_BYTE && !littleEndian) || 1444defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8)) { 1445defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* simple memcpy path (big endian) */ 144617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 144760909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1448b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1449b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1450a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1451a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcAddr, srcPacking); 1452a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 145371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 145471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell !srcPacking->SwapBytes && 145574d61d03b54d72217d463c248468cdcd09320efcBrian Paul (dstFormat == MESA_FORMAT_ARGB8888 || 145674d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_XRGB8888) && 145771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat == GL_RGB && 14580c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell (baseInternalFormat == GL_RGBA || 14590c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat == GL_RGB) && 146071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcType == GL_UNSIGNED_BYTE) { 146171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell int img, row, col; 146271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (img = 0; img < srcDepth; img++) { 14638c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 14648c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 146571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 146671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1467b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 146822108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1469b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 147022108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 147171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (row = 0; row < srcHeight; row++) { 1472259eacfa94a1086e4c99db83516989cc27832ef4Brian GLuint *d4 = (GLuint *) dstRow; 147371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (col = 0; col < srcWidth; col++) { 147424748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul d4[col] = PACK_COLOR_8888(0xff, 147524748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + RCOMP], 147624748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + GCOMP], 147724748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + BCOMP]); 147871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 147971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 148071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 148171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 148271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 148371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 148471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 148571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell !srcPacking->SwapBytes && 14861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB8888 && 148771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat == GL_RGBA && 14880c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat == GL_RGBA && 148924748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcType == GL_UNSIGNED_BYTE) { 1490259eacfa94a1086e4c99db83516989cc27832ef4Brian /* same as above case, but src data has alpha too */ 1491b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row, col; 1492ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* For some reason, streaming copies to write-combined regions 1493ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * are extremely sensitive to the characteristics of how the 1494ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * source data is retrieved. By reordering the source reads to 1495ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * be in-order, the speed of this operation increases by half. 1496ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Strangely the same isn't required for the RGB path, above. 1497ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 1498ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (img = 0; img < srcDepth; img++) { 14998c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 15008c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1501ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 1502ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1503b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 150422108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1505b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 150622108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1507ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (row = 0; row < srcHeight; row++) { 1508259eacfa94a1086e4c99db83516989cc27832ef4Brian GLuint *d4 = (GLuint *) dstRow; 1509ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (col = 0; col < srcWidth; col++) { 151024748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP], 151124748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + RCOMP], 151224748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + GCOMP], 151324748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + BCOMP]); 151471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 151571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 151671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 151771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 151871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 151971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 152071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 152146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell (srcType == GL_UNSIGNED_BYTE || 152246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8 || 152346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8_REV) && 15240c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell can_swizzle(baseInternalFormat) && 152571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell can_swizzle(srcFormat)) { 152671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 152771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte dstmap[4]; 152871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 15290c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 153071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell */ 15311f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 153274d61d03b54d72217d463c248468cdcd09320efcBrian Paul (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) || 15332d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) || 15342d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) { 153546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 3; /* alpha */ 153646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 0; /* red */ 153746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 1; /* green */ 153846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 2; /* blue */ 153946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 154046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell else { 15411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) || 154274d61d03b54d72217d463c248468cdcd09320efcBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 15432d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) || 154474d61d03b54d72217d463c248468cdcd09320efcBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888)); 154546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 2; 154646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 1; 154746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 0; 154846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 3; 154946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 155071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 155171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 155271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat, 155346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType, 15540c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat, 155571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstmap, 4, 155671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 1557b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1558b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 155971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 156071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcPacking); 156171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 1562a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else { 1563a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* general path */ 1564663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1565a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat, 156622108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1567a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, 1568a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, srcAddr, 1569a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcPacking); 1570663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 1571a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLint img, row, col; 1572a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!tempImage) 1573a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_FALSE; 1574a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 1575b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 157622108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1577b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 157822108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1579a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1580a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLuint *dstUI = (GLuint *) dstRow; 15811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_ARGB8888) { 1582f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1583663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUI[col] = PACK_COLOR_8888( src[ACOMP], 1584663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 1585663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1586663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1587f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1588f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1589a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 159074d61d03b54d72217d463c248468cdcd09320efcBrian Paul else if (dstFormat == MESA_FORMAT_XRGB8888) { 159174d61d03b54d72217d463c248468cdcd09320efcBrian Paul for (col = 0; col < srcWidth; col++) { 159274d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstUI[col] = PACK_COLOR_8888( 0xff, 1593663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 1594663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1595663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 159674d61d03b54d72217d463c248468cdcd09320efcBrian Paul src += 4; 159774d61d03b54d72217d463c248468cdcd09320efcBrian Paul } 159874d61d03b54d72217d463c248468cdcd09320efcBrian Paul } 1599f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1600f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1601663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUI[col] = PACK_COLOR_8888_REV( src[ACOMP], 1602663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 1603663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1604663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1605f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1606f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1607defb035b6cf03c555318d9dd48864242ed036f39Brian Paul } 1608a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1609a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1610a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 161132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1612a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1613a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1614a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1615a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 161749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1618b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb888(TEXSTORE_PARAMS) 1619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1620184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 16211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 16221f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1623f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 16241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB888); 162522108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 3); 1626f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1627f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB && 1630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGR && 1631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE && 1632f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul littleEndian) { 1633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 163417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 163560909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1636b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1637b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1639f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1641f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (!ctx->_ImageTransferState && 1642f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1643f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_RGBA && 1644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 1645a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* extract RGB from RGBA */ 1646b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row, col; 1647f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 16488c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 16498c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 165060909388ab136d849d99eab49e782a53772a618fBrian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 165160909388ab136d849d99eab49e782a53772a618fBrian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1652b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 165322108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1654b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 165522108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1658f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP]; 1659f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP]; 1661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1663f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcRow += srcRowStride; 1664f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1665f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1666f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 16673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 16683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 16693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 16703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 16713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 16723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 16733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 16743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 16753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 1676167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[0] = 2; 16773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 1; 1678167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[2] = 0; 16793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 16803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 16813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 16823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 16833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 16843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 16853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 3, 16863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 16873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstRowStride, dstImageOffsets, 16883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 16893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 16903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1691f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1692f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1693663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1694f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 169522108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1696f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1697f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1698f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1699663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = (const GLubyte *) tempImage; 1700f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1701f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1702f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1703f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1704b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 170522108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1706b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 170722108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1708f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1709f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#if 0 1710f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (littleEndian) { 1711f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1712663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 0] = src[RCOMP]; 1713663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 1] = src[GCOMP]; 1714663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 2] = src[BCOMP]; 1715f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcUB += 3; 1716f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1717f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1718f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1719f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1720f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = srcUB[BCOMP]; 1721f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = srcUB[GCOMP]; 1722f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = srcUB[RCOMP]; 1723f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcUB += 3; 1724f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1725f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1726f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#else 1727f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1728663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 0] = src[BCOMP]; 1729663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 1] = src[GCOMP]; 1730663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 2] = src[RCOMP]; 1731f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += 3; 1732f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1733f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#endif 1734f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1735f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1736f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 173732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1738f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1739f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1740f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1741f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1742f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 174349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1744b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_bgr888(TEXSTORE_PARAMS) 1745a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul{ 1746184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 17471f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 17481f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1749a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 17501f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_BGR888); 175122108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 3); 1752a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1753a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!ctx->_ImageTransferState && 1754a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1755a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1756a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGB && 1757a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE && 1758a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul littleEndian) { 1759a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* simple memcpy path */ 176017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 176160909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1762b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1763b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1764a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1765a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcAddr, srcPacking); 1766a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1767a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else if (!ctx->_ImageTransferState && 1768a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1769a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGBA && 1770a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE) { 1771a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* extract BGR from RGBA */ 1772a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul int img, row, col; 1773a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 17748c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 17758c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 177660909388ab136d849d99eab49e782a53772a618fBrian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 177760909388ab136d849d99eab49e782a53772a618fBrian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1778b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 177922108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1780b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 178122108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1782a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1783a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (col = 0; col < srcWidth; col++) { 1784a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP]; 1785a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1786a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP]; 1787a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1788a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1789a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcRow += srcRowStride; 1790a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1791a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1792a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 17933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 17943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 17953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 17963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 17973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 17983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 17993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 18003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 18013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 1802167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[0] = 0; 18033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 1; 1804167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[2] = 2; 18053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 18063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 18073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 18083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 18093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 18103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 18113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 3, 18123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 18133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstRowStride, dstImageOffsets, 18143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 18153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 18163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1817a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else { 1818a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* general path */ 1819663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1820a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat, 182122108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1822a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, 1823a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, srcAddr, 1824a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcPacking); 1825663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = (const GLubyte *) tempImage; 1826a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLint img, row, col; 1827a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!tempImage) 1828a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_FALSE; 1829a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 1830b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 183122108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1832b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 183322108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1834a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1835a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (col = 0; col < srcWidth; col++) { 1836663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 0] = src[RCOMP]; 1837663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 1] = src[GCOMP]; 1838663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 2] = src[BCOMP]; 1839a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul src += 3; 1840a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1841a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1842a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1843a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 184432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1845a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1846a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1847a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1848a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1849a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 185049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1851b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb4444(TEXSTORE_PARAMS) 1852f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 18531f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 18541f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 185522108bb571808542b89677752d62d3901698265fBrian Paul 18561f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB4444 || 18571f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB4444_REV); 185822108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1859f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1860f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1861f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 18621f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB4444 && 1863f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1864f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGRA && 1865defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV) { 1866f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 186717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 186860909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1869b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1870b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1871f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1872f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1873f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1874f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1875f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1876663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1877f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 187822108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1879f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1880f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1881f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1882663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 1883f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1884f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1885f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1886f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1887b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 188822108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1889b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 189022108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1891f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1892f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 18931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_ARGB4444) { 1894f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1895663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_4444( src[ACOMP], 1896663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 1897663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1898663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1899f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1900f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1901f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1902f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1903f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1904663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_4444_REV( src[ACOMP], 1905663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 1906663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1907663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1908f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1909f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1910a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1911a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1912a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1913a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 191432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1915a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1916a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1917a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1918a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 191949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1920dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom_mesa_texstore_rgba5551(TEXSTORE_PARAMS) 1921dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom{ 19221f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 19231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 192422108bb571808542b89677752d62d3901698265fBrian Paul 19251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA5551); 192622108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1927a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1928dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom if (!ctx->_ImageTransferState && 1929dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom !srcPacking->SwapBytes && 19301f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGBA5551 && 1931dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom baseInternalFormat == GL_RGBA && 1932dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcFormat == GL_RGBA && 1933dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcType == GL_UNSIGNED_SHORT_5_5_5_1) { 1934dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom /* simple memcpy path */ 1935dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom memcpy_texture(ctx, dims, 1936dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1937dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstRowStride, 1938dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstImageOffsets, 1939dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1940dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcAddr, srcPacking); 1941dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1942dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom else { 1943dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom /* general path */ 1944663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1945dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom baseInternalFormat, 194622108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1947dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcWidth, srcHeight, srcDepth, 1948dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcFormat, srcType, srcAddr, 1949dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcPacking); 1950663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src =tempImage; 1951dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom GLint img, row, col; 1952dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom if (!tempImage) 1953dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom return GL_FALSE; 1954dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom for (img = 0; img < srcDepth; img++) { 1955dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom GLubyte *dstRow = (GLubyte *) dstAddr 195622108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1957dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom + dstYoffset * dstRowStride 195822108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1959dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom for (row = 0; row < srcHeight; row++) { 1960dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom GLushort *dstUS = (GLushort *) dstRow; 1961dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom for (col = 0; col < srcWidth; col++) { 1962663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_5551( src[RCOMP], 1963663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1964663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP], 1965663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[ACOMP] ); 1966dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom src += 4; 1967dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1968dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstRow += dstRowStride; 1969dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1970dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 197132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1972dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1973dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom return GL_TRUE; 1974dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom} 1975defb035b6cf03c555318d9dd48864242ed036f39Brian Paul 197649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1977b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb1555(TEXSTORE_PARAMS) 1978f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 19791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 19801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 198122108bb571808542b89677752d62d3901698265fBrian Paul 19821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB1555 || 19831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB1555_REV); 198422108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1985f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1986f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1987f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 19881f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB1555 && 1989f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1990f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGRA && 1991defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV) { 1992f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 199317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 199460909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1995b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1996b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1997f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1998f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1999f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2000f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2001f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 2002663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 2003f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 200422108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2005f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2006f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2008663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src =tempImage; 2009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2010f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2011f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2013b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 201422108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2015b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 201622108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2017f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2018f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 20191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_ARGB1555) { 2020f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 2021663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_1555( src[ACOMP], 2022663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 2023663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 2024663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 2025f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 2026f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 2027f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2028f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 2029f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 2030663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_1555_REV( src[ACOMP], 2031663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 2032663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 2033663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 2034f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 2035f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 2036a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2037a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 2038a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2039a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 204032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2041a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2042a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 2043a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 2044a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 2045f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2046621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšákstatic GLboolean 2047621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák_mesa_texstore_argb2101010(TEXSTORE_PARAMS) 2048621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák{ 2049621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2050621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2051621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 2052621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák ASSERT(dstFormat == MESA_FORMAT_ARGB2101010); 2053621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák ASSERT(texelBytes == 4); 2054621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 2055621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák if (!ctx->_ImageTransferState && 2056621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák !srcPacking->SwapBytes && 2057621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák dstFormat == MESA_FORMAT_ARGB2101010 && 2058621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcFormat == GL_BGRA && 2059621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcType == GL_UNSIGNED_INT_2_10_10_10_REV && 2060621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák baseInternalFormat == GL_RGBA) { 2061621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák /* simple memcpy path */ 2062621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák memcpy_texture(ctx, dims, 2063621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2064621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák dstRowStride, 2065621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák dstImageOffsets, 2066621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2067621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcAddr, srcPacking); 2068621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2069621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák else { 2070621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák /* general path */ 2071e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2072621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák baseInternalFormat, 2073621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák baseFormat, 2074621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcWidth, srcHeight, srcDepth, 2075621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcFormat, srcType, srcAddr, 207650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák srcPacking, 207750630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák ctx->_ImageTransferState); 207850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák const GLfloat *src = tempImage; 2079621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák GLint img, row, col; 2080621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák if (!tempImage) 2081621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák return GL_FALSE; 2082621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (img = 0; img < srcDepth; img++) { 2083621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák GLubyte *dstRow = (GLubyte *) dstAddr 2084621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák + dstImageOffsets[dstZoffset + img] * texelBytes 2085621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák + dstYoffset * dstRowStride 2086621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák + dstXoffset * texelBytes; 2087621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák if (baseInternalFormat == GL_RGBA) { 2088621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (row = 0; row < srcHeight; row++) { 208950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLuint *dstUI = (GLuint *) dstRow; 2090621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (col = 0; col < srcWidth; col++) { 209150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLushort a,r,g,b; 209250630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák 209350630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]); 209450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); 209550630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); 209650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); 209750630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák dstUI[col] = PACK_COLOR_2101010_US(a, r, g, b); 2098621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák src += 4; 2099621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2100621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák dstRow += dstRowStride; 2101621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2102621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } else if (baseInternalFormat == GL_RGB) { 2103621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (row = 0; row < srcHeight; row++) { 210450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLuint *dstUI = (GLuint *) dstRow; 2105621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (col = 0; col < srcWidth; col++) { 210650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLushort r,g,b; 210750630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák 210850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); 210950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); 211050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); 211150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b); 2112621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák src += 4; 2113621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2114621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák dstRow += dstRowStride; 2115621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2116621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } else { 2117621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák ASSERT(0); 2118621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2119621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2120621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák free((void *) tempImage); 2121621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2122621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák return GL_TRUE; 2123621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák} 2124621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 2125621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 212639de9251c4770fdcce3395643003aa626178446dBrian Paul/** 2127bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák * Do texstore for 2-channel, 4-bit/channel, unsigned normalized formats. 2128bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák */ 2129bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšákstatic GLboolean 2130bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák_mesa_texstore_unorm44(TEXSTORE_PARAMS) 2131bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák{ 2132bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2133bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2134bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 2135bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák ASSERT(dstFormat == MESA_FORMAT_AL44); 2136bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák ASSERT(texelBytes == 1); 2137bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 2138bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák { 2139bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák /* general path */ 2140663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 2141bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák baseInternalFormat, 2142bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák baseFormat, 2143bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák srcWidth, srcHeight, srcDepth, 2144bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák srcFormat, srcType, srcAddr, 2145bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák srcPacking); 2146663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 2147bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák GLint img, row, col; 2148bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák if (!tempImage) 2149bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák return GL_FALSE; 2150bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák for (img = 0; img < srcDepth; img++) { 2151bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák GLubyte *dstRow = (GLubyte *) dstAddr 2152bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák + dstImageOffsets[dstZoffset + img] * texelBytes 2153bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák + dstYoffset * dstRowStride 2154bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák + dstXoffset * texelBytes; 2155bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák for (row = 0; row < srcHeight; row++) { 2156bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák GLubyte *dstUS = (GLubyte *) dstRow; 2157bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák for (col = 0; col < srcWidth; col++) { 2158bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák /* src[0] is luminance, src[1] is alpha */ 2159663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_44( src[1], 2160663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[0] ); 2161bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák src += 2; 2162bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 2163bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák dstRow += dstRowStride; 2164bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 2165bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 2166bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák free((void *) tempImage); 2167bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 2168bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák return GL_TRUE; 2169bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák} 2170bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 2171bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 2172bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák/** 217339de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats. 217439de9251c4770fdcce3395643003aa626178446dBrian Paul */ 217549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 21765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm88(TEXSTORE_PARAMS) 2177f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 2178184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 21791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 21801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2181f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 21821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_AL88 || 21835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_AL88_REV || 21845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG88 || 21855d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG88_REV); 218622108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 2187f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2188f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2189f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2190e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede ((dstFormat == MESA_FORMAT_AL88 && 2191e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == GL_LUMINANCE_ALPHA && 2192e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede srcFormat == GL_LUMINANCE_ALPHA) || 2193e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede (dstFormat == MESA_FORMAT_RG88 && 2194e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == srcFormat)) && 2195f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE && 2196f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul littleEndian) { 2197f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 219817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 219960909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2200b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2201b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2202f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2203f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2204f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 22053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 2206bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell littleEndian && 22073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 22083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 22093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 22103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 22113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 22123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 22133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 22145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) { 22155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if ((littleEndian && dstFormat == MESA_FORMAT_AL88) || 22165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) { 22175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 0; 22185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 3; 22195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 22205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 22215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 3; 22225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 0; 22235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 22243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 22253aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else { 22265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if ((littleEndian && dstFormat == MESA_FORMAT_RG88) || 22275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick (!littleEndian && dstFormat == MESA_FORMAT_RG88_REV)) { 22285d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 0; 22295d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 1; 22305d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 22315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 22325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 1; 22335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 0; 22345d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 22353aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 22363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[2] = ZERO; /* ? */ 22373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 22383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 22393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 22403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 22413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 22423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 22433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 2, 22443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 22453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstRowStride, dstImageOffsets, 22463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 22473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 22483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 2249f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2250f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 2251663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 2252f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 225322108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2257663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 2258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2260f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2261f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2262b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 226322108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2264b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 226522108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2267f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 22685d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL88 || 22695d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG88) { 2270f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 2271f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul /* src[0] is luminance, src[1] is alpha */ 2272663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_88( src[1], 2273663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[0] ); 2274f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 2; 2275f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 2276f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2277f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 2278f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 2279f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul /* src[0] is luminance, src[1] is alpha */ 2280663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_88_REV( src[1], 2281663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[0] ); 2282f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 2; 2283f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 2284a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2285a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 2286a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2287a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 228832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2289a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2290a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 2291a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 2292a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 2293a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 229439de9251c4770fdcce3395643003aa626178446dBrian Paul/** 229539de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats. 229639de9251c4770fdcce3395643003aa626178446dBrian Paul */ 229749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 22985d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm1616(TEXSTORE_PARAMS) 22993325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick{ 23003325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLboolean littleEndian = _mesa_little_endian(); 23013325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 23023325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 23033325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 23043325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick ASSERT(dstFormat == MESA_FORMAT_AL1616 || 23055d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_AL1616_REV || 23065d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616 || 23075d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616_REV); 23083325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick ASSERT(texelBytes == 4); 23093325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 23103325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick if (!ctx->_ImageTransferState && 23113325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick !srcPacking->SwapBytes && 2312e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede ((dstFormat == MESA_FORMAT_AL1616 && 2313e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == GL_LUMINANCE_ALPHA && 2314e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede srcFormat == GL_LUMINANCE_ALPHA) || 2315e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede (dstFormat == MESA_FORMAT_RG1616 && 2316e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == srcFormat)) && 23173325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcType == GL_UNSIGNED_SHORT && 23183325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick littleEndian) { 23193325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick /* simple memcpy path */ 23203325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick memcpy_texture(ctx, dims, 23213325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 23223325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick dstRowStride, 23233325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick dstImageOffsets, 23243325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcWidth, srcHeight, srcDepth, srcFormat, srcType, 23253325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcAddr, srcPacking); 23263325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 23273325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick else { 23283325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick /* general path */ 2329e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 23303325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick baseInternalFormat, 23313325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick baseFormat, 23323325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcWidth, srcHeight, srcDepth, 23333325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcFormat, srcType, srcAddr, 2334bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2335bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 23363325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLfloat *src = tempImage; 23373325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick GLint img, row, col; 23383325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick if (!tempImage) 23393325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick return GL_FALSE; 23403325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (img = 0; img < srcDepth; img++) { 23413325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick GLubyte *dstRow = (GLubyte *) dstAddr 23423325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick + dstImageOffsets[dstZoffset + img] * texelBytes 23433325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick + dstYoffset * dstRowStride 23443325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick + dstXoffset * texelBytes; 23453325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (row = 0; row < srcHeight; row++) { 23463325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick GLuint *dstUI = (GLuint *) dstRow; 23475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL1616 || 23485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616) { 23493325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (col = 0; col < srcWidth; col++) { 2350db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt GLushort l, a; 2351db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt 2352db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(l, src[0]); 2353db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(a, src[1]); 2354db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt dstUI[col] = PACK_COLOR_1616(a, l); 2355db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt src += 2; 23563325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 23573325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 23583325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick else { 23593325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (col = 0; col < srcWidth; col++) { 2360db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt GLushort l, a; 2361db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt 2362db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(l, src[0]); 2363db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(a, src[1]); 2364db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt dstUI[col] = PACK_COLOR_1616_REV(a, l); 2365db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt src += 2; 23663325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 23673325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 23683325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick dstRow += dstRowStride; 23693325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 23703325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 237132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 23723325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 23733325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick return GL_TRUE; 23743325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick} 23753325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 23763325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 2377fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák/* Texstore for R16, A16, L16, I16. */ 23783325dc91be2534079ebf7997700b6e5f17a75283Ian Romanickstatic GLboolean 2379eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák_mesa_texstore_unorm16(TEXSTORE_PARAMS) 23805d1387b2da3626326410804026f8b92f1a121fdcIan Romanick{ 23815d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLboolean littleEndian = _mesa_little_endian(); 23825d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 23835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 23845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 2385eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák ASSERT(dstFormat == MESA_FORMAT_R16 || 2386bb5ace68ce9e8bd171a39162ed6bd93632bd6619Marek Olšák dstFormat == MESA_FORMAT_A16 || 2387fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák dstFormat == MESA_FORMAT_L16 || 2388fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák dstFormat == MESA_FORMAT_I16); 23895d1387b2da3626326410804026f8b92f1a121fdcIan Romanick ASSERT(texelBytes == 2); 23905d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 23915d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (!ctx->_ImageTransferState && 23925d1387b2da3626326410804026f8b92f1a121fdcIan Romanick !srcPacking->SwapBytes && 2393eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák baseInternalFormat == srcFormat && 23945d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcType == GL_UNSIGNED_SHORT && 23955d1387b2da3626326410804026f8b92f1a121fdcIan Romanick littleEndian) { 23965d1387b2da3626326410804026f8b92f1a121fdcIan Romanick /* simple memcpy path */ 23975d1387b2da3626326410804026f8b92f1a121fdcIan Romanick memcpy_texture(ctx, dims, 23985d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 23995d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstRowStride, 24005d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstImageOffsets, 24015d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, srcFormat, srcType, 24025d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcAddr, srcPacking); 24035d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 24045d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 24055d1387b2da3626326410804026f8b92f1a121fdcIan Romanick /* general path */ 2406e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 24075d1387b2da3626326410804026f8b92f1a121fdcIan Romanick baseInternalFormat, 24085d1387b2da3626326410804026f8b92f1a121fdcIan Romanick baseFormat, 24095d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, 24105d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcFormat, srcType, srcAddr, 2411bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2412bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 24135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLfloat *src = tempImage; 24145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLint img, row, col; 24155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (!tempImage) 24165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return GL_FALSE; 24175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (img = 0; img < srcDepth; img++) { 24185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLubyte *dstRow = (GLubyte *) dstAddr 24195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick + dstImageOffsets[dstZoffset + img] * texelBytes 24205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick + dstYoffset * dstRowStride 24215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick + dstXoffset * texelBytes; 24225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (row = 0; row < srcHeight; row++) { 24235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLushort *dstUS = (GLushort *) dstRow; 24245d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (col = 0; col < srcWidth; col++) { 24255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLushort r; 24265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 24275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick UNCLAMPED_FLOAT_TO_USHORT(r, src[0]); 24285d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstUS[col] = r; 24295d1387b2da3626326410804026f8b92f1a121fdcIan Romanick src += 1; 24305d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 24315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstRow += dstRowStride; 24325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 24335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 24345d1387b2da3626326410804026f8b92f1a121fdcIan Romanick free((void *) tempImage); 24355d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 24365d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return GL_TRUE; 24375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick} 24385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 24395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 24405d1387b2da3626326410804026f8b92f1a121fdcIan Romanickstatic GLboolean 244117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul_mesa_texstore_rgba_16(TEXSTORE_PARAMS) 244217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul{ 244317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 244417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 244517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 244617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_16); 244717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul ASSERT(texelBytes == 8); 244817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 244917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul if (!ctx->_ImageTransferState && 245017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul !srcPacking->SwapBytes && 245117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseInternalFormat == GL_RGBA && 245217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcFormat == GL_RGBA && 245317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcType == GL_UNSIGNED_SHORT) { 245417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul /* simple memcpy path */ 245517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul memcpy_texture(ctx, dims, 245617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 245717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstRowStride, 245817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstImageOffsets, 245917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 246017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcAddr, srcPacking); 246117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 246217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul else { 246317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul /* general path */ 2464e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 246517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseInternalFormat, 246617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseFormat, 246717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcWidth, srcHeight, srcDepth, 246817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcFormat, srcType, srcAddr, 2469bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2470bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 247117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLfloat *src = tempImage; 247217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLint img, row, col; 247317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul if (!tempImage) 247417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul return GL_FALSE; 247517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (img = 0; img < srcDepth; img++) { 247617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 247717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 247817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul + dstYoffset * dstRowStride 247917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul + dstXoffset * texelBytes; 248017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (row = 0; row < srcHeight; row++) { 248117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLushort *dstUS = (GLushort *) dstRow; 248217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (col = 0; col < srcWidth; col++) { 248317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLushort r, g, b, a; 248417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 248517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(r, src[0]); 248617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(g, src[1]); 248717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(b, src[2]); 248817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(a, src[3]); 248917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+0] = r; 249017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+1] = g; 249117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+2] = b; 249217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+3] = a; 249317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul src += 4; 249417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 249517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstRow += dstRowStride; 249617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 249717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 249817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul free((void *) tempImage); 249917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 250017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul return GL_TRUE; 250117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul} 250217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 250317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 250417e96718946486ef77927fcf3bb299d8bff32b98Brian Paulstatic GLboolean 2505279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS) 2506279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul{ 2507279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2508279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2509279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2510daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGB_16 || 2511279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA_16); 2512279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2513279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul if (!ctx->_ImageTransferState && 2514279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul !srcPacking->SwapBytes && 2515279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseInternalFormat == GL_RGBA && 2516279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA_16 && 2517279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcFormat == GL_RGBA && 2518279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcType == GL_SHORT) { 2519279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* simple memcpy path */ 2520279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul memcpy_texture(ctx, dims, 2521279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2522279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstRowStride, 2523279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstImageOffsets, 2524279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2525279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcAddr, srcPacking); 2526279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2527279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul else { 2528279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* general path */ 2529e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2530279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseInternalFormat, 2531279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseFormat, 2532279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcWidth, srcHeight, srcDepth, 2533279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcFormat, srcType, srcAddr, 2534bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2535bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 2536279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLfloat *src = tempImage; 2537279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2; 2538279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLint img, row, col; 2539279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2540279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul if (!tempImage) 2541279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul return GL_FALSE; 2542279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2543279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* Note: tempImage is always float[4] / RGBA. We convert to 1, 2, 2544279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul * 3 or 4 components/pixel here. 2545279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul */ 2546279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul for (img = 0; img < srcDepth; img++) { 2547279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 2548279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2549279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul + dstYoffset * dstRowStride 2550279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul + dstXoffset * texelBytes; 2551279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul for (row = 0; row < srcHeight; row++) { 2552279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLshort *dstRowS = (GLshort *) dstRow; 2553daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (dstFormat == MESA_FORMAT_SIGNED_RGBA_16) { 2554daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 2555daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLuint c; 2556daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (c = 0; c < comps; c++) { 2557daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort p; 2558daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]); 2559daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRowS[col * comps + c] = p; 2560daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2561daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2562daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 2563daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 4 * srcWidth; 2564daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } else { 2565daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 2566daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLuint c; 2567daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (c = 0; c < comps; c++) { 2568daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort p; 2569daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 3 + c]); 2570daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRowS[col * comps + c] = p; 2571daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2572279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2573daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 2574daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 3 * srcWidth; 2575279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2576279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2577279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2578279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul free((void *) tempImage); 2579279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2580279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul return GL_TRUE; 2581279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul} 2582279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2583279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2584279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paulstatic GLboolean 2585b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb332(TEXSTORE_PARAMS) 2586f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 25871f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 25881f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 258922108bb571808542b89677752d62d3901698265fBrian Paul 25901f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB332); 259122108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 1); 2592f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2593f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2594f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2595f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB && 2596f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_RGB && srcType == GL_UNSIGNED_BYTE_3_3_2) { 2597f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 259817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 259960909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2600b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2601b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2602f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2603f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2604f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2605f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2606f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 2607663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 2608f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 260922108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2610f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2611f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2612f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2613663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 2614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2618b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 261922108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2620b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 262122108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2623f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 2624663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col] = PACK_COLOR_332( src[RCOMP], 2625663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 2626663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 2627f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += 3; 2628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 2630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 263232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2634f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2635f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2637f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 2639f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8. 2640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 264149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2642bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák_mesa_texstore_unorm8(TEXSTORE_PARAMS) 2643f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 26441f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 26451f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 264622108bb571808542b89677752d62d3901698265fBrian Paul 26471f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_A8 || 26481f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_L8 || 26495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_I8 || 26505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_R8); 265122108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 1); 2652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2654f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2655f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 2656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 2657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 265817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 265960909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2660b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2661b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2663f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2664f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 26653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 26663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 26673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 26683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 26693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 26703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 26713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 26723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 26731f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_A8) { 26743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 3; 26753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 26763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else { 26773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 0; 26783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 26793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = ZERO; /* ? */ 26803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[2] = ZERO; /* ? */ 26813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 26823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 26833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 26843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 26853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 26863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 26873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 1, 26883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 26893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstRowStride, dstImageOffsets, 26903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 26913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 26923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 2693f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2694f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 2695663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 2696f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 269722108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2698f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2699f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2700f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2701663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 2702f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2703f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2704f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2705f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2706b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 270722108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2708b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 270922108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2710f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2711f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 2712663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col] = src[col]; 2713f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2714f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 2715f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcWidth; 2716f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2717f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 271832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2719f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2720f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2721f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2722f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2723f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2724f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2725f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 27261f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV. 2727f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 272849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2729b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ycbcr(TEXSTORE_PARAMS) 2730f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 2731184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 27321f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 273322108bb571808542b89677752d62d3901698265fBrian Paul 2734a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; (void) dims; (void) baseInternalFormat; 2735f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 27361f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT((dstFormat == MESA_FORMAT_YCBCR) || 27371f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (dstFormat == MESA_FORMAT_YCBCR_REV)); 273822108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 2739f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(ctx->Extensions.MESA_ycbcr_texture); 2740f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(srcFormat == GL_YCBCR_MESA); 2741f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) || 2742f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA)); 2743f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_YCBCR_MESA); 2744f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2745f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* always just memcpy since no pixel transfer ops apply */ 274617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 274760909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2748b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2749b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2750f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2751f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2752f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2753f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* Check if we need byte swapping */ 2754f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* XXX the logic here _might_ be wrong */ 2755f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (srcPacking->SwapBytes ^ 2756f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^ 27571f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (dstFormat == MESA_FORMAT_YCBCR_REV) ^ 2758f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !littleEndian) { 2759f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 2760f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2761b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 276222108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2763b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 276422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2765f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2766b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul _mesa_swap2((GLushort *) dstRow, srcWidth); 2767b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 2768f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2769f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2770f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2771f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2772f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2773f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 277449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2775114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_texstore_dudv8(TEXSTORE_PARAMS) 2776114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 2777114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const GLboolean littleEndian = _mesa_little_endian(); 27781f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2779114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 27801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_DUDV8); 278122108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 2782114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT(ctx->Extensions.ATI_envmap_bumpmap); 2783114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT((srcFormat == GL_DU8DV8_ATI) || 2784114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger (srcFormat == GL_DUDV_ATI)); 2785114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT(baseInternalFormat == GL_DUDV_ATI); 2786114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2787114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!srcPacking->SwapBytes && srcType == GL_BYTE && 2788114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger littleEndian) { 2789114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* simple memcpy path */ 2790114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger memcpy_texture(ctx, dims, 2791114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2792114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstRowStride, 2793114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstImageOffsets, 2794114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2795114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcAddr, srcPacking); 2796114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2797114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (srcType == GL_BYTE) { 2798114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLubyte dstmap[4]; 2799114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2800114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* dstmap - how to swizzle from RGBA to dst format: 2801114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger */ 2802114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (littleEndian) { 2803114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[0] = 0; 2804114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[1] = 3; 2805114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2806114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 2807114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[0] = 3; 2808114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[1] = 0; 2809114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2810114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[2] = ZERO; /* ? */ 2811114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[3] = ONE; /* ? */ 2812114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2813114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_swizzle_ubyte_image(ctx, dims, 2814114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_LUMINANCE_ALPHA, /* hack */ 2815114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_UNSIGNED_BYTE, /* hack */ 2816114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_LUMINANCE_ALPHA, /* hack */ 2817114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap, 2, 2818114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstAddr, dstXoffset, dstYoffset, dstZoffset, 2819114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstRowStride, dstImageOffsets, 2820114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, srcDepth, srcAddr, 2821114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcPacking); 2822114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2823114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 2824114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* general path - note this is defined for 2d textures only */ 2825114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const GLint components = _mesa_components_in_format(baseInternalFormat); 28268c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth, 28278c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcFormat, srcType); 2828114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLbyte *tempImage, *dst, *src; 2829114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLint row; 2830114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 283132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth 2832114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger * components * sizeof(GLbyte)); 2833114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!tempImage) 2834114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_FALSE; 2835114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2836114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2837114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, 2838114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcFormat, srcType, 2839114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 0, 0, 0); 2840114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2841114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst = tempImage; 2842114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (row = 0; row < srcHeight; row++) { 2843114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat, 2844114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst, srcFormat, srcType, src, 2845114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcPacking, 0); 2846114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst += srcWidth * components; 2847114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src += srcStride; 2848114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2849114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2850114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src = tempImage; 2851114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst = (GLbyte *) dstAddr 2852114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger + dstYoffset * dstRowStride 285322108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2854114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (row = 0; row < srcHeight; row++) { 285522108bb571808542b89677752d62d3901698265fBrian Paul memcpy(dst, src, srcWidth * texelBytes); 2856114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst += dstRowStride; 285722108bb571808542b89677752d62d3901698265fBrian Paul src += srcWidth * texelBytes; 2858114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 285932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2860114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2861114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_TRUE; 2862114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 2863f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 286484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 286584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 2866daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized 8-bit format. 286784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 286884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 2869daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm8(TEXSTORE_PARAMS) 287084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 287184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 287284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 287384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2874daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_A8 || 2875daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_L8 || 2876daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_I8 || 2877daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_R8); 287884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(texelBytes == 1); 287984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2880daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 2881daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 2882daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 2883daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_BYTE) { 2884daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 2885daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 2886daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2887daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRowStride, 2888daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstImageOffsets, 2889daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2890daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 2891daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2892daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 289384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 2894e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 289584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 289684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 289784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 289884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 2899bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2900bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 2901daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 290284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 290384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 290484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 290584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 2906daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dstRow = (GLbyte *) dstAddr 290784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 290884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstYoffset * dstRowStride 290984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstXoffset * texelBytes; 291084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 291184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 2912daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow[col] = FLOAT_TO_BYTE_TEX(src[col]); 291384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 291484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 2915daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += srcWidth; 291684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 291784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 291884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 291984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 292084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 292184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 292284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 292384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 292484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 2925daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized two-channel 16-bit format. 292684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 292784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 2928daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm88(TEXSTORE_PARAMS) 292984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 2930daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLboolean littleEndian = _mesa_little_endian(); 293184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 293284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 293384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2934daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL88 || 2935daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_RG88_REV); 2936daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(texelBytes == 2); 293784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2938daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 2939daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 2940daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 2941daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_BYTE && 2942daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák littleEndian) { 2943daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 2944daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 2945daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2946daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRowStride, 2947daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstImageOffsets, 2948daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2949daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 2950daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2951daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 295284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 2953e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 295484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 295584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 295684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 295784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 2958bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2959bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 2960daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 296184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 296284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 296384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 296484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 2965daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dstRow = (GLbyte *) dstAddr 296684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 296784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstYoffset * dstRowStride 296884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstXoffset * texelBytes; 296984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 2970daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dst = dstRow; 297184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 2972daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = FLOAT_TO_BYTE_TEX(src[0]); 2973daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(src[1]); 2974daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 2; 2975daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 2; 297684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 297784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 297884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 297984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 298084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 298184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 298284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 298384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 298484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2985daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/* Texstore for signed R16, A16, L16, I16. */ 2986daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean 2987daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm16(TEXSTORE_PARAMS) 2988daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{ 2989daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLboolean littleEndian = _mesa_little_endian(); 2990daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2991daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2992daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2993daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_R16 || 2994daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_A16 || 2995daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_L16 || 2996daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_I16); 2997daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(texelBytes == 2); 2998daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2999daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 3000daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 3001daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 3002daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_SHORT && 3003daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák littleEndian) { 3004daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 3005daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 3006daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3007daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRowStride, 3008daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstImageOffsets, 3009daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3010daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 3011daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3012daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 3013daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* general path */ 3014daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3015daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat, 3016daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseFormat, 3017daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, 3018daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcFormat, srcType, srcAddr, 3019daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcPacking, 3020daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ctx->_ImageTransferState); 3021daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 3022daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLint img, row, col; 3023daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!tempImage) 3024daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_FALSE; 3025daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (img = 0; img < srcDepth; img++) { 3026daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLubyte *dstRow = (GLubyte *) dstAddr 3027daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák + dstImageOffsets[dstZoffset + img] * texelBytes 3028daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák + dstYoffset * dstRowStride 3029daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák + dstXoffset * texelBytes; 3030daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (row = 0; row < srcHeight; row++) { 3031daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort *dstUS = (GLshort *) dstRow; 3032daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 3033daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLushort r; 3034daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 3035daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(r, src[0]); 3036daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstUS[col] = r; 3037daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 1; 3038daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3039daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 3040daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3041daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3042daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák free((void *) tempImage); 3043daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3044daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_TRUE; 3045daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák} 3046daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 3047daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/** 3048daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Do texstore for 2-channel, 16-bit/channel, signed normalized formats. 3049daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák */ 3050daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean 3051daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm1616(TEXSTORE_PARAMS) 3052daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{ 3053daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLboolean littleEndian = _mesa_little_endian(); 3054daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3055daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3056daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 3057daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL1616 || 3058daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_GR1616); 3059daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(texelBytes == 4); 3060daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 3061daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 3062daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 3063daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 3064daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_SHORT && 3065daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák littleEndian) { 3066daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 3067daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 3068daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3069daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRowStride, 3070daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstImageOffsets, 3071daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3072daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 3073daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3074daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 3075daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* general path */ 3076daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3077daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat, 3078daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseFormat, 3079daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, 3080daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcFormat, srcType, srcAddr, 3081daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcPacking, 3082daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ctx->_ImageTransferState); 3083daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 3084daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLint img, row, col; 3085daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!tempImage) 3086daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_FALSE; 3087daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (img = 0; img < srcDepth; img++) { 3088daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLubyte *dstRow = (GLubyte *) dstAddr 3089daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák + dstImageOffsets[dstZoffset + img] * texelBytes 3090daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák + dstYoffset * dstRowStride 3091daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák + dstXoffset * texelBytes; 3092daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (row = 0; row < srcHeight; row++) { 3093daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort *dst = (GLshort *) dstRow; 3094daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 3095daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLushort l, a; 3096daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 3097daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(l, src[0]); 3098daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(a, src[1]); 3099daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = l; 3100daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = a; 3101daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 2; 3102daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 2; 3103daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3104daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 3105daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3106daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3107daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák free((void *) tempImage); 3108daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3109daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_TRUE; 3110daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák} 311184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 311284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 311384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBX8888. 311484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 311584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 311684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS) 311784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 311884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 311984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 312084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 312184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888); 312284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(texelBytes == 4); 312384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 312484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul { 312584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 3126e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 312784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 312884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 312984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 313084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 3131bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 3132bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 313384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLfloat *srcRow = tempImage; 313484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 313584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 313684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 313784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 3138daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dstRow = (GLbyte *) dstAddr 313984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 314084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstYoffset * dstRowStride 314184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstXoffset * texelBytes; 314284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 3143daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dst = dstRow; 314484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 3145daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 3146daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 3147daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 31488778bf221e90e9b59caad02ab72a0a0edcfe2451Brian Paul dst[0] = 127; 3149daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcRow += 3; 3150daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 4; 315184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 315284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 315384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 315484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 315584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 315684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 315784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 315884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 315984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 316084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 316184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 3162c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger/** 316339de9251c4770fdcce3395643003aa626178446dBrian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or 316439de9251c4770fdcce3395643003aa626178446dBrian Paul * MESA_FORMAT_SIGNED_RGBA8888_REV 3165c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */ 316649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3167c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS) 3168c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger{ 3169c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger const GLboolean littleEndian = _mesa_little_endian(); 31701f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 31711f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3172c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 31731f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 || 31741f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV); 317522108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 4); 3176c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 3177c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger if (!ctx->_ImageTransferState && 3178c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger !srcPacking->SwapBytes && 31791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888 && 3180c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat == GL_RGBA && 3181c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger ((srcFormat == GL_RGBA && srcType == GL_BYTE && !littleEndian) || 3182c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && littleEndian))) { 3183c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* simple memcpy path */ 3184c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger memcpy_texture(ctx, dims, 3185c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3186c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstRowStride, 3187c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstImageOffsets, 3188c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3189c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcAddr, srcPacking); 3190c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 3191c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger else if (!ctx->_ImageTransferState && 3192bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger !srcPacking->SwapBytes && 31931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV && 3194bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger baseInternalFormat == GL_RGBA && 3195bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger ((srcFormat == GL_RGBA && srcType == GL_BYTE && littleEndian) || 3196bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && !littleEndian))) { 3197bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger /* simple memcpy path */ 3198bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger memcpy_texture(ctx, dims, 3199bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3200bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger dstRowStride, 3201bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger dstImageOffsets, 3202bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3203bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcAddr, srcPacking); 3204bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 3205c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger else { 3206c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* general path */ 3207e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3208c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat, 320922108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 3210c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, 3211c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcFormat, srcType, srcAddr, 3212bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 3213bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 3214c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger const GLfloat *srcRow = tempImage; 3215c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger GLint img, row, col; 3216c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger if (!tempImage) 3217c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger return GL_FALSE; 3218c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (img = 0; img < srcDepth; img++) { 3219daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dstRow = (GLbyte *) dstAddr 322022108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3221c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger + dstYoffset * dstRowStride 322222108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 3223c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (row = 0; row < srcHeight; row++) { 3224daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dst = dstRow; 32251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) { 3226c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (col = 0; col < srcWidth; col++) { 3227daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 3228daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 3229daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 3230daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]); 3231c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcRow += 4; 3232daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 4; 3233c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 3234c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 3235bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger else { 3236bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger for (col = 0; col < srcWidth; col++) { 3237daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 3238daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 3239daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[2] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 3240daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[3] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]); 3241bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcRow += 4; 3242daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 4; 3243bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 3244bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 3245c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstRow += dstRowStride; 3246c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 3247c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 324832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 3249c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 3250c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger return GL_TRUE; 3251c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger} 3252f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 325384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 3254184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul/** 3255184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul * Store a combined depth/stencil texture image. 3256184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul */ 325749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3258b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z24_s8(TEXSTORE_PARAMS) 3259184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul{ 326092098438784887fd6005918794476cfbbeac5035Karl Schultz const GLuint depthScale = 0xffffff; 3261c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz const GLint srcRowStride 3262b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 3263c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz GLint img, row; 326425cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian 32651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_Z24_S8); 3266e41a91cea764cc1ba95906251cd907d837225293Marek Olšák ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || 3267e41a91cea764cc1ba95906251cd907d837225293Marek Olšák srcFormat == GL_DEPTH_COMPONENT || 3268e41a91cea764cc1ba95906251cd907d837225293Marek Olšák srcFormat == GL_STENCIL_INDEX); 3269c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT); 3270184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 3271e41a91cea764cc1ba95906251cd907d837225293Marek Olšák if (srcFormat == GL_DEPTH_STENCIL && ctx->Pixel.DepthScale == 1.0f && 3272966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 3273184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul !srcPacking->SwapBytes) { 3274ef8653a83800bc4b8e116e03ad52604097224378Brian Paul /* simple path */ 3275184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul memcpy_texture(ctx, dims, 3276184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3277b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 3278b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 3279184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3280184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul srcAddr, srcPacking); 328139de9251c4770fdcce3395643003aa626178446dBrian Paul } 3282e41a91cea764cc1ba95906251cd907d837225293Marek Olšák else if (srcFormat == GL_DEPTH_COMPONENT || 3283e41a91cea764cc1ba95906251cd907d837225293Marek Olšák srcFormat == GL_STENCIL_INDEX) { 3284c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* In case we only upload depth we need to preserve the stencil */ 3285ef8653a83800bc4b8e116e03ad52604097224378Brian Paul for (img = 0; img < srcDepth; img++) { 3286c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLuint *dstRow = (GLuint *) dstAddr 3287b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstImageOffsets[dstZoffset + img] 3288b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride / sizeof(GLuint) 3289b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstXoffset; 3290b786db06540472beda9cedd18937d6e12855b3ebBrian Paul const GLubyte *src 3291b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 3292c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcWidth, srcHeight, 3293c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcFormat, srcType, 3294c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie img, 0, 0); 3295ef8653a83800bc4b8e116e03ad52604097224378Brian Paul for (row = 0; row < srcHeight; row++) { 3296c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLuint depth[MAX_WIDTH]; 3297c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLubyte stencil[MAX_WIDTH]; 3298ef8653a83800bc4b8e116e03ad52604097224378Brian Paul GLint i; 3299c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; 3300c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3301c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */ 3302c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil = GL_TRUE; 330339de9251c4770fdcce3395643003aa626178446dBrian Paul } 330439de9251c4770fdcce3395643003aa626178446dBrian Paul else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */ 3305c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepdepth = GL_TRUE; 3306c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 3307c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3308c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepdepth == GL_FALSE) 3309c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* the 24 depth bits will be in the low position: */ 3310c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_depth_span(ctx, srcWidth, 3311c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_INT, /* dst type */ 3312c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil ? depth : dstRow, /* dst addr */ 3313c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie depthScale, 3314c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking); 3315c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3316c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil == GL_FALSE) 3317c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* get the 8-bit stencil values */ 3318c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_stencil_span(ctx, srcWidth, 3319c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_BYTE, /* dst type */ 3320c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie stencil, /* dst addr */ 3321c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking, 3322c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie ctx->_ImageTransferState); 3323c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3324c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (i = 0; i < srcWidth; i++) { 3325c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil) 3326c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF); 3327c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie else 3328c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF); 3329c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 3330ef8653a83800bc4b8e116e03ad52604097224378Brian Paul 3331ef8653a83800bc4b8e116e03ad52604097224378Brian Paul src += srcRowStride; 3332b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride / sizeof(GLuint); 3333ef8653a83800bc4b8e116e03ad52604097224378Brian Paul } 3334ef8653a83800bc4b8e116e03ad52604097224378Brian Paul } 3335184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul } 3336184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul return GL_TRUE; 3337184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul} 3338184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 3339184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 3340a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz/** 3341a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz * Store a combined depth/stencil texture image. 3342a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz */ 334349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3344a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz_mesa_texstore_s8_z24(TEXSTORE_PARAMS) 3345a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz{ 3346a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz const GLuint depthScale = 0xffffff; 3347a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz const GLint srcRowStride 3348b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 3349a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz GLint img, row; 3350a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz 33511f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_S8_Z24); 335239de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || 335339de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat == GL_DEPTH_COMPONENT || 335439de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat == GL_STENCIL_INDEX); 335539de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || 335639de9251c4770fdcce3395643003aa626178446dBrian Paul srcType == GL_UNSIGNED_INT_24_8_EXT); 3357c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca 3358c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (img = 0; img < srcDepth; img++) { 3359c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLuint *dstRow = (GLuint *) dstAddr 3360c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie + dstImageOffsets[dstZoffset + img] 3361c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie + dstYoffset * dstRowStride / sizeof(GLuint) 3362c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie + dstXoffset; 3363b786db06540472beda9cedd18937d6e12855b3ebBrian Paul const GLubyte *src 3364b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 3365c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcWidth, srcHeight, 3366c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcFormat, srcType, 3367c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie img, 0, 0); 3368c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (row = 0; row < srcHeight; row++) { 3369c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLuint depth[MAX_WIDTH]; 3370c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLubyte stencil[MAX_WIDTH]; 3371c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLint i; 3372c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; 3373c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3374c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */ 3375c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil = GL_TRUE; 337639de9251c4770fdcce3395643003aa626178446dBrian Paul } 337739de9251c4770fdcce3395643003aa626178446dBrian Paul else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */ 3378c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepdepth = GL_TRUE; 3379c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 3380666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz 3381c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepdepth == GL_FALSE) 3382c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* the 24 depth bits will be in the low position: */ 3383c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_depth_span(ctx, srcWidth, 3384c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_INT, /* dst type */ 3385c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil ? depth : dstRow, /* dst addr */ 3386c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie depthScale, 3387c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking); 3388c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3389c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil == GL_FALSE) 3390c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* get the 8-bit stencil values */ 3391c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_stencil_span(ctx, srcWidth, 3392c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_BYTE, /* dst type */ 3393c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie stencil, /* dst addr */ 3394c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking, 3395c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie ctx->_ImageTransferState); 3396c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3397c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* merge stencil values into depth values */ 3398c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (i = 0; i < srcWidth; i++) { 3399c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil) 3400c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000); 3401c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie else 3402c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24); 3403666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz 3404c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 3405c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie src += srcRowStride; 3406c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow += dstRowStride / sizeof(GLuint); 3407a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz } 3408a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz } 3409a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz return GL_TRUE; 3410a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz} 3411f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 341239de9251c4770fdcce3395643003aa626178446dBrian Paul 341339de9251c4770fdcce3395643003aa626178446dBrian Paul/** 341439de9251c4770fdcce3395643003aa626178446dBrian Paul * Store simple 8-bit/value stencil texture data. 341539de9251c4770fdcce3395643003aa626178446dBrian Paul */ 341639de9251c4770fdcce3395643003aa626178446dBrian Paulstatic GLboolean 341739de9251c4770fdcce3395643003aa626178446dBrian Paul_mesa_texstore_s8(TEXSTORE_PARAMS) 341839de9251c4770fdcce3395643003aa626178446dBrian Paul{ 341939de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(dstFormat == MESA_FORMAT_S8); 342039de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat == GL_STENCIL_INDEX); 342139de9251c4770fdcce3395643003aa626178446dBrian Paul 342239de9251c4770fdcce3395643003aa626178446dBrian Paul if (!ctx->_ImageTransferState && 342339de9251c4770fdcce3395643003aa626178446dBrian Paul !srcPacking->SwapBytes && 342439de9251c4770fdcce3395643003aa626178446dBrian Paul baseInternalFormat == srcFormat && 342539de9251c4770fdcce3395643003aa626178446dBrian Paul srcType == GL_UNSIGNED_BYTE) { 342639de9251c4770fdcce3395643003aa626178446dBrian Paul /* simple memcpy path */ 342739de9251c4770fdcce3395643003aa626178446dBrian Paul memcpy_texture(ctx, dims, 342839de9251c4770fdcce3395643003aa626178446dBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 342939de9251c4770fdcce3395643003aa626178446dBrian Paul dstRowStride, 343039de9251c4770fdcce3395643003aa626178446dBrian Paul dstImageOffsets, 343139de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 343239de9251c4770fdcce3395643003aa626178446dBrian Paul srcAddr, srcPacking); 343339de9251c4770fdcce3395643003aa626178446dBrian Paul } 343439de9251c4770fdcce3395643003aa626178446dBrian Paul else { 343539de9251c4770fdcce3395643003aa626178446dBrian Paul const GLint srcRowStride 3436b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 343739de9251c4770fdcce3395643003aa626178446dBrian Paul GLint img, row; 343839de9251c4770fdcce3395643003aa626178446dBrian Paul 343939de9251c4770fdcce3395643003aa626178446dBrian Paul for (img = 0; img < srcDepth; img++) { 344039de9251c4770fdcce3395643003aa626178446dBrian Paul GLubyte *dstRow = (GLubyte *) dstAddr 344139de9251c4770fdcce3395643003aa626178446dBrian Paul + dstImageOffsets[dstZoffset + img] 344239de9251c4770fdcce3395643003aa626178446dBrian Paul + dstYoffset * dstRowStride / sizeof(GLuint) 344339de9251c4770fdcce3395643003aa626178446dBrian Paul + dstXoffset; 3444b786db06540472beda9cedd18937d6e12855b3ebBrian Paul const GLubyte *src 3445b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 344639de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, 344739de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat, srcType, 344839de9251c4770fdcce3395643003aa626178446dBrian Paul img, 0, 0); 344939de9251c4770fdcce3395643003aa626178446dBrian Paul for (row = 0; row < srcHeight; row++) { 345039de9251c4770fdcce3395643003aa626178446dBrian Paul GLubyte stencil[MAX_WIDTH]; 345139de9251c4770fdcce3395643003aa626178446dBrian Paul GLint i; 345239de9251c4770fdcce3395643003aa626178446dBrian Paul 345339de9251c4770fdcce3395643003aa626178446dBrian Paul /* get the 8-bit stencil values */ 345439de9251c4770fdcce3395643003aa626178446dBrian Paul _mesa_unpack_stencil_span(ctx, srcWidth, 345539de9251c4770fdcce3395643003aa626178446dBrian Paul GL_UNSIGNED_BYTE, /* dst type */ 345639de9251c4770fdcce3395643003aa626178446dBrian Paul stencil, /* dst addr */ 345739de9251c4770fdcce3395643003aa626178446dBrian Paul srcType, src, srcPacking, 345839de9251c4770fdcce3395643003aa626178446dBrian Paul ctx->_ImageTransferState); 345939de9251c4770fdcce3395643003aa626178446dBrian Paul /* merge stencil values into depth values */ 346039de9251c4770fdcce3395643003aa626178446dBrian Paul for (i = 0; i < srcWidth; i++) 346139de9251c4770fdcce3395643003aa626178446dBrian Paul dstRow[i] = stencil[i]; 346239de9251c4770fdcce3395643003aa626178446dBrian Paul 346339de9251c4770fdcce3395643003aa626178446dBrian Paul src += srcRowStride; 346439de9251c4770fdcce3395643003aa626178446dBrian Paul dstRow += dstRowStride / sizeof(GLubyte); 346539de9251c4770fdcce3395643003aa626178446dBrian Paul } 346639de9251c4770fdcce3395643003aa626178446dBrian Paul } 346739de9251c4770fdcce3395643003aa626178446dBrian Paul 346839de9251c4770fdcce3395643003aa626178446dBrian Paul } 346939de9251c4770fdcce3395643003aa626178446dBrian Paul 347039de9251c4770fdcce3395643003aa626178446dBrian Paul return GL_TRUE; 347139de9251c4770fdcce3395643003aa626178446dBrian Paul} 347239de9251c4770fdcce3395643003aa626178446dBrian Paul 347339de9251c4770fdcce3395643003aa626178446dBrian Paul 3474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 3475f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Store an image in any of the formats: 3476f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_rgba_float32 3477f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_rgb_float32 3478f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_alpha_float32 3479f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_luminance_float32 3480f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_luminance_alpha_float32 3481f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_intensity_float32 3482f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 348349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3484b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float32(TEXSTORE_PARAMS) 3485f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 34861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 34871f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 348822108bb571808542b89677752d62d3901698265fBrian Paul const GLint components = _mesa_components_in_format(baseFormat); 3489f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 34901f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 || 34911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB_FLOAT32 || 34921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ALPHA_FLOAT32 || 34931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 || 34941f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 || 34950ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_INTENSITY_FLOAT32 || 34960ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_R_FLOAT32 || 34970ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_RG_FLOAT32); 3498f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3499f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB || 3500f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_ALPHA || 3501f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE || 3502f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 35030ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_INTENSITY || 35040ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RED || 35050ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RG); 350622108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == components * sizeof(GLfloat)); 3507f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3508f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 3509f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 3510f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 35119e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák baseInternalFormat == baseFormat && 3512f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_FLOAT) { 3513f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 351417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 351560909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3516b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 3517b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 3518f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3519f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 3520f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3521f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 3522f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 3523e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 352522108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 3526f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 3527f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 3528bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 3529bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 3530b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLfloat *srcRow = tempImage; 35319c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul GLint bytesPerRow; 3532f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 3533f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 3534f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 35359c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul bytesPerRow = srcWidth * components * sizeof(GLfloat); 3536f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 3537b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 353822108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3539b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 354022108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 3541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 3542c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy(dstRow, srcRow, bytesPerRow); 3543b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 3544b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcRow += srcWidth * components; 3545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 354832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 3549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 3551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 3552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3553c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3554f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 3556f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * As above, but store 16-bit floats. 3557f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 355849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3559b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float16(TEXSTORE_PARAMS) 3560f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 35611f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 35621f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 356322108bb571808542b89677752d62d3901698265fBrian Paul const GLint components = _mesa_components_in_format(baseFormat); 3564f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 35651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 || 35661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB_FLOAT16 || 35671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ALPHA_FLOAT16 || 35681f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 || 35691f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 || 35700ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_INTENSITY_FLOAT16 || 35710ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_R_FLOAT16 || 35720ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_RG_FLOAT16); 3573f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3574f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB || 3575f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_ALPHA || 3576f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE || 3577f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 35780ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_INTENSITY || 35790ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RED || 35800ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RG); 358122108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == components * sizeof(GLhalfARB)); 3582f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 3584f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 3585f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 35869e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák baseInternalFormat == baseFormat && 3587f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_HALF_FLOAT_ARB) { 3588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 358917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 359060909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3591b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 3592b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 3593f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3594f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 3595f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3596f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 3597f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 3598e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3599f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 360022108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 3601f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 3602f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 3603bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 3604bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 3605f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLfloat *src = tempImage; 3606f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 3607f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 3608f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 3609f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 3610b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 361122108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3612b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 361322108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 3614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 3615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLhalfARB *dstTexel = (GLhalfARB *) dstRow; 3616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i; 3617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < srcWidth * components; i++) { 3618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstTexel[i] = _mesa_float_to_half(src[i]); 3619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 3621f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcWidth * components; 3622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3623f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3624f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 362532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 3626f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3627f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 3628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 3629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3631abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int8 */ 3632abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3633abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int8(TEXSTORE_PARAMS) 3634abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3635abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3636abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3637abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3638abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3639abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_INT8); 3640abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3641abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3642abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3643abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3644abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3645abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3646abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLbyte)); 3647abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3648bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3649bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3650bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3651bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3652abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3653abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_BYTE) { 3654abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3655abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3656abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3657abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRowStride, 3658abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstImageOffsets, 3659abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3660abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3661abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3662abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3663abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3664e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3665abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat, 3666abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseFormat, 3667abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, 3668abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcFormat, srcType, srcAddr, 3669bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 0x0); 3670abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *src = tempImage; 3671abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3672abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3673abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3674abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3675abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 3676abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3677abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3678abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3679abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3680abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLbyte *dstTexel = (GLbyte *) dstRow; 3681abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3682abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3683abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLbyte) src[i]; 3684abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3685abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3686abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3687abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3688abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3689abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3690abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3691abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3692abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3693abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3694abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3695abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3696abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int16 */ 3697abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3698abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int16(TEXSTORE_PARAMS) 3699abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3700abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3701abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3702abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3703abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3704abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_INT16); 3705abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3706abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3707abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3708abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3709abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3710abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3711abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLshort)); 3712abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3713bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3714bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3715bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3716bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3717abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 37189fc7fa0a4cbe9dc8faa124744f623491fa754bd7Brian Paul srcType == GL_SHORT) { 3719abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3720abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3721abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3722abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRowStride, 3723abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstImageOffsets, 3724abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3725abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3726abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3727abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3728abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3729e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3730abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat, 3731abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseFormat, 3732abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, 3733abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcFormat, srcType, srcAddr, 3734bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 0x0); 3735abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *src = tempImage; 3736abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3737abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3738abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3739abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3740abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 3741abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3742abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3743abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3744abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3745abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLshort *dstTexel = (GLshort *) dstRow; 3746abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3747abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3748abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLint) src[i]; 3749abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3750abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3751abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3752abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3753abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3754abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3755abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3756abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3757abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3758abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3759abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3760abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3761abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int32 */ 3762abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3763abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int32(TEXSTORE_PARAMS) 3764abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3765abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3766abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3767abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3768abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3769abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_INT32); 3770abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3771abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3772abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3773abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3774abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3775abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3776abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLint)); 3777abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3778bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3779bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3780bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3781bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3782abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3783abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_INT) { 3784abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3785abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3786abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3787abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRowStride, 3788abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstImageOffsets, 3789abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3790abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3791abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3792abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3793abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3794e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3795abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat, 3796abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseFormat, 3797abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, 3798abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcFormat, srcType, srcAddr, 3799bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 0x0); 3800abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *src = tempImage; 3801abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3802abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3803abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3804abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3805abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 3806abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3807abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3808abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3809abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3810abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint *dstTexel = (GLint *) dstRow; 3811abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3812abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3813abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLint) src[i]; 3814abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3815abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3816abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3817abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3818abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3819abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3820abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3821abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3822abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3823abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3824abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3825abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3826abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int8 */ 3827abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3828abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS) 3829abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3830abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3831abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3832abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3833abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3834abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT8); 3835abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3836abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3837abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3838abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3839abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3840abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3841abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLubyte)); 3842abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3843bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3844bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3845bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3846bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3847abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3848abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_BYTE) { 3849abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3850abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3851abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3852abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRowStride, 3853abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstImageOffsets, 3854abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3855abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3856abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3857abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3858abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3859dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *tempImage = 3860dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3861dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, srcDepth, 3862dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, srcAddr, srcPacking); 3863dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *src = tempImage; 3864abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3865abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3866abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3867abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3868abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 3869abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3870abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3871abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3872abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3873abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstTexel = (GLubyte *) dstRow; 3874abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3875abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3876dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dstTexel[i] = (GLubyte) CLAMP(src[i], 0, 0xff); 3877abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3878abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3879abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3880abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3881abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3882abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3883abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3884abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3885abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3886abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3887abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3888abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3889abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int16 */ 3890abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3891abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS) 3892abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3893abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3894abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3895abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3896abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3897abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT16); 3898abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3899abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3900abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3901abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3902abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3903abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3904abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLushort)); 3905abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3906bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3907bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3908bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3909bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3910abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3911abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_SHORT) { 3912abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3913abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3914abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3915abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRowStride, 3916abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstImageOffsets, 3917abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3918abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3919abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3920abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3921abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3922dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *tempImage = 3923dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3924dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, srcDepth, 3925dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, srcAddr, srcPacking); 3926dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *src = tempImage; 3927abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3928abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3929abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3930abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3931abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 3932abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3933abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3934abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3935abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3936abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLushort *dstTexel = (GLushort *) dstRow; 3937abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3938abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3939dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dstTexel[i] = (GLushort) CLAMP(src[i], 0, 0xffff); 3940abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3941abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3942abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3943abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3944abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3945abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3946abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3947abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3948abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3949abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3950abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3951abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3952abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int32 */ 3953abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3954abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS) 3955abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3956abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3957abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3958abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3959abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3960abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_UINT32); 3961abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3962abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3963abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3964abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3965abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3966abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3967abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLuint)); 3968abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3969bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3970bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3971bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3972bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3973abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3974abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_INT) { 3975abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3976abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3977abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3978abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRowStride, 3979abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstImageOffsets, 3980abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3981abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3982abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3983abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3984abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3985dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *tempImage = 3986dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3987dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, srcDepth, 3988dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, srcAddr, srcPacking); 3989dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *src = tempImage; 3990abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3991abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3992abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3993abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3994abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 3995abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 3996abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3997abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3998abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3999abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLuint *dstTexel = (GLuint *) dstRow; 4000abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 4001abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 4002dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dstTexel[i] = src[i]; 4003abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 4004abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 4005abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 4006abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 4007abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 4008abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 4009abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 4010abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 4011abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 4012abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 4013abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 4014abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 4015abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 4016abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 40178d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#if FEATURE_EXT_texture_sRGB 401849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 40198d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgb8(TEXSTORE_PARAMS) 40208d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 40211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 402246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 402346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 40241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SRGB8); 402546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 402646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal rgb texstore code */ 40271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_RGB888; 402846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 40290f91e4461fb3a7410c948acde270d97caa851ed6Brian Paul k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat, 403039de9251c4770fdcce3395643003aa626178446dBrian Paul newDstFormat, dstAddr, 403139de9251c4770fdcce3395643003aa626178446dBrian Paul dstXoffset, dstYoffset, dstZoffset, 403239de9251c4770fdcce3395643003aa626178446dBrian Paul dstRowStride, dstImageOffsets, 403339de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, srcDepth, 403439de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat, srcType, 403539de9251c4770fdcce3395643003aa626178446dBrian Paul srcAddr, srcPacking); 403646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 40378d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 40388d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 403954e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 404049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 40418d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgba8(TEXSTORE_PARAMS) 40428d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 40431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 404446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 404546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 40461f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SRGBA8); 404746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 404846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal rgba texstore code */ 40491f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_RGBA8888; 405046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat, 405146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul newDstFormat, dstAddr, 405246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul dstXoffset, dstYoffset, dstZoffset, 405346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul dstRowStride, dstImageOffsets, 405446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcWidth, srcHeight, srcDepth, 405546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcFormat, srcType, 405646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcAddr, srcPacking); 405746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 40588d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 40598d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 406054e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 406149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 40625bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger_mesa_texstore_sargb8(TEXSTORE_PARAMS) 40635bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{ 40641f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 40655bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger GLboolean k; 40665bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 40671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SARGB8); 40685bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 40695bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger /* reuse normal rgba texstore code */ 40701f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_ARGB8888; 40715bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 40725bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat, 40735bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger newDstFormat, dstAddr, 40745bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger dstXoffset, dstYoffset, dstZoffset, 40755bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger dstRowStride, dstImageOffsets, 40765bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcWidth, srcHeight, srcDepth, 40775bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcFormat, srcType, 40785bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcAddr, srcPacking); 40795bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger return k; 40805bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger} 40815bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 40825bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 408349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 40848d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sl8(TEXSTORE_PARAMS) 40858d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 40861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 408746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 408846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 40891f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SL8); 409046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 40911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_L8; 409246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 409354e15d65858c1d1eeea7291059766686cf2e1671Brian Paul /* _mesa_textore_a8 handles luminance8 too */ 4094bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák k = _mesa_texstore_unorm8(ctx, dims, baseInternalFormat, 409554e15d65858c1d1eeea7291059766686cf2e1671Brian Paul newDstFormat, dstAddr, 409654e15d65858c1d1eeea7291059766686cf2e1671Brian Paul dstXoffset, dstYoffset, dstZoffset, 409754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul dstRowStride, dstImageOffsets, 409854e15d65858c1d1eeea7291059766686cf2e1671Brian Paul srcWidth, srcHeight, srcDepth, 409954e15d65858c1d1eeea7291059766686cf2e1671Brian Paul srcFormat, srcType, 410054e15d65858c1d1eeea7291059766686cf2e1671Brian Paul srcAddr, srcPacking); 410146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 41028d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 41038d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 410454e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 410549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 41068d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sla8(TEXSTORE_PARAMS) 41078d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 41081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 410946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 411046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 41111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SLA8); 411246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 411346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal luminance/alpha texstore code */ 41141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_AL88; 411546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 41165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat, 41175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick newDstFormat, dstAddr, 41185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstXoffset, dstYoffset, dstZoffset, 41195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstRowStride, dstImageOffsets, 41205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, 41215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcFormat, srcType, 41225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcAddr, srcPacking); 412346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 41248d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 41258d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 41269927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#else 41279927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu 41289927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu/* these are used only in texstore_funcs[] below */ 41299927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgb8 NULL 41309927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgba8 NULL 41319927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sargb8 NULL 41329927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sl8 NULL 41339927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sla8 NULL 41349927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu 41358d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#endif /* FEATURE_EXT_texture_sRGB */ 41368d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 41379d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšákstatic GLboolean 41389d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák_mesa_texstore_rgb9_e5(TEXSTORE_PARAMS) 41399d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák{ 41409d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 41419d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák 41429d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák ASSERT(dstFormat == MESA_FORMAT_RGB9_E5_FLOAT); 41439d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák ASSERT(baseInternalFormat == GL_RGB); 41449d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák 41459d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák if (!ctx->_ImageTransferState && 41469d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák !srcPacking->SwapBytes && 41479d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcFormat == GL_RGB && 41489d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcType == GL_UNSIGNED_INT_5_9_9_9_REV) { 41499d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák /* simple memcpy path */ 41509d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák memcpy_texture(ctx, dims, 41519d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 41529d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák dstRowStride, 41539d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák dstImageOffsets, 41549d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 41559d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcAddr, srcPacking); 41569d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41579d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák else { 41589d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák /* general path */ 41599d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 41609d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák baseInternalFormat, 41619d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák baseFormat, 41629d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcWidth, srcHeight, srcDepth, 41639d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcFormat, srcType, srcAddr, 41649d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcPacking, 41659d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák ctx->_ImageTransferState); 41669d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLfloat *srcRow = tempImage; 41679d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLint img, row, col; 41689d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák if (!tempImage) 41699d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák return GL_FALSE; 41709d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (img = 0; img < srcDepth; img++) { 41719d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLubyte *dstRow = (GLubyte *) dstAddr 41729d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák + dstImageOffsets[dstZoffset + img] * 4 41739d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák + dstYoffset * dstRowStride 41749d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák + dstXoffset * 4; 41759d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (row = 0; row < srcHeight; row++) { 41769d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLuint *dstUI = (GLuint*)dstRow; 41779d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (col = 0; col < srcWidth; col++) { 41789d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák dstUI[col] = float3_to_rgb9e5(&srcRow[col * 3]); 41799d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41809d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák dstRow += dstRowStride; 41819d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcRow += srcWidth * 3; 41829d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41839d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41849d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák 41859d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák free((void *) tempImage); 41869d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41879d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák return GL_TRUE; 41889d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák} 4189f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 4190631d23daa91c569bf268a2191bd466df73a64263Marek Olšákstatic GLboolean 4191631d23daa91c569bf268a2191bd466df73a64263Marek Olšák_mesa_texstore_r11_g11_b10f(TEXSTORE_PARAMS) 4192631d23daa91c569bf268a2191bd466df73a64263Marek Olšák{ 4193631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 4194631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 4195631d23daa91c569bf268a2191bd466df73a64263Marek Olšák ASSERT(dstFormat == MESA_FORMAT_R11_G11_B10_FLOAT); 4196631d23daa91c569bf268a2191bd466df73a64263Marek Olšák ASSERT(baseInternalFormat == GL_RGB); 4197631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 4198631d23daa91c569bf268a2191bd466df73a64263Marek Olšák if (!ctx->_ImageTransferState && 4199631d23daa91c569bf268a2191bd466df73a64263Marek Olšák !srcPacking->SwapBytes && 4200631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcFormat == GL_RGB && 4201631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcType == GL_UNSIGNED_INT_10F_11F_11F_REV) { 4202631d23daa91c569bf268a2191bd466df73a64263Marek Olšák /* simple memcpy path */ 4203631d23daa91c569bf268a2191bd466df73a64263Marek Olšák memcpy_texture(ctx, dims, 4204631d23daa91c569bf268a2191bd466df73a64263Marek Olšák dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 4205631d23daa91c569bf268a2191bd466df73a64263Marek Olšák dstRowStride, 4206631d23daa91c569bf268a2191bd466df73a64263Marek Olšák dstImageOffsets, 4207631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 4208631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcAddr, srcPacking); 4209631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4210631d23daa91c569bf268a2191bd466df73a64263Marek Olšák else { 4211631d23daa91c569bf268a2191bd466df73a64263Marek Olšák /* general path */ 4212631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 4213631d23daa91c569bf268a2191bd466df73a64263Marek Olšák baseInternalFormat, 4214631d23daa91c569bf268a2191bd466df73a64263Marek Olšák baseFormat, 4215631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcWidth, srcHeight, srcDepth, 4216631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcFormat, srcType, srcAddr, 4217631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcPacking, 4218631d23daa91c569bf268a2191bd466df73a64263Marek Olšák ctx->_ImageTransferState); 4219631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLfloat *srcRow = tempImage; 4220631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLint img, row, col; 4221631d23daa91c569bf268a2191bd466df73a64263Marek Olšák if (!tempImage) 4222631d23daa91c569bf268a2191bd466df73a64263Marek Olšák return GL_FALSE; 4223631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (img = 0; img < srcDepth; img++) { 4224631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLubyte *dstRow = (GLubyte *) dstAddr 4225631d23daa91c569bf268a2191bd466df73a64263Marek Olšák + dstImageOffsets[dstZoffset + img] * 4 4226631d23daa91c569bf268a2191bd466df73a64263Marek Olšák + dstYoffset * dstRowStride 4227631d23daa91c569bf268a2191bd466df73a64263Marek Olšák + dstXoffset * 4; 4228631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (row = 0; row < srcHeight; row++) { 4229631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLuint *dstUI = (GLuint*)dstRow; 4230631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (col = 0; col < srcWidth; col++) { 4231631d23daa91c569bf268a2191bd466df73a64263Marek Olšák dstUI[col] = float3_to_r11g11b10f(&srcRow[col * 3]); 4232631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4233631d23daa91c569bf268a2191bd466df73a64263Marek Olšák dstRow += dstRowStride; 4234631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcRow += srcWidth * 3; 4235631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4236631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4237631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 4238631d23daa91c569bf268a2191bd466df73a64263Marek Olšák free((void *) tempImage); 4239631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4240631d23daa91c569bf268a2191bd466df73a64263Marek Olšák return GL_TRUE; 4241631d23daa91c569bf268a2191bd466df73a64263Marek Olšák} 4242631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 4243485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 4244b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšákstatic GLboolean 4245b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák_mesa_texstore_z32f_x24s8(TEXSTORE_PARAMS) 4246b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák{ 4247b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ASSERT(dstFormat == MESA_FORMAT_Z32_FLOAT_X24S8); 4248b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ASSERT(srcFormat == GL_DEPTH_STENCIL || 4249b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat == GL_DEPTH_COMPONENT || 4250b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat == GL_STENCIL_INDEX); 4251b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ASSERT(srcFormat != GL_DEPTH_STENCIL || 4252b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 4253b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 4254b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák if (srcFormat == GL_DEPTH_STENCIL && 4255b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ctx->Pixel.DepthScale == 1.0f && 4256b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ctx->Pixel.DepthBias == 0.0f && 4257b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák !srcPacking->SwapBytes) { 4258b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák /* simple path */ 4259b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák memcpy_texture(ctx, dims, 4260b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 4261b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstRowStride, 4262b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstImageOffsets, 4263b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 4264b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcAddr, srcPacking); 4265b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 4266b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák else if (srcFormat == GL_DEPTH_COMPONENT || 4267b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat == GL_STENCIL_INDEX) { 4268b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák GLint img, row; 4269b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák const GLint srcRowStride 4270b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType) 4271b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák / sizeof(uint64_t); 4272b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 4273b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák /* In case we only upload depth we need to preserve the stencil */ 4274b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák for (img = 0; img < srcDepth; img++) { 4275b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák uint64_t *dstRow = (uint64_t *) dstAddr 4276b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák + dstImageOffsets[dstZoffset + img] 4277b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák + dstYoffset * dstRowStride / sizeof(uint64_t) 4278b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák + dstXoffset; 4279b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák const uint64_t *src 4280b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák = (const uint64_t *) _mesa_image_address(dims, srcPacking, srcAddr, 4281b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcWidth, srcHeight, 4282b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat, srcType, 4283b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák img, 0, 0); 4284b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák for (row = 0; row < srcHeight; row++) { 4285b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák /* The unpack functions with: 4286b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák * dstType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV 4287b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák * only write their own dword, so the other dword (stencil 4288b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák * or depth) is preserved. */ 4289b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák if (srcFormat != GL_STENCIL_INDEX) 4290b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák _mesa_unpack_depth_span(ctx, srcWidth, 4291b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */ 4292b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstRow, /* dst addr */ 4293b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 1.0f, srcType, src, srcPacking); 4294b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 4295b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák if (srcFormat != GL_DEPTH_COMPONENT) 4296b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák _mesa_unpack_stencil_span(ctx, srcWidth, 4297b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */ 4298b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstRow, /* dst addr */ 4299b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcType, src, srcPacking, 4300b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ctx->_ImageTransferState); 4301b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 4302b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák src += srcRowStride; 4303b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstRow += dstRowStride / sizeof(uint64_t); 4304b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 4305b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 4306b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 4307b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák return GL_TRUE; 4308b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák} 4309b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 4310485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 4311485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/** 431239de9251c4770fdcce3395643003aa626178446dBrian Paul * Table mapping MESA_FORMAT_* to _mesa_texstore_*() 4313485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * XXX this is somewhat temporary. 4314485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */ 4315b1616b2a811b9a161d1ee2a8251e0efe32a8c192Ian Romanickstatic const struct { 4316485105ed182e2e997b084f047e72d5a2c3460057Brian Paul gl_format Name; 4317485105ed182e2e997b084f047e72d5a2c3460057Brian Paul StoreTexImageFunc Store; 4318485105ed182e2e997b084f047e72d5a2c3460057Brian Paul} 4319485105ed182e2e997b084f047e72d5a2c3460057Brian Paultexstore_funcs[MESA_FORMAT_COUNT] = 4320485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{ 4321bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_NONE, NULL }, 4322485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGBA8888, _mesa_texstore_rgba8888 }, 4323485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGBA8888_REV, _mesa_texstore_rgba8888 }, 4324485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB8888, _mesa_texstore_argb8888 }, 4325485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB8888_REV, _mesa_texstore_argb8888 }, 432674d61d03b54d72217d463c248468cdcd09320efcBrian Paul { MESA_FORMAT_XRGB8888, _mesa_texstore_argb8888 }, 43272d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer { MESA_FORMAT_XRGB8888_REV, _mesa_texstore_argb8888 }, 4328485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGB888, _mesa_texstore_rgb888 }, 4329485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_BGR888, _mesa_texstore_bgr888 }, 4330485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGB565, _mesa_texstore_rgb565 }, 4331485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGB565_REV, _mesa_texstore_rgb565 }, 4332485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB4444, _mesa_texstore_argb4444 }, 4333485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB4444_REV, _mesa_texstore_argb4444 }, 4334485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGBA5551, _mesa_texstore_rgba5551 }, 4335485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB1555, _mesa_texstore_argb1555 }, 4336485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB1555_REV, _mesa_texstore_argb1555 }, 4337bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák { MESA_FORMAT_AL44, _mesa_texstore_unorm44 }, 43385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_AL88, _mesa_texstore_unorm88 }, 43395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_AL88_REV, _mesa_texstore_unorm88 }, 43405d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_AL1616, _mesa_texstore_unorm1616 }, 43415d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_AL1616_REV, _mesa_texstore_unorm1616 }, 4342485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGB332, _mesa_texstore_rgb332 }, 4343bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák { MESA_FORMAT_A8, _mesa_texstore_unorm8 }, 4344eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák { MESA_FORMAT_A16, _mesa_texstore_unorm16 }, 4345bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák { MESA_FORMAT_L8, _mesa_texstore_unorm8 }, 4346bb5ace68ce9e8bd171a39162ed6bd93632bd6619Marek Olšák { MESA_FORMAT_L16, _mesa_texstore_unorm16 }, 4347bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák { MESA_FORMAT_I8, _mesa_texstore_unorm8 }, 4348fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák { MESA_FORMAT_I16, _mesa_texstore_unorm16 }, 4349485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_YCBCR, _mesa_texstore_ycbcr }, 4350485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_YCBCR_REV, _mesa_texstore_ycbcr }, 4351bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák { MESA_FORMAT_R8, _mesa_texstore_unorm8 }, 43525d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_RG88, _mesa_texstore_unorm88 }, 43535d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_RG88_REV, _mesa_texstore_unorm88 }, 4354eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák { MESA_FORMAT_R16, _mesa_texstore_unorm16 }, 43555d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_RG1616, _mesa_texstore_unorm1616 }, 43565d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { MESA_FORMAT_RG1616_REV, _mesa_texstore_unorm1616 }, 4357621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák { MESA_FORMAT_ARGB2101010, _mesa_texstore_argb2101010 }, 4358485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_Z24_S8, _mesa_texstore_z24_s8 }, 4359485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_S8_Z24, _mesa_texstore_s8_z24 }, 4360485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_Z16, _mesa_texstore_z16 }, 4361e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul { MESA_FORMAT_X8_Z24, _mesa_texstore_x8_z24 }, 4362c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca { MESA_FORMAT_Z24_X8, _mesa_texstore_z24_x8 }, 4363485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_Z32, _mesa_texstore_z32 }, 4364c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie { MESA_FORMAT_S8, _mesa_texstore_s8 }, 4365bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGB8, _mesa_texstore_srgb8 }, 4366bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGBA8, _mesa_texstore_srgba8 }, 4367bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SARGB8, _mesa_texstore_sargb8 }, 4368bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SL8, _mesa_texstore_sl8 }, 4369bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SLA8, _mesa_texstore_sla8 }, 4370bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGB_DXT1, _mesa_texstore_rgb_dxt1 }, 4371bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGBA_DXT1, _mesa_texstore_rgba_dxt1 }, 4372bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGBA_DXT3, _mesa_texstore_rgba_dxt3 }, 4373bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGBA_DXT5, _mesa_texstore_rgba_dxt5 }, 4374bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGB_FXT1, _mesa_texstore_rgb_fxt1 }, 4375bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_FXT1, _mesa_texstore_rgba_fxt1 }, 4376bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGB_DXT1, _mesa_texstore_rgb_dxt1 }, 4377bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_DXT1, _mesa_texstore_rgba_dxt1 }, 4378bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_DXT3, _mesa_texstore_rgba_dxt3 }, 4379bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_DXT5, _mesa_texstore_rgba_dxt5 }, 4380bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_FLOAT32, _mesa_texstore_rgba_float32 }, 4381bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_FLOAT16, _mesa_texstore_rgba_float16 }, 4382bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGB_FLOAT32, _mesa_texstore_rgba_float32 }, 4383bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGB_FLOAT16, _mesa_texstore_rgba_float16 }, 4384bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 }, 4385bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 }, 4386bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_LUMINANCE_FLOAT32, _mesa_texstore_rgba_float32 }, 4387bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_LUMINANCE_FLOAT16, _mesa_texstore_rgba_float16 }, 4388bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 }, 4389bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 }, 4390bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_INTENSITY_FLOAT32, _mesa_texstore_rgba_float32 }, 4391bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_INTENSITY_FLOAT16, _mesa_texstore_rgba_float16 }, 43920ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák { MESA_FORMAT_R_FLOAT32, _mesa_texstore_rgba_float32 }, 43930ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák { MESA_FORMAT_R_FLOAT16, _mesa_texstore_rgba_float16 }, 43940ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák { MESA_FORMAT_RG_FLOAT32, _mesa_texstore_rgba_float32 }, 43950ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák { MESA_FORMAT_RG_FLOAT16, _mesa_texstore_rgba_float16 }, 4396abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 4397abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul { MESA_FORMAT_RGBA_INT8, _mesa_texstore_rgba_int8 }, 4398abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul { MESA_FORMAT_RGBA_INT16, _mesa_texstore_rgba_int16 }, 4399abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul { MESA_FORMAT_RGBA_INT32, _mesa_texstore_rgba_int32 }, 4400abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul { MESA_FORMAT_RGBA_UINT8, _mesa_texstore_rgba_uint8 }, 4401abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul { MESA_FORMAT_RGBA_UINT16, _mesa_texstore_rgba_uint16 }, 4402abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul { MESA_FORMAT_RGBA_UINT32, _mesa_texstore_rgba_uint32 }, 4403abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 4404bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_DUDV8, _mesa_texstore_dudv8 }, 440584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 4406daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák { MESA_FORMAT_SIGNED_R8, _mesa_texstore_snorm8 }, 4407daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák { MESA_FORMAT_SIGNED_RG88_REV, _mesa_texstore_snorm88 }, 440884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul { MESA_FORMAT_SIGNED_RGBX8888, _mesa_texstore_signed_rgbx8888 }, 440984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 4410bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SIGNED_RGBA8888, _mesa_texstore_signed_rgba8888 }, 4411bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SIGNED_RGBA8888_REV, _mesa_texstore_signed_rgba8888 }, 441284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 4413daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák { MESA_FORMAT_SIGNED_R16, _mesa_texstore_snorm16 }, 4414daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák { MESA_FORMAT_SIGNED_GR1616, _mesa_texstore_snorm1616 }, 4415279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul { MESA_FORMAT_SIGNED_RGB_16, _mesa_texstore_signed_rgba_16 }, 441617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul { MESA_FORMAT_SIGNED_RGBA_16, _mesa_texstore_signed_rgba_16 }, 44178d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie { MESA_FORMAT_RGBA_16, _mesa_texstore_rgba_16 }, 44188d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie 44198d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie { MESA_FORMAT_RED_RGTC1, _mesa_texstore_red_rgtc1 }, 44208d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie { MESA_FORMAT_SIGNED_RED_RGTC1, _mesa_texstore_signed_red_rgtc1 }, 44218d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie { MESA_FORMAT_RG_RGTC2, _mesa_texstore_rg_rgtc2 }, 44227d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák { MESA_FORMAT_SIGNED_RG_RGTC2, _mesa_texstore_signed_rg_rgtc2 }, 44237d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák 44247d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák /* Re-use the R/RG texstore functions. 44257d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák * The code is generic enough to handle LATC too. */ 44267d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák { MESA_FORMAT_L_LATC1, _mesa_texstore_red_rgtc1 }, 44277d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák { MESA_FORMAT_SIGNED_L_LATC1, _mesa_texstore_signed_red_rgtc1 }, 44287d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák { MESA_FORMAT_LA_LATC2, _mesa_texstore_rg_rgtc2 }, 4429daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák { MESA_FORMAT_SIGNED_LA_LATC2, _mesa_texstore_signed_rg_rgtc2 }, 4430daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 4431daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák { MESA_FORMAT_SIGNED_A8, _mesa_texstore_snorm8 }, 4432daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák { MESA_FORMAT_SIGNED_L8, _mesa_texstore_snorm8 }, 4433daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák { MESA_FORMAT_SIGNED_AL88, _mesa_texstore_snorm88 }, 4434daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák { MESA_FORMAT_SIGNED_I8, _mesa_texstore_snorm8 }, 4435daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 4436daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák { MESA_FORMAT_SIGNED_A16, _mesa_texstore_snorm16 }, 4437daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák { MESA_FORMAT_SIGNED_L16, _mesa_texstore_snorm16 }, 4438daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák { MESA_FORMAT_SIGNED_AL1616, _mesa_texstore_snorm1616 }, 4439daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák { MESA_FORMAT_SIGNED_I16, _mesa_texstore_snorm16 }, 44409d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák 44419d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák { MESA_FORMAT_RGB9_E5_FLOAT, _mesa_texstore_rgb9_e5 }, 4442631d23daa91c569bf268a2191bd466df73a64263Marek Olšák { MESA_FORMAT_R11_G11_B10_FLOAT, _mesa_texstore_r11_g11_b10f }, 44431165280cbd37dee1e499358633478ab869de21dfMarek Olšák 4444bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák { MESA_FORMAT_Z32_FLOAT, _mesa_texstore_z32 }, 4445b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák { MESA_FORMAT_Z32_FLOAT_X24S8, _mesa_texstore_z32f_x24s8 }, 4446485105ed182e2e997b084f047e72d5a2c3460057Brian Paul}; 4447485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 4448485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 4449920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wustatic GLboolean 4450920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu_mesa_texstore_null(TEXSTORE_PARAMS) 4451920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu{ 4452920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) ctx; (void) dims; 4453920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) baseInternalFormat; 4454920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstFormat; 4455920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstAddr; 4456920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstXoffset; (void) dstYoffset; (void) dstZoffset; 4457920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstRowStride; (void) dstImageOffsets; 4458920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcWidth; (void) srcHeight; (void) srcDepth; 4459920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcFormat; (void) srcType; 4460920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcAddr; 4461920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcPacking; 4462920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 4463920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu /* should never happen */ 4464920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu _mesa_problem(NULL, "_mesa_texstore_null() is called"); 4465920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu return GL_FALSE; 4466920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu} 4467920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 4468920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 4469485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/** 4470485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Return the StoreTexImageFunc pointer to store an image in the given format. 4471485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */ 4472e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paulstatic StoreTexImageFunc 4473485105ed182e2e997b084f047e72d5a2c3460057Brian Paul_mesa_get_texstore_func(gl_format format) 4474485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{ 4475bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul#ifdef DEBUG 44761f1bfe8cb5c74ee8708fb717a19d8389c9fadb80Brian Paul GLuint i; 4477485105ed182e2e997b084f047e72d5a2c3460057Brian Paul for (i = 0; i < MESA_FORMAT_COUNT; i++) { 4478bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul ASSERT(texstore_funcs[i].Name == i); 4479485105ed182e2e997b084f047e72d5a2c3460057Brian Paul } 4480bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul#endif 4481bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul ASSERT(texstore_funcs[format].Name == format); 4482920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 4483920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu if (texstore_funcs[format].Store) 4484920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu return texstore_funcs[format].Store; 4485920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu else 4486920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu return _mesa_texstore_null; 4487485105ed182e2e997b084f047e72d5a2c3460057Brian Paul} 4488485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 4489485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 4490660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul/** 4491660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Store user data into texture memory. 4492660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Called via glTex[Sub]Image1/2/3D() 4493660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul */ 4494660ca9c5a23240abca084089a626d4a94ef0799fBrian PaulGLboolean 4495660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul_mesa_texstore(TEXSTORE_PARAMS) 4496660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul{ 4497660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul StoreTexImageFunc storeImage; 4498660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul GLboolean success; 4499660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 45001f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul storeImage = _mesa_get_texstore_func(dstFormat); 4501660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 4502660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul success = storeImage(ctx, dims, baseInternalFormat, 4503660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 4504660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul dstRowStride, dstImageOffsets, 4505660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul srcWidth, srcHeight, srcDepth, 4506660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul srcFormat, srcType, srcAddr, srcPacking); 4507660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul return success; 4508660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul} 4509660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 4510485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 451181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul/** 451281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * Normally, we'll only _write_ texel data to a texture when we map it. 451381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * But if the user is providing depth or stencil values and the texture 451481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * image is a combined depth/stencil format, we'll actually read from 451581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * the texture buffer too (in order to insert the depth or stencil values. 451681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param userFormat the user-provided image format 451781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param texFormat the destination texture format 451881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul */ 451981430ab54f57590c99883eadf622d2ecfae19c49Brian Paulstatic GLbitfield 452081430ab54f57590c99883eadf622d2ecfae19c49Brian Paulget_read_write_mode(GLenum userFormat, gl_format texFormat) 45215999c5b620236fb6a996cf56759aec31f01c126bBrian Paul{ 452281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if ((userFormat == GL_STENCIL_INDEX || userFormat == GL_DEPTH_COMPONENT) 452381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul && _mesa_get_format_base_format(texFormat) == GL_DEPTH_STENCIL) 452481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul return GL_MAP_READ_BIT | GL_MAP_WRITE_BIT; 452581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul else 452681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul return GL_MAP_WRITE_BIT; 45275999c5b620236fb6a996cf56759aec31f01c126bBrian Paul} 45285999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 4529ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul/** 45301da28fa959e80610ebc9b7a28bfb83e3cad3aee4Brian Paul * This is the software fallback for Driver.TexImage1D(). 45316b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d() 45328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 45338e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4534f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage1d(struct gl_context *ctx, GLenum target, GLint level, 45358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 45368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint border, 45378e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 45388e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 45398e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 45408e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 45418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 454281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat); 454381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLuint zeroImageOffset = 0; 454481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte *dstMap; 454581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint dstRowStride; 454681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLboolean success; 454781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4548a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 45498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 455078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 455178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat, 455278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul width, 1, 1)) { 45537d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); 45547d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 45557d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 45568e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 4557e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type, 4558e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexImage1D"); 45596b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul if (!pixels) { 45606b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul /* Note: we check for a NULL image pointer here, _after_ we allocated 45616b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * memory for the texture. That's what the GL spec calls for. 45626b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul */ 456389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 45646b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul } 456581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 456681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Map dest texture buffer (write to whole region) */ 456781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, 0, 456881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 0, 0, width, 1, 456981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul rwMode, 457081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &dstMap, &dstRowStride); 457181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 457281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul success = _mesa_texstore(ctx, 1, texImage->_BaseFormat, 457381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul texImage->TexFormat, 457481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstMap, 457581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 457681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 0, /* dstRowStride */ 457781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &zeroImageOffset, 457881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul width, 1, 1, 457981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul format, type, pixels, packing); 458081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 458181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 458281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 458381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if (!success) 458481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); 4585f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul 458671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 45878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 45888e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 45898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 45906b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/** 45911da28fa959e80610ebc9b7a28bfb83e3cad3aee4Brian Paul * This is the software fallback for Driver.TexImage2D(). 45926b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * 4593b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * This function is oriented toward storing images in main memory, rather 4594b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * than VRAM. Device driver's can easily plug in their own replacement. 45958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 45968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4597f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage2d(struct gl_context *ctx, GLenum target, GLint level, 45988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 45998e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint border, 46008e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 46018e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 46028e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 46038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 46048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 460581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat); 460681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLuint zeroImageOffset = 0; 460781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte *dstMap; 460881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint dstRowStride; 460981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLboolean success; 461081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4611a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 46128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 461378026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 461478026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat, 461578026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul width, height, 1)) { 46167d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); 46177d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 46187d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 46198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 462071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type, 4621e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexImage2D"); 46226b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul if (!pixels) { 46236b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul /* Note: we check for a NULL image pointer here, _after_ we allocated 46246b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * memory for the texture. That's what the GL spec calls for. 46256b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul */ 462689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 46276b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul } 462881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4629229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt if (target == GL_TEXTURE_1D_ARRAY) { 4630229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt const GLint srcStride = 4631229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt _mesa_image_row_stride(packing, width, format, type); 4632229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt int y; 4633229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 4634229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt success = GL_TRUE; 4635229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 4636229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt for (y = 0; y < height; y++) { 4637229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt /* Map dest texture buffer (write to whole region) */ 4638229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt ctx->Driver.MapTextureImage(ctx, texImage, y, 4639229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 0, 0, width, 1, 4640229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt rwMode, 4641229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt &dstMap, &dstRowStride); 4642229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt assert(dstMap); 4643229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt success = _mesa_texstore(ctx, 2, texImage->_BaseFormat, 4644229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt texImage->TexFormat, 4645229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt dstMap, 4646229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 0, 0, 0, /* dstX/Y/Zoffset */ 4647229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt dstRowStride, 4648229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt &zeroImageOffset, 4649229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt width, 1, 1, 4650229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt format, type, pixels, packing); 4651229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt ctx->Driver.UnmapTextureImage(ctx, texImage, y); 4652229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 4653229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt if (!success) 4654229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt break; 4655229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 4656229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt pixels += srcStride; 4657229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt } 4658229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt } else { 4659229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt /* Map dest texture buffer (write to whole region) */ 4660229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt ctx->Driver.MapTextureImage(ctx, texImage, 0, 4661229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 0, 0, width, height, 4662229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt rwMode, 4663229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt &dstMap, &dstRowStride); 4664229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt assert(dstMap); 4665229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt success = _mesa_texstore(ctx, 2, texImage->_BaseFormat, 4666229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt texImage->TexFormat, 4667229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt dstMap, 4668229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 0, 0, 0, /* dstX/Y/Zoffset */ 4669229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt dstRowStride, 4670229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt &zeroImageOffset, 4671229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt width, height, 1, 4672229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt format, type, pixels, packing); 4673229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 4674229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 4675229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt } 467681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 467781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if (!success) 467881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); 4679f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul 468071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 46818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 46828e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 46838e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 46848e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 46856b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/** 46861da28fa959e80610ebc9b7a28bfb83e3cad3aee4Brian Paul * This is the software fallback for Driver.TexImage3D(). 46876b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d() 46888e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 46898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4690f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage3d(struct gl_context *ctx, GLenum target, GLint level, 46918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 46928e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, GLint border, 46938e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 46948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 46958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 46968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 46978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 469881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat); 469981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLboolean success; 470081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint slice; 470181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte **sliceMaps; 470281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLuint *dstImageOffsets; 470381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint dstRowStride; 470481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLuint texelSize = _mesa_get_format_bytes(texImage->TexFormat); 470581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4706a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 47078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 470878026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 470978026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat, 471078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul width, height, depth)) { 471178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D"); 47127d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 47137d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 47148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 471581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, 471681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul format, type, 471781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul pixels, packing, "glTexImage3D"); 47186b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul if (!pixels) { 47196b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul /* Note: we check for a NULL image pointer here, _after_ we allocated 47206b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * memory for the texture. That's what the GL spec calls for. 47216b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul */ 472289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 47236b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul } 472481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4725229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt if (target == GL_TEXTURE_1D_ARRAY) { 4726229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt depth = height; 4727229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt height = 1; 4728229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt } 4729229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 473081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul sliceMaps = (GLubyte **) malloc(depth * sizeof(GLubyte *)); 473181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstImageOffsets = (GLuint *) malloc(depth * sizeof(GLuint)); 473281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 473381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Map dest texture buffer slices */ 473481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul for (slice = 0; slice < depth; slice++) { 473581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, slice, 473681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 0, 0, width, height, 473781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul rwMode, 473881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &sliceMaps[slice], &dstRowStride); 473981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul } 474081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Compute image slice offsets */ 474181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul for (slice = 0; slice < depth; slice++) { 474281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstImageOffsets[slice] = (sliceMaps[slice] - sliceMaps[0]) / texelSize; 474381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul } 474481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 474581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul success = _mesa_texstore(ctx, 3, texImage->_BaseFormat, 474681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul texImage->TexFormat, 474781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul sliceMaps[0], 474881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 474981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstRowStride, 475081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstImageOffsets, 475181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul width, height, depth, 475281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul format, type, pixels, packing); 475381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 475481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Unmap dest texture buffer slices */ 475581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul for (slice = 0; slice < depth; slice++) { 475681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, slice); 4757f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 4758f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul 475981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if (!success) 476081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D"); 476181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 476271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 476381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 476481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul free(sliceMaps); 476581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul free(dstImageOffsets); 47668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 47678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 47688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 47698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 47708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 47718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 477289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage1D() 477389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage1D(). 47748e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 47758e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4776f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage1d(struct gl_context *ctx, GLenum target, GLint level, 47778e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint width, 47788e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 47798e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 47808e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 47818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 47828e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 478381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat); 478481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLuint zeroImageOffset = 0; 478581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte *dstMap; 478681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint dstRowStride; 478781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLboolean success; 478881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4789b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 4790e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type, 4791e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexSubImage1D"); 47927a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!pixels) 47937a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 47947a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 479581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Map dest texture buffer (write to whole region) */ 479681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, 0, 479781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul xoffset, 0, width, 1, 479881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul rwMode, 479981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &dstMap, &dstRowStride); 480081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 480181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul success = _mesa_texstore(ctx, 1, texImage->_BaseFormat, 480281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul texImage->TexFormat, 480381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstMap, 480481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 480581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstRowStride, 480681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &zeroImageOffset, 480781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul width, 1, 1, 480881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul format, type, pixels, packing); 480981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 481081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 481181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 481281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if (!success) 481381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D"); 48143893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul 481571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 48168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 48178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 48188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 481989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 4820f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 482189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage2D() 482289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage2D(). 48238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 48248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4825f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage2d(struct gl_context *ctx, GLenum target, GLint level, 48268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint yoffset, 48278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, 48288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 48298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 48308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 48318e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 48328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 483381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat); 483481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLuint zeroImageOffset = 0; 483581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte *dstMap; 483681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint dstRowStride; 483781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLboolean success; 483881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4839b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 484071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type, 4841e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexSubImage2D"); 48427a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!pixels) 48437a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 48447a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 484581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Map dest texture buffer (write to whole region) */ 484681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, 0, 484781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul xoffset, yoffset, width, height, 484881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul rwMode, 484981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &dstMap, &dstRowStride); 485081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 485181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul success = _mesa_texstore(ctx, 2, texImage->_BaseFormat, 485281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul texImage->TexFormat, 485381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstMap, 485481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 485581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstRowStride, 485681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &zeroImageOffset, 485781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul width, height, 1, 485881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul format, type, pixels, packing); 485981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 486081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 486181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 486281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if (!success) 486381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D"); 48643893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul 486571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 48668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 48678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 48688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 48698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 48708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * This is the software fallback for Driver.TexSubImage3D(). 487189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage3D(). 48728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 48738e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4874f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage3d(struct gl_context *ctx, GLenum target, GLint level, 48758e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 48768e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, 48778e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 48788e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 48798e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 48808e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 48818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 488281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat); 488381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLboolean success; 488481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint slice; 488581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte **sliceMaps; 488681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLuint *dstImageOffsets; 488781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint dstRowStride; 488881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLuint texelSize = _mesa_get_format_bytes(texImage->TexFormat); 488981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4890b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 4891e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format, 4892e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul type, pixels, packing, 4893e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul "glTexSubImage3D"); 4894f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!pixels) 4895f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return; 4896f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 489781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul sliceMaps = (GLubyte **) malloc((zoffset + depth) * sizeof(GLubyte *)); 489881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstImageOffsets = (GLuint *) malloc((zoffset + depth) * sizeof(GLuint)); 489981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 490081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Map dest texture buffer slices */ 490181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul for (slice = 0; slice < depth; slice++) { 490281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, zoffset + slice, 490381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul xoffset, yoffset, width, height, 490481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul rwMode, 490581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &sliceMaps[zoffset + slice], &dstRowStride); 490681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul } 490781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 490881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Compute image slice offsets */ 490981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul for (slice = 0; slice < depth; slice++) { 491081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstImageOffsets[slice] = 491181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul (sliceMaps[zoffset + slice] - sliceMaps[zoffset]) / texelSize; 491281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul } 491381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 491481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul success = _mesa_texstore(ctx, 3, texImage->_BaseFormat, 491581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul texImage->TexFormat, 491681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul sliceMaps[zoffset], 491781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 491881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstRowStride, 491981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstImageOffsets, 492081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul width, height, depth, 492181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul format, type, pixels, packing); 492281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 492381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Unmap dest texture buffer slices */ 492481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul for (slice = 0; slice < depth; slice++) { 492581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, zoffset + slice); 4926f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 49278f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul 492881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if (!success) 492981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage3D"); 493081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 493171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 493281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 493381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul free(sliceMaps); 493481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul free(dstImageOffsets); 49358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 49368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 49378e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 49382aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul/* 49398e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage1D() 49408e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 49418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 494278527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage1d(struct gl_context *ctx, 494378527154bd8693c0956ff78c369222d37c5668e7Brian Paul GLenum target, GLint level, 49448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 49458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint border, 49468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLsizei imageSize, const GLvoid *data, 49478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 49488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 49498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 495089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* this space intentionally left blank */ 4951a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 4952a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 4953a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) internalFormat; 4954a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) border; 4955a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 4956a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 4957a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 49588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 49598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 49608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 49618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 4962b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul/** 49638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage2D() 49648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 49658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 496678527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage2d(struct gl_context *ctx, 496778527154bd8693c0956ff78c369222d37c5668e7Brian Paul GLenum target, GLint level, 49688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 49698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint border, 49708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLsizei imageSize, const GLvoid *data, 49718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 49728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 49738e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 497481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte *dstMap; 497581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint dstRowStride; 4976a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul 497789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* This is pretty simple, basically just do a memcpy without worrying 497889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * about the usual image unpacking or image transfer operations. 49798e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 498089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texObj); 498189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage); 498289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Width > 0); 498389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Height > 0); 498489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Depth == 1); 498589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Data == NULL); /* was freed in glCompressedTexImage2DARB */ 498689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 498778026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 498878026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat, 498978026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul width, height, 1)) { 499078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D"); 499189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 499289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 499389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 4994e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data, 4995e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul &ctx->Unpack, 4996e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul "glCompressedTexImage2D"); 49977a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!data) 49987a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 49997a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 500081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 500181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Map dest texture buffer (write to whole region) */ 500281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, 0, 500381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 0, 0, width, height, 500481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GL_MAP_WRITE_BIT, 500581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &dstMap, &dstRowStride); 500681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 500789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* copy the data */ 500881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul memcpy(dstMap, data, imageSize); 500981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 501081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 50118f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul 501271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack); 50138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 50148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 50158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 50168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 50178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 50188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage3D() 50198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 50208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 502178527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage3d(struct gl_context *ctx, 502278527154bd8693c0956ff78c369222d37c5668e7Brian Paul GLenum target, GLint level, 50238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 50248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, 50258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint border, 50268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLsizei imageSize, const GLvoid *data, 50278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 50288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 50298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 503089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* this space intentionally left blank */ 5031a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 5032a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 5033a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) internalFormat; 5034a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) height; (void) depth; 5035a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 5036a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 5037a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 5038a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 50398e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 50408e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 50418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 50428e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 504389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 504489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage1D() 5045e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul */ 5046e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paulvoid 5047f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage1d(struct gl_context *ctx, GLenum target, 504889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint level, 504989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLsizei width, 505089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 505189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei imageSize, const GLvoid *data, 505289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_object *texObj, 505389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage) 5054e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul{ 50555999c5b620236fb6a996cf56759aec31f01c126bBrian Paul /* there are no compressed 1D texture formats yet */ 5056a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 5057a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 5058a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) xoffset; (void) width; 5059a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) format; 5060a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 5061a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 5062a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 5063e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul} 5064e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 5065e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 506689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 506789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage2D() 506889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 506989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid 5070f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage2d(struct gl_context *ctx, GLenum target, 507189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint level, 507289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLint yoffset, 507389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei width, GLsizei height, 507489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 507589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei imageSize, const GLvoid *data, 507689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_object *texObj, 507789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage) 507889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 507981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint bytesPerRow, dstRowStride, srcRowStride; 508089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint i, rows; 508181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte *dstMap; 508289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul const GLubyte *src; 50831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const gl_format texFormat = texImage->TexFormat; 5084d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul GLuint bw, bh; 50855999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 5086d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul _mesa_get_format_block_size(texFormat, &bw, &bh); 50875999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 508889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* these should have been caught sooner */ 5089d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((width % bw) == 0 || width == 2 || width == 1); 5090d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((height % bh) == 0 || height == 2 || height == 1); 5091d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((xoffset % bw) == 0); 5092d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((yoffset % bh) == 0); 509389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 5094b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 5095e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data, 5096e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul &ctx->Unpack, 5097e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul "glCompressedTexSubImage2D"); 50987a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!data) 50997a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 51007a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 51012594168e9f3cdc4ac53c925486491167837cda30Brian Paul srcRowStride = _mesa_format_row_stride(texFormat, width); 510289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul src = (const GLubyte *) data; 510389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 510481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Map dest texture buffer (write to whole region) */ 510581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, 0, 510681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul xoffset, yoffset, width, height, 510781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GL_MAP_WRITE_BIT, 510881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &dstMap, &dstRowStride); 510989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 5110bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul bytesPerRow = srcRowStride; /* bytes per row of blocks */ 5111d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul rows = height / bh; /* rows in blocks */ 511289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 5113bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul /* copy rows of blocks */ 511489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul for (i = 0; i < rows; i++) { 511581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul memcpy(dstMap, src, bytesPerRow); 511681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul dstMap += dstRowStride; 511789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul src += srcRowStride; 511889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 51198f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul 512081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 512181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 512271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack); 512389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 512489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 512589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 512689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 512789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage3D() 512889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 512989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid 5130f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage3d(struct gl_context *ctx, GLenum target, 513189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint level, 513289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 513389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei width, GLsizei height, GLsizei depth, 513489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 513589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei imageSize, const GLvoid *data, 513689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_object *texObj, 513789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage) 513889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 51395999c5b620236fb6a996cf56759aec31f01c126bBrian Paul /* there are no compressed 3D texture formats yet */ 5140a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 5141a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 5142a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) xoffset; (void) yoffset; (void) zoffset; 5143a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) height; (void) depth; 5144a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) format; 5145a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 5146a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 5147a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 514889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 5149