texstore.c revision 079bb3fff7104782f2c921200e9a299c38a53ab6
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" 70d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu#include "texcompress_etc.h" 718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "teximage.h" 728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h" 732e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell#include "enums.h" 741271424615b62544662a606bb23f6d7117a8b0e7Marek Olšák#include "../../gallium/auxiliary/util/u_format_rgb9e5.h" 75631d23daa91c569bf268a2191bd466df73a64263Marek Olšák#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h" 768e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 77248200737398a7d6403a23930a6c9d93db06b942Brian Paul 78fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum { 79fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell ZERO = 4, 80fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell ONE = 5 81fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 8271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 83248200737398a7d6403a23930a6c9d93db06b942Brian Paul 84248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 85e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul * Texture image storage function. 86e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul */ 87e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paultypedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS); 88e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul 89e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul 90e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul/** 91248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Return GL_TRUE if the given image format is one that be converted 92248200737398a7d6403a23930a6c9d93db06b942Brian Paul * to another format by swizzling. 93248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 94248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic GLboolean 95248200737398a7d6403a23930a6c9d93db06b942Brian Paulcan_swizzle(GLenum logicalBaseFormat) 9671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 9771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell switch (logicalBaseFormat) { 9871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_RGBA: 9971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_RGB: 10071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_LUMINANCE_ALPHA: 10171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_INTENSITY: 10271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_ALPHA: 10371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_LUMINANCE: 1043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_RED: 1053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_GREEN: 1063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BLUE: 1073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGR: 1083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGRA: 1093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_ABGR_EXT: 1105d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG: 11171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell return GL_TRUE; 11271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell default: 11371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell return GL_FALSE; 11471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 11571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell} 11671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 1173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 119fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum { 120fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_LUMINANCE = 0, 121fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_ALPHA, 122fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_INTENSITY, 123fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_LUMINANCE_ALPHA, 124fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_RGB, 125fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_RGBA, 1263aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RED, 1273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_GREEN, 1283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BLUE, 1293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGR, 1303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGRA, 1313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ABGR, 1325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick IDX_RG, 133fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell MAX_IDX 134fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 135fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 1363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP1(x) MAP4(x, ZERO, ZERO, ZERO) 1373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP2(x,y) MAP4(x, y, ZERO, ZERO) 1383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP3(x,y,z) MAP4(x, y, z, ZERO) 1393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE } 140fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 141fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 1422e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwellstatic const struct { 1433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte format_idx; 1443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte to_rgba[6]; 1453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte from_rgba[6]; 1463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell} mappings[MAX_IDX] = 147fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{ 148fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_LUMINANCE, 1503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,0,0,ONE), 1513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0) 152fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 153fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 154fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ALPHA, 1563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, ZERO, ZERO, 0), 1573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(3) 158fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 159fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 160fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_INTENSITY, 1623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0, 0, 0, 0), 1633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0), 164fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 165fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 166fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_LUMINANCE_ALPHA, 1683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,0,0,1), 1693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP2(0,3) 170fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 171fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 172fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RGB, 1743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,ONE), 1753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP3(0,1,2) 176fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 177fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 178fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RGBA, 1803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,3), 1813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,3), 1823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RED, 1863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0, ZERO, ZERO, ONE), 1873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0), 1883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_GREEN, 1923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, 0, ZERO, ONE), 1933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(1), 1943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BLUE, 1983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, ZERO, 0, ONE), 1993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(2), 2003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 2033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGR, 2043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,ONE), 2053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP3(2,1,0) 2063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 2093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGRA, 2103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,3), 2113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,3) 2123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 2153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ABGR, 2163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(3,2,1,0), 2173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(3,2,1,0) 2183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 2205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { 2215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick IDX_RG, 2225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick MAP4(0, 1, ZERO, ONE), 2235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick MAP2(0, 1) 2245d1387b2da3626326410804026f8b92f1a121fdcIan Romanick }, 225fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 226fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 227fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 228fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 229248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 230248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Convert a GL image format enum to an IDX_* value (see above). 231248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 232248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic int 233248200737398a7d6403a23930a6c9d93db06b942Brian Paulget_map_idx(GLenum value) 234fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{ 235fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell switch (value) { 236fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_LUMINANCE: return IDX_LUMINANCE; 237fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_ALPHA: return IDX_ALPHA; 238fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_INTENSITY: return IDX_INTENSITY; 239fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA; 240fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_RGB: return IDX_RGB; 241fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_RGBA: return IDX_RGBA; 2423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_RED: return IDX_RED; 2433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_GREEN: return IDX_GREEN; 2443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BLUE: return IDX_BLUE; 2453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGR: return IDX_BGR; 2463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGRA: return IDX_BGRA; 2473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_ABGR_EXT: return IDX_ABGR; 2485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG: return IDX_RG; 249fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell default: 250fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell _mesa_problem(NULL, "Unexpected inFormat"); 251fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell return 0; 252fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell } 253fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell} 254fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * When promoting texture formats (see below) we need to compute the 258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * mapping of dest components back to source components. 259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * This function does that. 260fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param inFormat the incoming format of the texture 261fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param outFormat the final texture format 262fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \return map[6] a full 6-component map 263f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 2643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellstatic void 2653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellcompute_component_mapping(GLenum inFormat, GLenum outFormat, 2663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte *map) 267f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 268248200737398a7d6403a23930a6c9d93db06b942Brian Paul const int inFmt = get_map_idx(inFormat); 269248200737398a7d6403a23930a6c9d93db06b942Brian Paul const int outFmt = get_map_idx(outFormat); 270248200737398a7d6403a23930a6c9d93db06b942Brian Paul const GLubyte *in2rgba = mappings[inFmt].to_rgba; 271248200737398a7d6403a23930a6c9d93db06b942Brian Paul const GLubyte *rgba2out = mappings[outFmt].from_rgba; 2723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell int i; 2732e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell 2743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell for (i = 0; i < 4; i++) 2753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[i] = in2rgba[rgba2out[i]]; 2763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[ZERO] = ZERO; 2783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[ONE] = ONE; 2793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2806b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#if 0 281298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n", 282298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inFormat, _mesa_lookup_enum_by_nr(inFormat), 283298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg outFormat, _mesa_lookup_enum_by_nr(outFormat), 284298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[0], 285298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[1], 286298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[2], 287298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[3], 288298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[4], 289298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[5]); 2906b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#endif 291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLfloat components. 296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations. 297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters. 298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format 29939de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures. So, we might 300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead. 301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do. 302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx the rendering context 304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims image dimensions: 1, 2 or 3 305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat basic texture derived from the user's 306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * internal texture format value 307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat the actual basic format of the texture 308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth source image width 309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight source image height 310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth source image depth 311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat source image format 312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType source image type 313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr source image address 314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking source image pixel packing 315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLfloat. 316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 317e792e79f5ae6be008d9521eccf1c647492cd682aDave AirlieGLfloat * 318e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie_mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims, 319e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLenum logicalBaseFormat, 320e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLenum textureBaseFormat, 321e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLint srcWidth, GLint srcHeight, GLint srcDepth, 322e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLenum srcFormat, GLenum srcType, 323e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLvoid *srcAddr, 324e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const struct gl_pixelstore_attrib *srcPacking, 325e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLbitfield transferOps) 326f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 327f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *tempImage; 328a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt const GLint components = _mesa_components_in_format(logicalBaseFormat); 329a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt const GLint srcStride = 330a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 331a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt GLfloat *dst; 332a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt GLint img, row; 333f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(dims >= 1 && dims <= 3); 335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(logicalBaseFormat == GL_RGBA || 337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_RGB || 3385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RG || 3395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RED || 340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE_ALPHA || 341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE || 342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_ALPHA || 343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_INTENSITY || 344f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_DEPTH_COMPONENT); 345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 346f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(textureBaseFormat == GL_RGBA || 347f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_RGB || 3485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RG || 3495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RED || 350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA || 351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE || 352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_ALPHA || 353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_INTENSITY || 354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_DEPTH_COMPONENT); 355f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 356a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt tempImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth 357a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt * components * sizeof(GLfloat)); 358a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt if (!tempImage) 359a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt return NULL; 360f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 361a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt dst = tempImage; 362a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt for (img = 0; img < srcDepth; img++) { 363a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt const GLubyte *src 364a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 365a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt srcWidth, srcHeight, 366a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt srcFormat, srcType, 367a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt img, 0, 0); 368a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt for (row = 0; row < srcHeight; row++) { 369a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat, 370a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt dst, srcFormat, srcType, src, 371a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt srcPacking, transferOps); 372a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt dst += srcWidth * components; 373a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt src += srcStride; 374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 377f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (logicalBaseFormat != textureBaseFormat) { 378f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* more work */ 379f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint texComponents = _mesa_components_in_format(textureBaseFormat); 380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 381f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *newImage; 382f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i, n; 3833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[6]; 384f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 38513ad04719e292a2bee7e1b3155da74a97921c035Brian Paul /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 38613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 38713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA); 388f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* The actual texture format should have at least as many components 390f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * as the logical texture format. 391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 392f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(texComponents >= logComponents); 393f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 39432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg newImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth 395f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * texComponents * sizeof(GLfloat)); 396f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!newImage) { 39732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 398f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 4013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 402f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul n = srcWidth * srcHeight * srcDepth; 404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < n; i++) { 405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint k; 406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (k = 0; k < texComponents; k++) { 407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint j = map[k]; 408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (j == ZERO) 409f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 0.0F; 410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (j == ONE) 411f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 1.0F; 412f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else 413f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 415f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 41732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 418f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul tempImage = newImage; 419f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return tempImage; 422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 423f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 424f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 425f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 426dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * Make temporary image with uint pixel values. Used for unsigned 427dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * integer-valued textures. 428dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul */ 429dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulstatic GLuint * 430dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulmake_temp_uint_image(struct gl_context *ctx, GLuint dims, 431dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLenum logicalBaseFormat, 432dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLenum textureBaseFormat, 433dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 434dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLenum srcFormat, GLenum srcType, 435dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLvoid *srcAddr, 436dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const struct gl_pixelstore_attrib *srcPacking) 437dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul{ 438dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLuint *tempImage; 439dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLint components = _mesa_components_in_format(logicalBaseFormat); 440dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLint srcStride = 441dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 442dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLuint *dst; 443dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint img, row; 444dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 445dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(dims >= 1 && dims <= 3); 446dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 447dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(logicalBaseFormat == GL_RGBA || 448dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_RGB || 449dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_RG || 450dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_RED || 451dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_LUMINANCE_ALPHA || 452dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_LUMINANCE || 453dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_INTENSITY || 454dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_ALPHA); 455dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 456dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(textureBaseFormat == GL_RGBA || 457dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_RGB || 458dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_RG || 459dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_RED || 460dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA || 461dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_LUMINANCE || 46238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie textureBaseFormat == GL_INTENSITY || 463dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_ALPHA); 464dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 465dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul tempImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth 466dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * components * sizeof(GLuint)); 467dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul if (!tempImage) 468dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul return NULL; 469dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 470dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dst = tempImage; 471dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul for (img = 0; img < srcDepth; img++) { 472dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLubyte *src 473dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 474dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, 475dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, 476dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul img, 0, 0); 477dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul for (row = 0; row < srcHeight; row++) { 478dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul _mesa_unpack_color_span_uint(ctx, srcWidth, logicalBaseFormat, 479dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dst, srcFormat, srcType, src, 480dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcPacking); 481dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dst += srcWidth * components; 482dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul src += srcStride; 483dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 484dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 485dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 486dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul if (logicalBaseFormat != textureBaseFormat) { 487dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul /* more work */ 488dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint texComponents = _mesa_components_in_format(textureBaseFormat); 489dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 490dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLuint *newImage; 491dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint i, n; 492dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLubyte map[6]; 493dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 494dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 495dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 496dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA); 497dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 498dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul /* The actual texture format should have at least as many components 499dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * as the logical texture format. 500dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul */ 501dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(texComponents >= logComponents); 502dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 503dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul newImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth 504dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * texComponents * sizeof(GLuint)); 505dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul if (!newImage) { 506dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul free(tempImage); 507dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul return NULL; 508dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 509dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 510dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 511dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 512dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul n = srcWidth * srcHeight * srcDepth; 513dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul for (i = 0; i < n; i++) { 514dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint k; 515dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul for (k = 0; k < texComponents; k++) { 516dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint j = map[k]; 517dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul if (j == ZERO) 518dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul newImage[i * texComponents + k] = 0.0F; 519dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul else if (j == ONE) 520dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul newImage[i * texComponents + k] = 1.0F; 521dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul else 522dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 523dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 524dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 525dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 526dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul free(tempImage); 527dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul tempImage = newImage; 528dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 529dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 530dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul return tempImage; 531dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul} 532dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 533dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 534dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 535dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul/** 536663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * Make a temporary (color) texture image with GLubyte components. 537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations. 538f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters. 539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format 54039de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures. So, we might 541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead. 542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do. 543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx the rendering context 545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims image dimensions: 1, 2 or 3 546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat basic texture derived from the user's 547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * internal texture format value 548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat the actual basic format of the texture 549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth source image width 550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight source image height 551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth source image depth 552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat source image format 553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType source image type 554f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr source image address 555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking source image pixel packing 556663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * \return resulting image with format = textureBaseFormat and type = GLubyte. 557f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 558663f61a3e177a443c36f414a16a9d5f94e74135dBrian PaulGLubyte * 559663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul_mesa_make_temp_ubyte_image(struct gl_context *ctx, GLuint dims, 560663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLenum logicalBaseFormat, 561663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLenum textureBaseFormat, 562663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 563663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLenum srcFormat, GLenum srcType, 564663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLvoid *srcAddr, 565663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const struct gl_pixelstore_attrib *srcPacking) 566f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 567f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLuint transferOps = ctx->_ImageTransferState; 568f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint components = _mesa_components_in_format(logicalBaseFormat); 569f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 570663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLubyte *tempImage, *dst; 571f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 572f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(dims >= 1 && dims <= 3); 573f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 574f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(logicalBaseFormat == GL_RGBA || 575f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_RGB || 5765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RG || 5775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RED || 578f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE_ALPHA || 579f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE || 580f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_ALPHA || 581f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_INTENSITY); 582f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(textureBaseFormat == GL_RGBA || 584f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_RGB || 5855d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RG || 5865d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RED || 587f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA || 588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE || 589f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_ALPHA || 590f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_INTENSITY); 591f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 592f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* unpack and transfer the source image */ 593663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul tempImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth 594663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * components * sizeof(GLubyte)); 59596128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee if (!tempImage) { 596f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 59796128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee } 598f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 599f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst = tempImage; 600f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 6018c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcStride = 6028c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 6038c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLubyte *src = 6048c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 6058c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcWidth, srcHeight, 6068c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcFormat, srcType, 6078c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul img, 0, 0); 608f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 609e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul _mesa_unpack_color_span_ubyte(ctx, srcWidth, logicalBaseFormat, dst, 610e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul srcFormat, srcType, src, srcPacking, 611e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul transferOps); 612f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst += srcWidth * components; 613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcStride; 614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (logicalBaseFormat != textureBaseFormat) { 618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* one more conversion step */ 619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint texComponents = _mesa_components_in_format(textureBaseFormat); 620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 621663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLubyte *newImage; 622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i, n; 6233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[6]; 624f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 62513ad04719e292a2bee7e1b3155da74a97921c035Brian Paul /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 62613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 62713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA); 628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* The actual texture format should have at least as many components 630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * as the logical texture format. 631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 632f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(texComponents >= logComponents); 633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 634663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul newImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth 635663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * texComponents * sizeof(GLubyte)); 636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!newImage) { 63732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 639f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 6413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 642f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 643f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul n = srcWidth * srcHeight * srcDepth; 644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < n; i++) { 645f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint k; 646f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (k = 0; k < texComponents; k++) { 647f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint j = map[k]; 648f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (j == ZERO) 649f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 0; 650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (j == ONE) 651663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul newImage[i * texComponents + k] = 255; 652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else 653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 654f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 655f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 65732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 658f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul tempImage = newImage; 659f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return tempImage; 662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 663f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 664f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 665c039af165d5919008c6df599795951f85dea164dBrian Paul/** 666c039af165d5919008c6df599795951f85dea164dBrian Paul * Copy GLubyte pixels from <src> to <dst> with swizzling. 667c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dst destination pixels 668c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dstComponents number of color components in destination pixels 669c039af165d5919008c6df599795951f85dea164dBrian Paul * \param src source pixels 670c039af165d5919008c6df599795951f85dea164dBrian Paul * \param srcComponents number of color components in source pixels 671248200737398a7d6403a23930a6c9d93db06b942Brian Paul * \param map the swizzle mapping. map[X] says where to find the X component 672248200737398a7d6403a23930a6c9d93db06b942Brian Paul * in the source image's pixels. For example, if the source image 673248200737398a7d6403a23930a6c9d93db06b942Brian Paul * is GL_BGRA and X = red, map[0] yields 2. 674c039af165d5919008c6df599795951f85dea164dBrian Paul * \param count number of pixels to copy/swizzle. 675c039af165d5919008c6df599795951f85dea164dBrian Paul */ 676c039af165d5919008c6df599795951f85dea164dBrian Paulstatic void 677c039af165d5919008c6df599795951f85dea164dBrian Paulswizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src, 678c039af165d5919008c6df599795951f85dea164dBrian Paul GLuint srcComponents, const GLubyte *map, GLuint count) 67971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 680501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#define SWZ_CPY(dst, src, count, dstComps, srcComps) \ 681501338d70e96e0388fd5198625d856c4ec07745fBrian Paul do { \ 682501338d70e96e0388fd5198625d856c4ec07745fBrian Paul GLuint i; \ 683501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (i = 0; i < count; i++) { \ 684501338d70e96e0388fd5198625d856c4ec07745fBrian Paul GLuint j; \ 685501338d70e96e0388fd5198625d856c4ec07745fBrian Paul if (srcComps == 4) { \ 686501338d70e96e0388fd5198625d856c4ec07745fBrian Paul COPY_4UBV(tmp, src); \ 687501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 688501338d70e96e0388fd5198625d856c4ec07745fBrian Paul else { \ 689501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (j = 0; j < srcComps; j++) { \ 690501338d70e96e0388fd5198625d856c4ec07745fBrian Paul tmp[j] = src[j]; \ 691501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 692501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 693501338d70e96e0388fd5198625d856c4ec07745fBrian Paul src += srcComps; \ 694501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (j = 0; j < dstComps; j++) { \ 695501338d70e96e0388fd5198625d856c4ec07745fBrian Paul dst[j] = tmp[map[j]]; \ 696501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 697501338d70e96e0388fd5198625d856c4ec07745fBrian Paul dst += dstComps; \ 698501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 699501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } while (0) 700501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 701248200737398a7d6403a23930a6c9d93db06b942Brian Paul GLubyte tmp[6]; 70271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 70371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell tmp[ZERO] = 0x0; 70471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell tmp[ONE] = 0xff; 70571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 706501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ASSERT(srcComponents <= 4); 707501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ASSERT(dstComponents <= 4); 708501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 70971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell switch (dstComponents) { 71071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 4: 711501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 712501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 713501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 4); 714501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 715501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 716501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 3); 717501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 718501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 719501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 2); 720501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 721501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 722501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 1); 723501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 724501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 725501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 72671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 72771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 72871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 3: 729501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 730501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 731501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 4); 732501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 733501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 734501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 3); 735501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 736501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 737501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 2); 738501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 739501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 740501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 1); 741501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 742501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 743501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 74471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 74571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 74671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 2: 747501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 748501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 749501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 4); 750501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 751501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 752501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 3); 753501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 754501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 755501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 2); 756501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 757501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 758501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 1); 759501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 760501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 761501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 76271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 76371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 7643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case 1: 765501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 766501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 767501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 4); 768501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 769501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 770501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 3); 771501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 772501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 773501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 2); 774501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 775501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 776501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 1); 777501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 778501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 779501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 7803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 7813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell break; 782501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 783501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 78471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 785501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#undef SWZ_CPY 78671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell} 78771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 78846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 789501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 790bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE }; 791bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE }; 79246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 79339de9251c4770fdcce3395643003aa626178446dBrian Paul 79439de9251c4770fdcce3395643003aa626178446dBrian Paul/** 79539de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a 79639de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on endianness. 797bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell */ 79846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte * 799bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwelltype_mapping( GLenum srcType ) 80046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{ 80146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell switch (srcType) { 802c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger case GL_BYTE: 80346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_BYTE: 80446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_identity; 805bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8: 806df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer return _mesa_little_endian() ? map_3210 : map_identity; 807bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8_REV: 808df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer return _mesa_little_endian() ? map_identity : map_3210; 80946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell default: 81046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return NULL; 81146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 81246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell} 81346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 81439de9251c4770fdcce3395643003aa626178446dBrian Paul 81539de9251c4770fdcce3395643003aa626178446dBrian Paul/** 81639de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a 81739de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on pixelstore byte swapping state. 81846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell */ 81946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte * 820bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellbyteswap_mapping( GLboolean swapBytes, 821bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell GLenum srcType ) 82246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{ 823bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell if (!swapBytes) 824bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell return map_identity; 825bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell 82646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell switch (srcType) { 827c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger case GL_BYTE: 82846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_BYTE: 82946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_identity; 83046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8: 83146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8_REV: 83246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_3210; 83346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell default: 83446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return NULL; 83546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 83646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell} 83746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 83846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 83946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 840c039af165d5919008c6df599795951f85dea164dBrian Paul/** 841c039af165d5919008c6df599795951f85dea164dBrian Paul * Transfer a GLubyte texture image with component swizzling. 842c039af165d5919008c6df599795951f85dea164dBrian Paul */ 84371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellstatic void 844f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_swizzle_ubyte_image(struct gl_context *ctx, 84571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLuint dimensions, 84671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLenum srcFormat, 84746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell GLenum srcType, 84846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 8490c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell GLenum baseInternalFormat, 8500c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell 85146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell const GLubyte *rgba2dst, 8520c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell GLuint dstComponents, 85371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 85471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint dstXoffset, GLint dstYoffset, GLint dstZoffset, 855b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint dstRowStride, 8565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte **dstSlices, 85771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 85871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint srcWidth, GLint srcHeight, GLint srcDepth, 85971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const GLvoid *srcAddr, 86071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const struct gl_pixelstore_attrib *srcPacking ) 86171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 86271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint srcComponents = _mesa_components_in_format(srcFormat); 863bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell const GLubyte *srctype2ubyte, *swap; 8643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[4], src2base[6], base2rgba[6]; 86571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint i; 866c039af165d5919008c6df599795951f85dea164dBrian Paul const GLint srcRowStride = 867c039af165d5919008c6df599795951f85dea164dBrian Paul _mesa_image_row_stride(srcPacking, srcWidth, 868c039af165d5919008c6df599795951f85dea164dBrian Paul srcFormat, GL_UNSIGNED_BYTE); 869c039af165d5919008c6df599795951f85dea164dBrian Paul const GLint srcImageStride 870c039af165d5919008c6df599795951f85dea164dBrian Paul = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat, 871c039af165d5919008c6df599795951f85dea164dBrian Paul GL_UNSIGNED_BYTE); 872c039af165d5919008c6df599795951f85dea164dBrian Paul const GLubyte *srcImage 873c039af165d5919008c6df599795951f85dea164dBrian Paul = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr, 874c039af165d5919008c6df599795951f85dea164dBrian Paul srcWidth, srcHeight, srcFormat, 875c039af165d5919008c6df599795951f85dea164dBrian Paul GL_UNSIGNED_BYTE, 0, 0, 0); 87671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 877edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul (void) ctx; 878edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul 8790c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell /* Translate from src->baseInternal->GL_RGBA->dst. This will 8800c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell * correctly deal with RGBA->RGB->RGBA conversions where the final 8810c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell * A value must be 0xff regardless of the incoming alpha values. 8820c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell */ 8833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(srcFormat, baseInternalFormat, src2base); 8843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba); 885bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell swap = byteswap_mapping(srcPacking->SwapBytes, srcType); 886bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell srctype2ubyte = type_mapping(srcType); 88746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 88871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 88971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (i = 0; i < 4; i++) 890bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]]; 89171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 892298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg/* printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]); */ 8932e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell 894b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul if (srcComponents == dstComponents && 895b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul srcRowStride == dstRowStride && 8969c09259b8bef8f120cc6f4bb1a44f0eae37d71b3Michel Dänzer srcRowStride == srcWidth * srcComponents && 897b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dimensions < 3) { 898b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* 1 and 2D images only */ 8995253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstImage = dstSlices[0] 900b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 901b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstXoffset * dstComponents; 90271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map, 903b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcWidth * srcHeight); 90471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 90571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else { 90671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint img, row; 90771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (img = 0; img < srcDepth; img++) { 90871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const GLubyte *srcRow = srcImage; 9095253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 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 GLint dstXoffset, GLint dstYoffset, GLint dstZoffset, 933b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint dstRowStride, 9345253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte **dstSlices, 935f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 936f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLenum srcFormat, GLenum srcType, 937f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLvoid *srcAddr, 938f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const struct gl_pixelstore_attrib *srcPacking) 939f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 940f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, 941f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType); 942f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint srcImageStride = _mesa_image_image_stride(srcPacking, 943f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcFormat, srcType); 94460909388ab136d849d99eab49e782a53772a618fBrian Paul const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions, 94560909388ab136d849d99eab49e782a53772a618fBrian Paul srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); 9461f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 94722108bb571808542b89677752d62d3901698265fBrian Paul const GLint bytesPerRow = srcWidth * texelBytes; 948b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul 949f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (dstRowStride == srcRowStride && 9505253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride == bytesPerRow) { 9515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul /* memcpy image by image */ 9525253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLint img; 9535253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul for (img = 0; img < srcDepth; img++) { 9545253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstImage = dstSlices[dstZoffset + img] 9555253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul + dstYoffset * dstRowStride 9565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul + dstXoffset * texelBytes; 9575253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul ctx->Driver.TextureMemCpy(dstImage, srcImage, 9585253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul bytesPerRow * srcHeight); 9595253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul srcImage += srcImageStride; 9605253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul } 961f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 9625253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul else { 9635253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul /* memcpy row by row */ 964f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 965f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 966f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLubyte *srcRow = srcImage; 9675253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 9685253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul + dstYoffset * dstRowStride 9695253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul + dstXoffset * texelBytes; 970f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 97117bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow); 972f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 973f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcRow += srcRowStride; 974f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 975f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcImage += srcImageStride; 976f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 977f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 978f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 979f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 980f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 981f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 982f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 983bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák * Store a 32-bit integer or float depth component texture image. 984f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 98549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 986b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z32(TEXSTORE_PARAMS) 987f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 98825cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian const GLuint depthScale = 0xffffffff; 9891f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 990755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt GLenum dstType; 991a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 992bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák ASSERT(dstFormat == MESA_FORMAT_Z32 || 993bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák dstFormat == MESA_FORMAT_Z32_FLOAT); 99422108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == sizeof(GLuint)); 995f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 996755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt if (dstFormat == MESA_FORMAT_Z32) 997755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt dstType = GL_UNSIGNED_INT; 998755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt else 999755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt dstType = GL_FLOAT; 1000755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt 1001966e199e409a1b52eef88e48997442250997f45eBrian Paul if (ctx->Pixel.DepthScale == 1.0f && 1002966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 1003f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1004a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_DEPTH_COMPONENT && 1005a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_DEPTH_COMPONENT && 1006bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák srcType == dstType) { 1007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 100817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 10095253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 10105253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1011f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1013f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1014f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1015f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1016f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 1017f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 10185253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1019b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 102022108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1021f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 102260909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 1023f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 10241ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 1025bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák dstType, dstRow, 1026a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul depthScale, srcType, src, srcPacking); 1027f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1028f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1029f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1030f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1031f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1032f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1033f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1034f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1035f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1036e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul * Store a 24-bit integer depth component texture image. 1037f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 1038e4c700dbbf2a802f32bf62256c801105998c3729Brian Paulstatic GLboolean 1039e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul_mesa_texstore_x8_z24(TEXSTORE_PARAMS) 1040f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1041e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul const GLuint depthScale = 0xffffff; 1042e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul const GLuint texelBytes = 4; 1043e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul 1044a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 1045e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul ASSERT(dstFormat == MESA_FORMAT_X8_Z24); 1046f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1047e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul { 1048f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1049f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 1050f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 10515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1052b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 1053e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul + dstXoffset * texelBytes; 1054f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 105560909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 1056f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 10571ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 1058a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul GL_UNSIGNED_INT, (GLuint *) dstRow, 1059a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul depthScale, srcType, src, srcPacking); 1060f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1061f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1062f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1063f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1064f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1065f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1066f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1067e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul 1068f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1069c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca * Store a 24-bit integer depth component texture image. 1070c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca */ 1071c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonsecastatic GLboolean 1072c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca_mesa_texstore_z24_x8(TEXSTORE_PARAMS) 1073c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca{ 1074c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLuint depthScale = 0xffffff; 1075c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLuint texelBytes = 4; 1076c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1077c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca (void) dims; 1078c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca ASSERT(dstFormat == MESA_FORMAT_Z24_X8); 1079c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1080c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca { 1081c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca /* general path */ 1082c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLint img, row; 1083c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (img = 0; img < srcDepth; img++) { 10845253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1085c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca + dstYoffset * dstRowStride 1086c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca + dstXoffset * texelBytes; 1087c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (row = 0; row < srcHeight; row++) { 1088c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLvoid *src = _mesa_image_address(dims, srcPacking, 1089c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 1090c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLuint *dst = (GLuint *) dstRow; 1091c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLint i; 1092c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca _mesa_unpack_depth_span(ctx, srcWidth, 1093c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GL_UNSIGNED_INT, dst, 1094c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca depthScale, srcType, src, srcPacking); 1095c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (i = 0; i < srcWidth; i++) 1096c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca dst[i] <<= 8; 1097c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca dstRow += dstRowStride; 1098c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1099c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1100c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1101c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca return GL_TRUE; 1102c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca} 1103c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1104c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1105c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca/** 1106a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul * Store a 16-bit integer depth component texture image. 1107f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 110849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1109b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z16(TEXSTORE_PARAMS) 1110f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 111125cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian const GLuint depthScale = 0xffff; 11121f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 1113a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 11141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_Z16); 111522108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == sizeof(GLushort)); 1116f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1117966e199e409a1b52eef88e48997442250997f45eBrian Paul if (ctx->Pixel.DepthScale == 1.0f && 1118966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 1119f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1120f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_DEPTH_COMPONENT && 1121f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_DEPTH_COMPONENT && 1122a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_SHORT) { 1123f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 112417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 11255253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 11265253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1127f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1128f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1129f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1130f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1131f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 11321ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul GLint img, row; 1133f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 11345253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1135b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 113622108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1137f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 113860909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 1139f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 1140a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dst16 = (GLushort *) dstRow; 11411ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 1142a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul GL_UNSIGNED_SHORT, dst16, depthScale, 1143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType, src, srcPacking); 1144f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1145f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1146f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1147f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1148f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1149f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1151f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1152f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1153defb035b6cf03c555318d9dd48864242ed036f39Brian Paul * Store an rgb565 or rgb565_rev texture image. 1154f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 115549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1156b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb565(TEXSTORE_PARAMS) 1157f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 11581f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 11591f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 116022108bb571808542b89677752d62d3901698265fBrian Paul 11611f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB565 || 11621f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB565_REV); 116322108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1166f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 11671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB565 && 1168a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1169a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGB && 1170a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5) { 1171f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 117217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 11735253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 11745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1176f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1177f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1178a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else if (!ctx->_ImageTransferState && 1179a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1180a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1181a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGB && 1182a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE && 1183a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dims == 2) { 1184a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* do optimized tex store */ 11858c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 11868c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1187a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLubyte *src = (const GLubyte *) 118860909388ab136d849d99eab49e782a53772a618fBrian Paul _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight, 1189a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, 0, 0, 0); 11905253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dst = dstSlices[0] 1191a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul + dstYoffset * dstRowStride 119222108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1193a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLint row, col; 1194a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1195a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLubyte *srcUB = (const GLubyte *) src; 1196a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dstUS = (GLushort *) dst; 1197defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* check for byteswapped format */ 11981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_RGB565) { 1199f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1200f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] ); 1201f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul srcUB += 3; 1202f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1203f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1204f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1205f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1206f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] ); 1207f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul srcUB += 3; 1208f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1209defb035b6cf03c555318d9dd48864242ed036f39Brian Paul } 1210a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dst += dstRowStride; 1211a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul src += srcRowStride; 1212a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1213a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1214f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1215f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1216663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1217a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat, 121822108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1219a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, 1220a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, srcAddr, 1221a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcPacking); 1222663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 1223f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1224a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!tempImage) 1225a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_FALSE; 1226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 12275253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1228b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 122922108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1230f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1231a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dstUS = (GLushort *) dstRow; 1232defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* check for byteswapped format */ 12331f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_RGB565) { 1234f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1235663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_565( src[RCOMP], 1236663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1237663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1238f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 3; 1239f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1240f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1241f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1242f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1243663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_565_REV( src[RCOMP], 1244663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1245663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1246f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 3; 1247f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1249f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1250f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1251f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 125232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1258248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 1259248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV. 1260248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 126149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1262b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba8888(TEXSTORE_PARAMS) 1263f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1264184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 12651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 12661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 126771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 12681f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA8888 || 1269d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu dstFormat == MESA_FORMAT_RGBA8888_REV || 1270d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu dstFormat == MESA_FORMAT_RGBX8888 || 1271d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu dstFormat == MESA_FORMAT_RGBX8888_REV); 127222108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 4); 1273f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1274f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1275f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1276d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu (dstFormat == MESA_FORMAT_RGBA8888 || 1277d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu dstFormat == MESA_FORMAT_RGBX8888) && 1278f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1279defb035b6cf03c555318d9dd48864242ed036f39Brian Paul ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) || 12802e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) || 12812e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) || 12822e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian))) { 12832e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger /* simple memcpy path */ 12842e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger memcpy_texture(ctx, dims, 12855253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 12865253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 12872e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 12882e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger srcAddr, srcPacking); 12892e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger } 12902e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger else if (!ctx->_ImageTransferState && 12912e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger !srcPacking->SwapBytes && 1292d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu (dstFormat == MESA_FORMAT_RGBA8888_REV || 1293d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu dstFormat == MESA_FORMAT_RGBX8888_REV) && 12942e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger baseInternalFormat == GL_RGBA && 12952e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) || 12962e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) || 12972e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) || 12982e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian))) { 1299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 130017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 13015253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 13025253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 130671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 130746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell (srcType == GL_UNSIGNED_BYTE || 130846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8 || 130946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8_REV) && 1310528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger can_swizzle(baseInternalFormat) && 131171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell can_swizzle(srcFormat)) { 131246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 131371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte dstmap[4]; 131471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 1315528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger /* dstmap - how to swizzle from RGBA to dst format: 131671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell */ 1317d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu if ((littleEndian && (dstFormat == MESA_FORMAT_RGBA8888 || 1318d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu dstFormat == MESA_FORMAT_RGBX8888)) || 1319d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu (!littleEndian && (dstFormat == MESA_FORMAT_RGBA8888_REV || 1320d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu dstFormat == MESA_FORMAT_RGBX8888_REV))) { 132146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 0; 132246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 1; 132346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 2; 132446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 3; 132546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 132646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell else { 132746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 3; 132846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 2; 132946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 1; 133046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 0; 133146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 133271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 133371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 133471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat, 133546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType, 1336528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger baseInternalFormat, 133771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstmap, 4, 13385253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstXoffset, dstYoffset, dstZoffset, 13395253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 134071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 134171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcPacking); 134271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 1343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1344f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1345663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1346f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 134722108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1348f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1349f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1351663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 1352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1355f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 13565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1357b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 135822108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1359f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1360f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLuint *dstUI = (GLuint *) dstRow; 1361d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu if (dstFormat == MESA_FORMAT_RGBA8888 || 1362d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu dstFormat == MESA_FORMAT_RGBX8888) { 1363f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1364663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUI[col] = PACK_COLOR_8888( src[RCOMP], 1365663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1366663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP], 1367663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[ACOMP] ); 1368f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1369f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1370f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1371f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1372f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1373663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUI[col] = PACK_COLOR_8888_REV( src[RCOMP], 1374663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1375663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP], 1376663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[ACOMP] ); 1377f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1378f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1379a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1380a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1381a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1382a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 138332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1384a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1385a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1386a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1387a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1388a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 138949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1390b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb8888(TEXSTORE_PARAMS) 1391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1392184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 13931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 1394f920d496e1b5b01a3ba9bcd7dcff5c19bc109da2Brian Paul const GLenum baseFormat = GL_RGBA; 1395f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 13961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB8888 || 139774d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_ARGB8888_REV || 13982d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer dstFormat == MESA_FORMAT_XRGB8888 || 13992d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer dstFormat == MESA_FORMAT_XRGB8888_REV ); 140022108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 4); 1401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1402f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 140474d61d03b54d72217d463c248468cdcd09320efcBrian Paul (dstFormat == MESA_FORMAT_ARGB8888 || 140574d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_XRGB8888) && 1406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGRA && 1408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ((srcType == GL_UNSIGNED_BYTE && littleEndian) || 1409defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV)) { 1410defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* simple memcpy path (little endian) */ 141117bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 14125253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 14135253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1415f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1417defb035b6cf03c555318d9dd48864242ed036f39Brian Paul else if (!ctx->_ImageTransferState && 1418a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 14192d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (dstFormat == MESA_FORMAT_ARGB8888_REV || 14202d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer dstFormat == MESA_FORMAT_XRGB8888_REV) && 1421a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGBA && 1422a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_BGRA && 1423a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul ((srcType == GL_UNSIGNED_BYTE && !littleEndian) || 1424defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8)) { 1425defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* simple memcpy path (big endian) */ 142617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 14275253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 14285253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1429a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1430a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcAddr, srcPacking); 1431a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 143271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 143371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell !srcPacking->SwapBytes && 143474d61d03b54d72217d463c248468cdcd09320efcBrian Paul (dstFormat == MESA_FORMAT_ARGB8888 || 143574d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_XRGB8888) && 143671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat == GL_RGB && 14370c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell (baseInternalFormat == GL_RGBA || 14380c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat == GL_RGB) && 143971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcType == GL_UNSIGNED_BYTE) { 144071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell int img, row, col; 144171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (img = 0; img < srcDepth; img++) { 14428c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 14438c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 144471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 144571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 14465253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1447b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 144822108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 144971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (row = 0; row < srcHeight; row++) { 1450259eacfa94a1086e4c99db83516989cc27832ef4Brian GLuint *d4 = (GLuint *) dstRow; 145171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (col = 0; col < srcWidth; col++) { 145224748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul d4[col] = PACK_COLOR_8888(0xff, 145324748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + RCOMP], 145424748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + GCOMP], 145524748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + BCOMP]); 145671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 145771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 145871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 145971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 146071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 146171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 146271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 146371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell !srcPacking->SwapBytes && 14641f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB8888 && 146571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat == GL_RGBA && 14660c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat == GL_RGBA && 146724748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcType == GL_UNSIGNED_BYTE) { 1468259eacfa94a1086e4c99db83516989cc27832ef4Brian /* same as above case, but src data has alpha too */ 1469b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row, col; 1470ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* For some reason, streaming copies to write-combined regions 1471ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * are extremely sensitive to the characteristics of how the 1472ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * source data is retrieved. By reordering the source reads to 1473ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * be in-order, the speed of this operation increases by half. 1474ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Strangely the same isn't required for the RGB path, above. 1475ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 1476ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (img = 0; img < srcDepth; img++) { 14778c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 14788c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1479ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 1480ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 14815253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1482b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 148322108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1484ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (row = 0; row < srcHeight; row++) { 1485259eacfa94a1086e4c99db83516989cc27832ef4Brian GLuint *d4 = (GLuint *) dstRow; 1486ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (col = 0; col < srcWidth; col++) { 148724748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP], 148824748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + RCOMP], 148924748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + GCOMP], 149024748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + BCOMP]); 149171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 149271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 149371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 149471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 149571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 149671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 149771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 149846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell (srcType == GL_UNSIGNED_BYTE || 149946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8 || 150046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8_REV) && 15010c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell can_swizzle(baseInternalFormat) && 150271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell can_swizzle(srcFormat)) { 150371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 150471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte dstmap[4]; 150571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 15060c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 150771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell */ 15081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 150974d61d03b54d72217d463c248468cdcd09320efcBrian Paul (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) || 15102d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) || 15112d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) { 151246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 3; /* alpha */ 151346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 0; /* red */ 151446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 1; /* green */ 151546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 2; /* blue */ 151646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 151746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell else { 15181f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) || 151974d61d03b54d72217d463c248468cdcd09320efcBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 15202d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) || 152174d61d03b54d72217d463c248468cdcd09320efcBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888)); 152246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 2; 152346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 1; 152446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 0; 152546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 3; 152646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 152771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 152871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 152971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat, 153046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType, 15310c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat, 153271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstmap, 4, 15335253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstXoffset, dstYoffset, dstZoffset, 1534b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 15355253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstSlices, 153671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 153771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcPacking); 153871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 1539a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else { 1540a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* general path */ 1541663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1542a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat, 154322108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1544a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, 1545a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, srcAddr, 1546a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcPacking); 1547663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 1548a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLint img, row, col; 1549a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!tempImage) 1550a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_FALSE; 1551a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 15525253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1553b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 155422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1555a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1556a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLuint *dstUI = (GLuint *) dstRow; 15571f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_ARGB8888) { 1558f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1559663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUI[col] = PACK_COLOR_8888( src[ACOMP], 1560663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 1561663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1562663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1563f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1564f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1565a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 156674d61d03b54d72217d463c248468cdcd09320efcBrian Paul else if (dstFormat == MESA_FORMAT_XRGB8888) { 156774d61d03b54d72217d463c248468cdcd09320efcBrian Paul for (col = 0; col < srcWidth; col++) { 156874d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstUI[col] = PACK_COLOR_8888( 0xff, 1569663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 1570663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1571663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 157274d61d03b54d72217d463c248468cdcd09320efcBrian Paul src += 4; 157374d61d03b54d72217d463c248468cdcd09320efcBrian Paul } 157474d61d03b54d72217d463c248468cdcd09320efcBrian Paul } 1575f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1576f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1577663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUI[col] = PACK_COLOR_8888_REV( src[ACOMP], 1578663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 1579663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1580663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1581f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1582f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1583defb035b6cf03c555318d9dd48864242ed036f39Brian Paul } 1584a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1585a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1586a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 158732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1588a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1589a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1590a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1591a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1592f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 159349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1594b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb888(TEXSTORE_PARAMS) 1595f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1596184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 15971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 15981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1599f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 16001f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB888); 160122108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 3); 1602f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1603f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1604f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1605f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB && 1606f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGR && 1607f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE && 1608f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul littleEndian) { 1609f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 161017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 16115253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 16125253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (!ctx->_ImageTransferState && 1617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_RGBA && 1619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 1620a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* extract RGB from RGBA */ 1621b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row, col; 1622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 16238c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 16248c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 162560909388ab136d849d99eab49e782a53772a618fBrian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 162660909388ab136d849d99eab49e782a53772a618fBrian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 16275253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1628b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 162922108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1632f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP]; 1633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1634f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP]; 1635f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1637f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcRow += srcRowStride; 1638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1639f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 16413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 16423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 16433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 16443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 16453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 16463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 16473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 16483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 16493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 1650167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[0] = 2; 16513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 1; 1652167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[2] = 0; 16533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 16543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 16553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 16563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 16573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 16583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 16593aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 3, 16605253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstXoffset, dstYoffset, dstZoffset, 16615253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 16623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 16633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 16643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1665f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1666f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1667663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1668f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 166922108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1670f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1671f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1672f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1673663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = (const GLubyte *) tempImage; 1674f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1675f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1676f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1677f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 16785253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1679b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 168022108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1681f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1682f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#if 0 1683f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (littleEndian) { 1684f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1685663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 0] = src[RCOMP]; 1686663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 1] = src[GCOMP]; 1687663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 2] = src[BCOMP]; 1688f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcUB += 3; 1689f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1690f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1691f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1692f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1693f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = srcUB[BCOMP]; 1694f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = srcUB[GCOMP]; 1695f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = srcUB[RCOMP]; 1696f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcUB += 3; 1697f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1698f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1699f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#else 1700f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1701663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 0] = src[BCOMP]; 1702663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 1] = src[GCOMP]; 1703663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 2] = src[RCOMP]; 1704f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += 3; 1705f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1706f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#endif 1707f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1708f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1709f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 171032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1711f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1712f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1713f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1714f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1715f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 171649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1717b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_bgr888(TEXSTORE_PARAMS) 1718a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul{ 1719184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 17201f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 17211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1722a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 17231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_BGR888); 172422108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 3); 1725a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1726a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!ctx->_ImageTransferState && 1727a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1728a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1729a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGB && 1730a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE && 1731a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul littleEndian) { 1732a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* simple memcpy path */ 173317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 17345253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 17355253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1736a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1737a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcAddr, srcPacking); 1738a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1739a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else if (!ctx->_ImageTransferState && 1740a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1741a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGBA && 1742a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE) { 1743a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* extract BGR from RGBA */ 1744a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul int img, row, col; 1745a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 17468c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 17478c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 174860909388ab136d849d99eab49e782a53772a618fBrian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 174960909388ab136d849d99eab49e782a53772a618fBrian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 17505253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1751b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 175222108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1753a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1754a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (col = 0; col < srcWidth; col++) { 1755a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP]; 1756a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1757a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP]; 1758a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1759a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1760a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcRow += srcRowStride; 1761a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1762a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1763a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 17643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 17653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 17663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 17673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 17683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 17693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 17703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 17713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 17723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 1773167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[0] = 0; 17743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 1; 1775167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[2] = 2; 17763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 17773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 17783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 17793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 17803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 17813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 17823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 3, 17835253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstXoffset, dstYoffset, dstZoffset, 17845253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 17853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 17863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 17873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1788a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else { 1789a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* general path */ 1790663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1791a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat, 179222108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1793a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, 1794a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, srcAddr, 1795a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcPacking); 1796663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = (const GLubyte *) tempImage; 1797a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLint img, row, col; 1798a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!tempImage) 1799a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_FALSE; 1800a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 18015253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1802b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 180322108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1804a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1805a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (col = 0; col < srcWidth; col++) { 1806663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 0] = src[RCOMP]; 1807663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 1] = src[GCOMP]; 1808663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col * 3 + 2] = src[BCOMP]; 1809a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul src += 3; 1810a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1811a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1812a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1813a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 181432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1815a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1816a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1817a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1818a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1819a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 182049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1821b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb4444(TEXSTORE_PARAMS) 1822f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 18231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 18241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 182522108bb571808542b89677752d62d3901698265fBrian Paul 18261f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB4444 || 18271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB4444_REV); 182822108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1829f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1830f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1831f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 18321f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB4444 && 1833f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1834f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGRA && 1835defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV) { 1836f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 183717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 18385253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 18395253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1840f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1841f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1842f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1843f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1844f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1845663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1846f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 184722108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1848f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1849f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1850f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1851663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 1852f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1853f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1854f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1855f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 18565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1857b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 185822108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1859f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1860f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 18611f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_ARGB4444) { 1862f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1863663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_4444( src[ACOMP], 1864663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 1865663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1866663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1867f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1868f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1869f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1870f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1871f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1872663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_4444_REV( src[ACOMP], 1873663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 1874663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1875663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1876f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1877f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1878a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1879a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1880a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1881a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 188232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1883a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1884a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1885a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1886a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 188749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1888dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom_mesa_texstore_rgba5551(TEXSTORE_PARAMS) 1889dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom{ 18901f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 18911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 189222108bb571808542b89677752d62d3901698265fBrian Paul 18931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA5551); 189422108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1895a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1896dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom if (!ctx->_ImageTransferState && 1897dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom !srcPacking->SwapBytes && 18981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGBA5551 && 1899dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom baseInternalFormat == GL_RGBA && 1900dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcFormat == GL_RGBA && 1901dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcType == GL_UNSIGNED_SHORT_5_5_5_1) { 1902dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom /* simple memcpy path */ 1903dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom memcpy_texture(ctx, dims, 19045253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 19055253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1906dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1907dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcAddr, srcPacking); 1908dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1909dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom else { 1910dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom /* general path */ 1911663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1912dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom baseInternalFormat, 191322108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1914dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcWidth, srcHeight, srcDepth, 1915dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcFormat, srcType, srcAddr, 1916dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcPacking); 1917663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src =tempImage; 1918dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom GLint img, row, col; 1919dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom if (!tempImage) 1920dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom return GL_FALSE; 1921dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom for (img = 0; img < srcDepth; img++) { 19225253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1923dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom + dstYoffset * dstRowStride 192422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1925dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom for (row = 0; row < srcHeight; row++) { 1926dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom GLushort *dstUS = (GLushort *) dstRow; 1927dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom for (col = 0; col < srcWidth; col++) { 1928663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_5551( src[RCOMP], 1929663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1930663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP], 1931663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[ACOMP] ); 1932dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom src += 4; 1933dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1934dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstRow += dstRowStride; 1935dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1936dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 193732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1938dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1939dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom return GL_TRUE; 1940dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom} 1941defb035b6cf03c555318d9dd48864242ed036f39Brian Paul 194249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1943b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb1555(TEXSTORE_PARAMS) 1944f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 19451f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 19461f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 194722108bb571808542b89677752d62d3901698265fBrian Paul 19481f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB1555 || 19491f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB1555_REV); 195022108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1951f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1952f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1953f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 19541f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB1555 && 1955f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1956f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGRA && 1957defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV) { 1958f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 195917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 19605253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 19615253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1962f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1963f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1964f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1965f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1966f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1967663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1968f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 196922108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1970f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1971f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1972f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1973663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src =tempImage; 1974f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1975f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1976f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1977f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 19785253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 1979b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 198022108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1981f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1982f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 19831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_ARGB1555) { 1984f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1985663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_1555( src[ACOMP], 1986663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 1987663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1988663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1989f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1990f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1991f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1992f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1993f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1994663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_1555_REV( src[ACOMP], 1995663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[RCOMP], 1996663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 1997663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 1998f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1999f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 2000a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2001a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 2002a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2003a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 200432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2005a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2006a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 2007a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 2008a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 2009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2010621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšákstatic GLboolean 2011621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák_mesa_texstore_argb2101010(TEXSTORE_PARAMS) 2012621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák{ 2013621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2014621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2015621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 2016621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák ASSERT(dstFormat == MESA_FORMAT_ARGB2101010); 2017621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák ASSERT(texelBytes == 4); 2018621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 2019621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák if (!ctx->_ImageTransferState && 2020621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák !srcPacking->SwapBytes && 2021621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák dstFormat == MESA_FORMAT_ARGB2101010 && 2022621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcFormat == GL_BGRA && 2023621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcType == GL_UNSIGNED_INT_2_10_10_10_REV && 2024621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák baseInternalFormat == GL_RGBA) { 2025621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák /* simple memcpy path */ 2026621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák memcpy_texture(ctx, dims, 20275253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 20285253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2029621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2030621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcAddr, srcPacking); 2031621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2032621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák else { 2033621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák /* general path */ 2034e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2035621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák baseInternalFormat, 2036621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák baseFormat, 2037621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcWidth, srcHeight, srcDepth, 2038621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcFormat, srcType, srcAddr, 203950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák srcPacking, 204050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák ctx->_ImageTransferState); 204150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák const GLfloat *src = tempImage; 2042621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák GLint img, row, col; 2043621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák if (!tempImage) 2044621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák return GL_FALSE; 2045621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (img = 0; img < srcDepth; img++) { 20465253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 2047621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák + dstYoffset * dstRowStride 2048621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák + dstXoffset * texelBytes; 2049621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák if (baseInternalFormat == GL_RGBA) { 2050621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (row = 0; row < srcHeight; row++) { 205150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLuint *dstUI = (GLuint *) dstRow; 2052621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (col = 0; col < srcWidth; col++) { 205350630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLushort a,r,g,b; 205450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák 205550630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]); 205650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); 205750630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); 205850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); 205950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák dstUI[col] = PACK_COLOR_2101010_US(a, r, g, b); 2060621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák src += 4; 2061621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2062621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák dstRow += dstRowStride; 2063621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2064621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } else if (baseInternalFormat == GL_RGB) { 2065621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (row = 0; row < srcHeight; row++) { 206650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLuint *dstUI = (GLuint *) dstRow; 2067621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (col = 0; col < srcWidth; col++) { 206850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLushort r,g,b; 206950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák 207050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); 207150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); 207250630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); 207350630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b); 2074621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák src += 4; 2075621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2076621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák dstRow += dstRowStride; 2077621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2078621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } else { 2079621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák ASSERT(0); 2080621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2081621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2082621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák free((void *) tempImage); 2083621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 2084621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák return GL_TRUE; 2085621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák} 2086621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 2087621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 208839de9251c4770fdcce3395643003aa626178446dBrian Paul/** 2089bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák * Do texstore for 2-channel, 4-bit/channel, unsigned normalized formats. 2090bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák */ 2091bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšákstatic GLboolean 2092bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák_mesa_texstore_unorm44(TEXSTORE_PARAMS) 2093bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák{ 2094bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2095bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2096bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 2097bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák ASSERT(dstFormat == MESA_FORMAT_AL44); 2098bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák ASSERT(texelBytes == 1); 2099bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 2100bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák { 2101bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák /* general path */ 2102663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 2103bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák baseInternalFormat, 2104bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák baseFormat, 2105bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák srcWidth, srcHeight, srcDepth, 2106bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák srcFormat, srcType, srcAddr, 2107bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák srcPacking); 2108663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 2109bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák GLint img, row, col; 2110bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák if (!tempImage) 2111bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák return GL_FALSE; 2112bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák for (img = 0; img < srcDepth; img++) { 21135253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 2114bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák + dstYoffset * dstRowStride 2115bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák + dstXoffset * texelBytes; 2116bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák for (row = 0; row < srcHeight; row++) { 2117bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák GLubyte *dstUS = (GLubyte *) dstRow; 2118bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák for (col = 0; col < srcWidth; col++) { 2119bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák /* src[0] is luminance, src[1] is alpha */ 2120663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_44( src[1], 2121663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[0] ); 2122bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák src += 2; 2123bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 2124bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák dstRow += dstRowStride; 2125bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 2126bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 2127bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák free((void *) tempImage); 2128bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 2129bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák return GL_TRUE; 2130bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák} 2131bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 2132bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 2133bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák/** 213439de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats. 213539de9251c4770fdcce3395643003aa626178446dBrian Paul */ 213649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 21375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm88(TEXSTORE_PARAMS) 2138f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 2139184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 21401f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 21411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2142f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 21431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_AL88 || 21445d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_AL88_REV || 21450a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul dstFormat == MESA_FORMAT_GR88 || 2146b4aecc4e1861e60e40e14868719219084967e46dBrian Paul dstFormat == MESA_FORMAT_RG88); 214722108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 2148f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2149f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2151e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede ((dstFormat == MESA_FORMAT_AL88 && 2152e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == GL_LUMINANCE_ALPHA && 2153e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede srcFormat == GL_LUMINANCE_ALPHA) || 21540a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul (dstFormat == MESA_FORMAT_GR88 && 2155e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == srcFormat)) && 2156f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE && 2157f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul littleEndian) { 2158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 215917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 21605253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 21615253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2162f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2163f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 21653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 2166bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell littleEndian && 21673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 21683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 21693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 21703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 21713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 21723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 21733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 21745d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) { 21755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if ((littleEndian && dstFormat == MESA_FORMAT_AL88) || 21765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) { 21775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 0; 21785d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 3; 21795d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 21805d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 21815d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 3; 21825d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 0; 21835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 21843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 21853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else { 21860a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul if ((littleEndian && dstFormat == MESA_FORMAT_GR88) || 2187b4aecc4e1861e60e40e14868719219084967e46dBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_RG88)) { 21885d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 0; 21895d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 1; 21905d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 21915d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 21925d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 1; 21935d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 0; 21945d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 21953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 21963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[2] = ZERO; /* ? */ 21973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 21983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 21993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 22003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 22013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 22023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 22033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 2, 22045253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstXoffset, dstYoffset, dstZoffset, 22055253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 22063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 22073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 22083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 2209f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2210f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 2211663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 2212f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 221322108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2214f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2215f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2216f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2217663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 2218f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2219f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2220f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2221f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 22225253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 2223b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 222422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2225f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 22275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL88 || 22280a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul dstFormat == MESA_FORMAT_GR88) { 2229f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 2230ae70caf7eb708351ee93b35926142e503be79d39Brian Paul /* src[0] is luminance (or R), src[1] is alpha (or G) */ 2231663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_88( src[1], 2232663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[0] ); 2233f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 2; 2234f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 2235f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2236f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 2237f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 2238ae70caf7eb708351ee93b35926142e503be79d39Brian Paul /* src[0] is luminance (or R), src[1] is alpha (or G) */ 2239663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_88_REV( src[1], 2240663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[0] ); 2241f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 2; 2242f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 2243a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2244a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 2245a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2246a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 224732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2248a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2249a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 2250a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 2251a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 2252a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 225339de9251c4770fdcce3395643003aa626178446dBrian Paul/** 225439de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats. 225539de9251c4770fdcce3395643003aa626178446dBrian Paul */ 225649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 22575d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm1616(TEXSTORE_PARAMS) 22583325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick{ 22593325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLboolean littleEndian = _mesa_little_endian(); 22603325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 22613325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 22623325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 22633325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick ASSERT(dstFormat == MESA_FORMAT_AL1616 || 22645d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_AL1616_REV || 22655d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616 || 22665d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616_REV); 22673325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick ASSERT(texelBytes == 4); 22683325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 22693325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick if (!ctx->_ImageTransferState && 22703325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick !srcPacking->SwapBytes && 2271e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede ((dstFormat == MESA_FORMAT_AL1616 && 2272e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == GL_LUMINANCE_ALPHA && 2273e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede srcFormat == GL_LUMINANCE_ALPHA) || 2274e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede (dstFormat == MESA_FORMAT_RG1616 && 2275e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == srcFormat)) && 22763325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcType == GL_UNSIGNED_SHORT && 22773325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick littleEndian) { 22783325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick /* simple memcpy path */ 22793325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick memcpy_texture(ctx, dims, 22805253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 22815253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 22823325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcWidth, srcHeight, srcDepth, srcFormat, srcType, 22833325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcAddr, srcPacking); 22843325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 22853325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick else { 22863325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick /* general path */ 2287e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 22883325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick baseInternalFormat, 22893325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick baseFormat, 22903325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcWidth, srcHeight, srcDepth, 22913325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcFormat, srcType, srcAddr, 2292bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2293bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 22943325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLfloat *src = tempImage; 22953325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick GLint img, row, col; 22963325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick if (!tempImage) 22973325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick return GL_FALSE; 22983325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (img = 0; img < srcDepth; img++) { 22995253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 23003325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick + dstYoffset * dstRowStride 23013325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick + dstXoffset * texelBytes; 23023325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (row = 0; row < srcHeight; row++) { 23033325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick GLuint *dstUI = (GLuint *) dstRow; 23045d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL1616 || 23055d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616) { 23063325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (col = 0; col < srcWidth; col++) { 2307db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt GLushort l, a; 2308db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt 2309db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(l, src[0]); 2310db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(a, src[1]); 2311db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt dstUI[col] = PACK_COLOR_1616(a, l); 2312db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt src += 2; 23133325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 23143325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 23153325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick else { 23163325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (col = 0; col < srcWidth; col++) { 2317db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt GLushort l, a; 2318db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt 2319db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(l, src[0]); 2320db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(a, src[1]); 2321db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt dstUI[col] = PACK_COLOR_1616_REV(a, l); 2322db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt src += 2; 23233325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 23243325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 23253325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick dstRow += dstRowStride; 23263325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 23273325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 232832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 23293325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 23303325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick return GL_TRUE; 23313325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick} 23323325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 23333325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 2334fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák/* Texstore for R16, A16, L16, I16. */ 23353325dc91be2534079ebf7997700b6e5f17a75283Ian Romanickstatic GLboolean 2336eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák_mesa_texstore_unorm16(TEXSTORE_PARAMS) 23375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick{ 23385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLboolean littleEndian = _mesa_little_endian(); 23395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 23405d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 23415d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 2342eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák ASSERT(dstFormat == MESA_FORMAT_R16 || 2343bb5ace68ce9e8bd171a39162ed6bd93632bd6619Marek Olšák dstFormat == MESA_FORMAT_A16 || 2344fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák dstFormat == MESA_FORMAT_L16 || 2345fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák dstFormat == MESA_FORMAT_I16); 23465d1387b2da3626326410804026f8b92f1a121fdcIan Romanick ASSERT(texelBytes == 2); 23475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 23485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (!ctx->_ImageTransferState && 23495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick !srcPacking->SwapBytes && 2350eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák baseInternalFormat == srcFormat && 23515d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcType == GL_UNSIGNED_SHORT && 23525d1387b2da3626326410804026f8b92f1a121fdcIan Romanick littleEndian) { 23535d1387b2da3626326410804026f8b92f1a121fdcIan Romanick /* simple memcpy path */ 23545d1387b2da3626326410804026f8b92f1a121fdcIan Romanick memcpy_texture(ctx, dims, 23555253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 23565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 23575d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, srcFormat, srcType, 23585d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcAddr, srcPacking); 23595d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 23605d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 23615d1387b2da3626326410804026f8b92f1a121fdcIan Romanick /* general path */ 2362e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 23635d1387b2da3626326410804026f8b92f1a121fdcIan Romanick baseInternalFormat, 23645d1387b2da3626326410804026f8b92f1a121fdcIan Romanick baseFormat, 23655d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, 23665d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcFormat, srcType, srcAddr, 2367bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2368bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 23695d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLfloat *src = tempImage; 23705d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLint img, row, col; 23715d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (!tempImage) 23725d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return GL_FALSE; 23735d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (img = 0; img < srcDepth; img++) { 23745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 23755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick + dstYoffset * dstRowStride 23765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick + dstXoffset * texelBytes; 23775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (row = 0; row < srcHeight; row++) { 23785d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLushort *dstUS = (GLushort *) dstRow; 23795d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (col = 0; col < srcWidth; col++) { 23805d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLushort r; 23815d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 23825d1387b2da3626326410804026f8b92f1a121fdcIan Romanick UNCLAMPED_FLOAT_TO_USHORT(r, src[0]); 23835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstUS[col] = r; 23845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick src += 1; 23855d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 23865d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstRow += dstRowStride; 23875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 23885d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 23895d1387b2da3626326410804026f8b92f1a121fdcIan Romanick free((void *) tempImage); 23905d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 23915d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return GL_TRUE; 23925d1387b2da3626326410804026f8b92f1a121fdcIan Romanick} 23935d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 23945d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 23955d1387b2da3626326410804026f8b92f1a121fdcIan Romanickstatic GLboolean 239617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul_mesa_texstore_rgba_16(TEXSTORE_PARAMS) 239717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul{ 239817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 239917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 240017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 240117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_16); 240217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul ASSERT(texelBytes == 8); 240317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 240417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul if (!ctx->_ImageTransferState && 240517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul !srcPacking->SwapBytes && 240617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseInternalFormat == GL_RGBA && 240717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcFormat == GL_RGBA && 240817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcType == GL_UNSIGNED_SHORT) { 240917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul /* simple memcpy path */ 241017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul memcpy_texture(ctx, dims, 24115253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 24125253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 241317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 241417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcAddr, srcPacking); 241517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 241617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul else { 241717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul /* general path */ 2418e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 241917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseInternalFormat, 242017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseFormat, 242117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcWidth, srcHeight, srcDepth, 242217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcFormat, srcType, srcAddr, 2423bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2424bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 242517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLfloat *src = tempImage; 242617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLint img, row, col; 242717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul if (!tempImage) 242817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul return GL_FALSE; 242917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (img = 0; img < srcDepth; img++) { 24305253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 243117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul + dstYoffset * dstRowStride 243217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul + dstXoffset * texelBytes; 243317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (row = 0; row < srcHeight; row++) { 243417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLushort *dstUS = (GLushort *) dstRow; 243517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (col = 0; col < srcWidth; col++) { 243617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLushort r, g, b, a; 243717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 243817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(r, src[0]); 243917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(g, src[1]); 244017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(b, src[2]); 244117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(a, src[3]); 244217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+0] = r; 244317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+1] = g; 244417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+2] = b; 244517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+3] = a; 244617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul src += 4; 244717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 244817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstRow += dstRowStride; 244917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 245017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 245117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul free((void *) tempImage); 245217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 245317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul return GL_TRUE; 245417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul} 245517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 245617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 245717e96718946486ef77927fcf3bb299d8bff32b98Brian Paulstatic GLboolean 2458279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS) 2459279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul{ 2460279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2461279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2462279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2463daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGB_16 || 2464279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA_16); 2465279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2466279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul if (!ctx->_ImageTransferState && 2467279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul !srcPacking->SwapBytes && 2468279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseInternalFormat == GL_RGBA && 2469279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA_16 && 2470279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcFormat == GL_RGBA && 2471279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcType == GL_SHORT) { 2472279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* simple memcpy path */ 2473279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul memcpy_texture(ctx, dims, 24745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 24755253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2476279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2477279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcAddr, srcPacking); 2478279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2479279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul else { 2480279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* general path */ 2481e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2482279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseInternalFormat, 2483279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseFormat, 2484279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcWidth, srcHeight, srcDepth, 2485279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcFormat, srcType, srcAddr, 2486bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2487bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 2488279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLfloat *src = tempImage; 2489279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2; 2490279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLint img, row, col; 2491279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2492279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul if (!tempImage) 2493279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul return GL_FALSE; 2494279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2495279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* Note: tempImage is always float[4] / RGBA. We convert to 1, 2, 2496279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul * 3 or 4 components/pixel here. 2497279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul */ 2498279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul for (img = 0; img < srcDepth; img++) { 24995253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 2500279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul + dstYoffset * dstRowStride 2501279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul + dstXoffset * texelBytes; 2502279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul for (row = 0; row < srcHeight; row++) { 2503279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLshort *dstRowS = (GLshort *) dstRow; 2504daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (dstFormat == MESA_FORMAT_SIGNED_RGBA_16) { 2505daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 2506daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLuint c; 2507daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (c = 0; c < comps; c++) { 2508daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort p; 2509daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]); 2510daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRowS[col * comps + c] = p; 2511daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2512daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2513daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 2514daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 4 * srcWidth; 2515daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } else { 2516daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 2517daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLuint c; 2518daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (c = 0; c < comps; c++) { 2519daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort p; 2520daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 3 + c]); 2521daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRowS[col * comps + c] = p; 2522daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2523279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2524daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 2525daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 3 * srcWidth; 2526279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2527279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2528279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2529279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul free((void *) tempImage); 2530279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2531279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul return GL_TRUE; 2532279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul} 2533279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2534279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2535279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paulstatic GLboolean 2536b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb332(TEXSTORE_PARAMS) 2537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 25381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 25391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 254022108bb571808542b89677752d62d3901698265fBrian Paul 25411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB332); 254222108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 1); 2543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB && 2547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_RGB && srcType == GL_UNSIGNED_BYTE_3_3_2) { 2548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 254917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 25505253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 25515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2554f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2556f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 2557663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 2558f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 255922108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2560f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2561f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2562f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2563663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 2564f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2565f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2566f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2567f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 25685253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 2569b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 257022108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2571f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2572f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 2573663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col] = PACK_COLOR_332( src[RCOMP], 2574663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[GCOMP], 2575663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[BCOMP] ); 2576f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += 3; 2577f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2578f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 2579f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2580f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 258132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2582f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2584f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2585f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2586f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2587f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 2588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8. 2589f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 259049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2591bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák_mesa_texstore_unorm8(TEXSTORE_PARAMS) 2592f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 25931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 25941f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 259522108bb571808542b89677752d62d3901698265fBrian Paul 25961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_A8 || 25971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_L8 || 25985d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_I8 || 25995d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_R8); 260022108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 1); 2601f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2602f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2603f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2604f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 2605f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 2606f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 260717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 26085253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 26095253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2610f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2611f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2612f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 26133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 26143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 26153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 26163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 26173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 26183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 26193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 26203aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 26211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_A8) { 26223aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 3; 26233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 26243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else { 26253aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 0; 26263aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 26273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = ZERO; /* ? */ 26283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[2] = ZERO; /* ? */ 26293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 26303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 26313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 26323aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 26333aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 26343aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 26353aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 1, 26365253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstXoffset, dstYoffset, dstZoffset, 26375253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 26383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 26393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 26403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 2641f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2642f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 2643663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 2644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 264522108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2646f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2647f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2648f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2649663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 2650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2651f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 26545253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 2655b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 265622108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2658f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 2659663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col] = src[col]; 2660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 2662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcWidth; 2663f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2664f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 266532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2666f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2667f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2668f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2669f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2670f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2671f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2672f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 26731f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV. 2674f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 267549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2676b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ycbcr(TEXSTORE_PARAMS) 2677f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 2678184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 26791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 268022108bb571808542b89677752d62d3901698265fBrian Paul 2681a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; (void) dims; (void) baseInternalFormat; 2682f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 26831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT((dstFormat == MESA_FORMAT_YCBCR) || 26841f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (dstFormat == MESA_FORMAT_YCBCR_REV)); 268522108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 2686f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(ctx->Extensions.MESA_ycbcr_texture); 2687f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(srcFormat == GL_YCBCR_MESA); 2688f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) || 2689f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA)); 2690f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_YCBCR_MESA); 2691f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2692f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* always just memcpy since no pixel transfer ops apply */ 269317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 26945253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 26955253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2696f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2697f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2698f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2699f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* Check if we need byte swapping */ 2700f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* XXX the logic here _might_ be wrong */ 2701f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (srcPacking->SwapBytes ^ 2702f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^ 27031f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (dstFormat == MESA_FORMAT_YCBCR_REV) ^ 2704f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !littleEndian) { 2705f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 2706f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 27075253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 2708b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 270922108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2710f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2711b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul _mesa_swap2((GLushort *) dstRow, srcWidth); 2712b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 2713f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2714f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2715f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2716f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2717f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2718f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 271949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2720114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_texstore_dudv8(TEXSTORE_PARAMS) 2721114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 2722114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const GLboolean littleEndian = _mesa_little_endian(); 27231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2724114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 27251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_DUDV8); 272622108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 2727114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT(ctx->Extensions.ATI_envmap_bumpmap); 2728114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT((srcFormat == GL_DU8DV8_ATI) || 2729114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger (srcFormat == GL_DUDV_ATI)); 2730114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT(baseInternalFormat == GL_DUDV_ATI); 2731114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2732114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!srcPacking->SwapBytes && srcType == GL_BYTE && 2733114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger littleEndian) { 2734114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* simple memcpy path */ 2735114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger memcpy_texture(ctx, dims, 27365253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 27375253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2738114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2739114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcAddr, srcPacking); 2740114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2741114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (srcType == GL_BYTE) { 2742114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLubyte dstmap[4]; 2743114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2744114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* dstmap - how to swizzle from RGBA to dst format: 2745114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger */ 2746114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (littleEndian) { 2747114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[0] = 0; 2748114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[1] = 3; 2749114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2750114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 2751114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[0] = 3; 2752114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[1] = 0; 2753114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2754114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[2] = ZERO; /* ? */ 2755114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[3] = ONE; /* ? */ 2756114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2757114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_swizzle_ubyte_image(ctx, dims, 2758114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_LUMINANCE_ALPHA, /* hack */ 2759114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_UNSIGNED_BYTE, /* hack */ 2760114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_LUMINANCE_ALPHA, /* hack */ 2761114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap, 2, 27625253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstXoffset, dstYoffset, dstZoffset, 27635253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2764114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, srcDepth, srcAddr, 2765114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcPacking); 2766114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2767114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 2768114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* general path - note this is defined for 2d textures only */ 2769114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const GLint components = _mesa_components_in_format(baseInternalFormat); 27708c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth, 27718c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcFormat, srcType); 2772114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLbyte *tempImage, *dst, *src; 2773114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLint row; 2774114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 277532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth 2776114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger * components * sizeof(GLbyte)); 2777114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!tempImage) 2778114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_FALSE; 2779114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2780114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2781114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, 2782114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcFormat, srcType, 2783114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 0, 0, 0); 2784114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2785114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst = tempImage; 2786114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (row = 0; row < srcHeight; row++) { 2787114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat, 2788114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst, srcFormat, srcType, src, 2789114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcPacking, 0); 2790114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst += srcWidth * components; 2791114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src += srcStride; 2792114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2793114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2794114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src = tempImage; 27955253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dst = (GLbyte *) dstSlices[0] 2796114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger + dstYoffset * dstRowStride 279722108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2798114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (row = 0; row < srcHeight; row++) { 279922108bb571808542b89677752d62d3901698265fBrian Paul memcpy(dst, src, srcWidth * texelBytes); 2800114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst += dstRowStride; 280122108bb571808542b89677752d62d3901698265fBrian Paul src += srcWidth * texelBytes; 2802114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 280332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2804114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2805114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_TRUE; 2806114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 2807f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 280884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 280984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 2810daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized 8-bit format. 281184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 281284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 2813daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm8(TEXSTORE_PARAMS) 281484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 281584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 281684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 281784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2818daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_A8 || 2819daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_L8 || 2820daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_I8 || 2821daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_R8); 282284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(texelBytes == 1); 282384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2824daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 2825daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 2826daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 2827daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_BYTE) { 2828daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 2829daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 28305253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 28315253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2832daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2833daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 2834daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2835daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 283684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 2837e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 283884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 283984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 284084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 284184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 2842bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2843bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 2844daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 284584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 284684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 284784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 284884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 28495253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLbyte *dstRow = (GLbyte *) dstSlices[dstZoffset + img] 285084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstYoffset * dstRowStride 285184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstXoffset * texelBytes; 285284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 285384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 2854daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow[col] = FLOAT_TO_BYTE_TEX(src[col]); 285584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 285684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 2857daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += srcWidth; 285884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 285984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 286084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 286184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 286284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 286384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 286484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 286584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 286684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 2867daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized two-channel 16-bit format. 286884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 286984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 2870daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm88(TEXSTORE_PARAMS) 287184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 2872daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLboolean littleEndian = _mesa_little_endian(); 287384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 287484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 287584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2876daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL88 || 2877daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_RG88_REV); 2878daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(texelBytes == 2); 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 littleEndian) { 2885daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 2886daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 28875253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 28885253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 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++) { 29065253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLbyte *dstRow = (GLbyte *) dstSlices[dstZoffset + img] 290784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstYoffset * dstRowStride 290884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstXoffset * texelBytes; 290984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 2910daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dst = dstRow; 291184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 2912daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = FLOAT_TO_BYTE_TEX(src[0]); 2913daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(src[1]); 2914daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 2; 2915daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 2; 291684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 291784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 291884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 291984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 292084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 292184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 292284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 292384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 292484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2925daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/* Texstore for signed R16, A16, L16, I16. */ 2926daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean 2927daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm16(TEXSTORE_PARAMS) 2928daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{ 2929daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLboolean littleEndian = _mesa_little_endian(); 2930daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2931daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2932daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2933daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_R16 || 2934daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_A16 || 2935daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_L16 || 2936daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_I16); 2937daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(texelBytes == 2); 2938daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2939daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 2940daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 2941daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 2942daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_SHORT && 2943daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák littleEndian) { 2944daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 2945daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 29465253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 29475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2948daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2949daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 2950daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2951daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 2952daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* general path */ 2953daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2954daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat, 2955daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseFormat, 2956daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, 2957daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcFormat, srcType, srcAddr, 2958daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcPacking, 2959daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ctx->_ImageTransferState); 2960daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 2961daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLint img, row, col; 2962daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!tempImage) 2963daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_FALSE; 2964daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (img = 0; img < srcDepth; img++) { 29655253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 2966daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák + dstYoffset * dstRowStride 2967daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák + dstXoffset * texelBytes; 2968daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (row = 0; row < srcHeight; row++) { 2969daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort *dstUS = (GLshort *) dstRow; 2970daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 2971daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLushort r; 2972daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2973daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(r, src[0]); 2974daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstUS[col] = r; 2975daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 1; 2976daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2977daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 2978daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2979daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2980daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák free((void *) tempImage); 2981daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2982daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_TRUE; 2983daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák} 2984daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2985daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/** 2986daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Do texstore for 2-channel, 16-bit/channel, signed normalized formats. 2987daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák */ 2988daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean 2989daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm1616(TEXSTORE_PARAMS) 2990daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{ 2991daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLboolean littleEndian = _mesa_little_endian(); 2992daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2993daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2994daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2995daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL1616 || 2996daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_GR1616); 2997daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(texelBytes == 4); 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, 30065253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 30075253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3008daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3009daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 3010daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3011daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 3012daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* general path */ 3013daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3014daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat, 3015daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseFormat, 3016daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, 3017daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcFormat, srcType, srcAddr, 3018daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcPacking, 3019daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ctx->_ImageTransferState); 3020daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 3021daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLint img, row, col; 3022daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!tempImage) 3023daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_FALSE; 3024daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (img = 0; img < srcDepth; img++) { 30255253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 3026daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák + dstYoffset * dstRowStride 3027daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák + dstXoffset * texelBytes; 3028daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (row = 0; row < srcHeight; row++) { 3029daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort *dst = (GLshort *) dstRow; 3030daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 3031daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLushort l, a; 3032daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 3033daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(l, src[0]); 3034daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(a, src[1]); 3035daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = l; 3036daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = a; 3037daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 2; 3038daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 2; 3039daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3040daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 3041daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3042daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3043daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák free((void *) tempImage); 3044daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 3045daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_TRUE; 3046daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák} 304784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 304884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 304984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBX8888. 305084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 305184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 305284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS) 305384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 305484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 305584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 305684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 305784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888); 305884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(texelBytes == 4); 305984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 306084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul { 306184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 3062e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 306384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 306484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 306584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 306684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 3067bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 3068bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 306984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLfloat *srcRow = tempImage; 307084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 307184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 307284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 307384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 30745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLbyte *dstRow = (GLbyte *) dstSlices[dstZoffset + img] 307584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstYoffset * dstRowStride 307684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul + dstXoffset * texelBytes; 307784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 3078daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dst = dstRow; 307984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 3080daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 3081daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 3082daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 30838778bf221e90e9b59caad02ab72a0a0edcfe2451Brian Paul dst[0] = 127; 3084daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcRow += 3; 3085daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 4; 308684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 308784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 308884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 308984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 309084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 309184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 309284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 309384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 309484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 309584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 309684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 3097c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger/** 309839de9251c4770fdcce3395643003aa626178446dBrian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or 309939de9251c4770fdcce3395643003aa626178446dBrian Paul * MESA_FORMAT_SIGNED_RGBA8888_REV 3100c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */ 310149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3102c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS) 3103c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger{ 3104c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger const GLboolean littleEndian = _mesa_little_endian(); 31051f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 31061f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3107c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 31081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 || 31091f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV); 311022108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 4); 3111c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 3112c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger if (!ctx->_ImageTransferState && 3113c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger !srcPacking->SwapBytes && 31141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888 && 3115c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat == GL_RGBA && 3116c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger ((srcFormat == GL_RGBA && srcType == GL_BYTE && !littleEndian) || 3117c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && littleEndian))) { 3118c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* simple memcpy path */ 3119c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger memcpy_texture(ctx, dims, 31205253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 31215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3122c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3123c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcAddr, srcPacking); 3124c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 3125c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger else if (!ctx->_ImageTransferState && 3126bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger !srcPacking->SwapBytes && 31271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV && 3128bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger baseInternalFormat == GL_RGBA && 3129bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger ((srcFormat == GL_RGBA && srcType == GL_BYTE && littleEndian) || 3130bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && !littleEndian))) { 3131bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger /* simple memcpy path */ 3132bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger memcpy_texture(ctx, dims, 31335253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 31345253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3135bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3136bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcAddr, srcPacking); 3137bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 3138c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger else { 3139c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* general path */ 3140e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3141c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat, 314222108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 3143c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, 3144c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcFormat, srcType, srcAddr, 3145bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 3146bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 3147c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger const GLfloat *srcRow = tempImage; 3148c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger GLint img, row, col; 3149c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger if (!tempImage) 3150c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger return GL_FALSE; 3151c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (img = 0; img < srcDepth; img++) { 31525253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLbyte *dstRow = (GLbyte *) dstSlices[dstZoffset + img] 3153c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger + dstYoffset * dstRowStride 315422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 3155c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (row = 0; row < srcHeight; row++) { 3156daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dst = dstRow; 31571f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) { 3158c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (col = 0; col < srcWidth; col++) { 3159daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 3160daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 3161daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 3162daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]); 3163c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcRow += 4; 3164daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 4; 3165c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 3166c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 3167bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger else { 3168bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger for (col = 0; col < srcWidth; col++) { 3169daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 3170daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 3171daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[2] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 3172daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[3] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]); 3173bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcRow += 4; 3174daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 4; 3175bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 3176bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 3177c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstRow += dstRowStride; 3178c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 3179c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 318032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 3181c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 3182c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger return GL_TRUE; 3183c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger} 3184f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 318584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 3186184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul/** 3187184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul * Store a combined depth/stencil texture image. 3188184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul */ 318949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3190b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z24_s8(TEXSTORE_PARAMS) 3191184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul{ 319292098438784887fd6005918794476cfbbeac5035Karl Schultz const GLuint depthScale = 0xffffff; 3193c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz const GLint srcRowStride 3194b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 3195c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz GLint img, row; 319625cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian 31971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_Z24_S8); 3198e41a91cea764cc1ba95906251cd907d837225293Marek Olšák ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || 3199e41a91cea764cc1ba95906251cd907d837225293Marek Olšák srcFormat == GL_DEPTH_COMPONENT || 3200e41a91cea764cc1ba95906251cd907d837225293Marek Olšák srcFormat == GL_STENCIL_INDEX); 3201c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT); 3202184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 3203e41a91cea764cc1ba95906251cd907d837225293Marek Olšák if (srcFormat == GL_DEPTH_STENCIL && ctx->Pixel.DepthScale == 1.0f && 3204966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 3205184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul !srcPacking->SwapBytes) { 3206ef8653a83800bc4b8e116e03ad52604097224378Brian Paul /* simple path */ 3207184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul memcpy_texture(ctx, dims, 32085253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 32095253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3210184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3211184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul srcAddr, srcPacking); 321239de9251c4770fdcce3395643003aa626178446dBrian Paul } 3213e41a91cea764cc1ba95906251cd907d837225293Marek Olšák else if (srcFormat == GL_DEPTH_COMPONENT || 3214e41a91cea764cc1ba95906251cd907d837225293Marek Olšák srcFormat == GL_STENCIL_INDEX) { 3215c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* In case we only upload depth we need to preserve the stencil */ 3216ef8653a83800bc4b8e116e03ad52604097224378Brian Paul for (img = 0; img < srcDepth; img++) { 32175253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLuint *dstRow = (GLuint *) (dstSlices[dstZoffset + img] 32185253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul + dstYoffset * dstRowStride 32195253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul + dstXoffset * 4); 3220b786db06540472beda9cedd18937d6e12855b3ebBrian Paul const GLubyte *src 3221b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 3222c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcWidth, srcHeight, 3223c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcFormat, srcType, 3224c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie img, 0, 0); 3225ef8653a83800bc4b8e116e03ad52604097224378Brian Paul for (row = 0; row < srcHeight; row++) { 3226c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLuint depth[MAX_WIDTH]; 3227c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLubyte stencil[MAX_WIDTH]; 3228ef8653a83800bc4b8e116e03ad52604097224378Brian Paul GLint i; 3229c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; 3230c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3231c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */ 3232c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil = GL_TRUE; 323339de9251c4770fdcce3395643003aa626178446dBrian Paul } 323439de9251c4770fdcce3395643003aa626178446dBrian Paul else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */ 3235c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepdepth = GL_TRUE; 3236c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 3237c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3238c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepdepth == GL_FALSE) 3239c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* the 24 depth bits will be in the low position: */ 3240c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_depth_span(ctx, srcWidth, 3241c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_INT, /* dst type */ 3242c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil ? depth : dstRow, /* dst addr */ 3243c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie depthScale, 3244c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking); 3245c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3246c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil == GL_FALSE) 3247c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* get the 8-bit stencil values */ 3248c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_stencil_span(ctx, srcWidth, 3249c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_BYTE, /* dst type */ 3250c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie stencil, /* dst addr */ 3251c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking, 3252c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie ctx->_ImageTransferState); 3253c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3254c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (i = 0; i < srcWidth; i++) { 3255c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil) 3256c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF); 3257c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie else 3258c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF); 3259c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 3260ef8653a83800bc4b8e116e03ad52604097224378Brian Paul 3261ef8653a83800bc4b8e116e03ad52604097224378Brian Paul src += srcRowStride; 3262b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride / sizeof(GLuint); 3263ef8653a83800bc4b8e116e03ad52604097224378Brian Paul } 3264ef8653a83800bc4b8e116e03ad52604097224378Brian Paul } 3265184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul } 3266184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul return GL_TRUE; 3267184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul} 3268184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 3269184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 3270a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz/** 3271a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz * Store a combined depth/stencil texture image. 3272a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz */ 327349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3274a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz_mesa_texstore_s8_z24(TEXSTORE_PARAMS) 3275a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz{ 3276a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz const GLuint depthScale = 0xffffff; 3277a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz const GLint srcRowStride 3278b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 3279a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz GLint img, row; 3280a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz 32811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_S8_Z24); 328239de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || 328339de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat == GL_DEPTH_COMPONENT || 328439de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat == GL_STENCIL_INDEX); 328539de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || 328639de9251c4770fdcce3395643003aa626178446dBrian Paul srcType == GL_UNSIGNED_INT_24_8_EXT); 3287c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca 3288c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (img = 0; img < srcDepth; img++) { 32895253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLuint *dstRow = (GLuint *) (dstSlices[dstZoffset + img] 32905253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul + dstYoffset * dstRowStride 32915253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul + dstXoffset * 4); 3292b786db06540472beda9cedd18937d6e12855b3ebBrian Paul const GLubyte *src 3293b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 3294c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcWidth, srcHeight, 3295c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcFormat, srcType, 3296c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie img, 0, 0); 3297c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (row = 0; row < srcHeight; row++) { 3298c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLuint depth[MAX_WIDTH]; 3299c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLubyte stencil[MAX_WIDTH]; 3300c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLint i; 3301c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; 3302c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3303c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */ 3304c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil = GL_TRUE; 330539de9251c4770fdcce3395643003aa626178446dBrian Paul } 330639de9251c4770fdcce3395643003aa626178446dBrian Paul else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */ 3307c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepdepth = GL_TRUE; 3308c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 3309666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz 3310c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepdepth == GL_FALSE) 3311c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* the 24 depth bits will be in the low position: */ 3312c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_depth_span(ctx, srcWidth, 3313c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_INT, /* dst type */ 3314c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil ? depth : dstRow, /* dst addr */ 3315c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie depthScale, 3316c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking); 3317c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3318c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil == GL_FALSE) 3319c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* get the 8-bit stencil values */ 3320c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_stencil_span(ctx, srcWidth, 3321c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_BYTE, /* dst type */ 3322c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie stencil, /* dst addr */ 3323c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking, 3324c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie ctx->_ImageTransferState); 3325c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3326c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* merge stencil values into depth values */ 3327c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (i = 0; i < srcWidth; i++) { 3328c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil) 3329c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000); 3330c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie else 3331c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24); 3332666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz 3333c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 3334c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie src += srcRowStride; 3335c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow += dstRowStride / sizeof(GLuint); 3336a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz } 3337a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz } 3338a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz return GL_TRUE; 3339a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz} 3340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 334139de9251c4770fdcce3395643003aa626178446dBrian Paul 334239de9251c4770fdcce3395643003aa626178446dBrian Paul/** 334339de9251c4770fdcce3395643003aa626178446dBrian Paul * Store simple 8-bit/value stencil texture data. 334439de9251c4770fdcce3395643003aa626178446dBrian Paul */ 334539de9251c4770fdcce3395643003aa626178446dBrian Paulstatic GLboolean 334639de9251c4770fdcce3395643003aa626178446dBrian Paul_mesa_texstore_s8(TEXSTORE_PARAMS) 334739de9251c4770fdcce3395643003aa626178446dBrian Paul{ 334839de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(dstFormat == MESA_FORMAT_S8); 334939de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat == GL_STENCIL_INDEX); 335039de9251c4770fdcce3395643003aa626178446dBrian Paul 335139de9251c4770fdcce3395643003aa626178446dBrian Paul if (!ctx->_ImageTransferState && 335239de9251c4770fdcce3395643003aa626178446dBrian Paul !srcPacking->SwapBytes && 335339de9251c4770fdcce3395643003aa626178446dBrian Paul baseInternalFormat == srcFormat && 335439de9251c4770fdcce3395643003aa626178446dBrian Paul srcType == GL_UNSIGNED_BYTE) { 335539de9251c4770fdcce3395643003aa626178446dBrian Paul /* simple memcpy path */ 335639de9251c4770fdcce3395643003aa626178446dBrian Paul memcpy_texture(ctx, dims, 33575253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 33585253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 335939de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 336039de9251c4770fdcce3395643003aa626178446dBrian Paul srcAddr, srcPacking); 336139de9251c4770fdcce3395643003aa626178446dBrian Paul } 336239de9251c4770fdcce3395643003aa626178446dBrian Paul else { 336339de9251c4770fdcce3395643003aa626178446dBrian Paul const GLint srcRowStride 3364b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 336539de9251c4770fdcce3395643003aa626178446dBrian Paul GLint img, row; 336639de9251c4770fdcce3395643003aa626178446dBrian Paul 336739de9251c4770fdcce3395643003aa626178446dBrian Paul for (img = 0; img < srcDepth; img++) { 33685253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 336939de9251c4770fdcce3395643003aa626178446dBrian Paul + dstYoffset * dstRowStride / sizeof(GLuint) 337039de9251c4770fdcce3395643003aa626178446dBrian Paul + dstXoffset; 3371b786db06540472beda9cedd18937d6e12855b3ebBrian Paul const GLubyte *src 3372b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 337339de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, 337439de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat, srcType, 337539de9251c4770fdcce3395643003aa626178446dBrian Paul img, 0, 0); 337639de9251c4770fdcce3395643003aa626178446dBrian Paul for (row = 0; row < srcHeight; row++) { 337739de9251c4770fdcce3395643003aa626178446dBrian Paul GLubyte stencil[MAX_WIDTH]; 337839de9251c4770fdcce3395643003aa626178446dBrian Paul GLint i; 337939de9251c4770fdcce3395643003aa626178446dBrian Paul 338039de9251c4770fdcce3395643003aa626178446dBrian Paul /* get the 8-bit stencil values */ 338139de9251c4770fdcce3395643003aa626178446dBrian Paul _mesa_unpack_stencil_span(ctx, srcWidth, 338239de9251c4770fdcce3395643003aa626178446dBrian Paul GL_UNSIGNED_BYTE, /* dst type */ 338339de9251c4770fdcce3395643003aa626178446dBrian Paul stencil, /* dst addr */ 338439de9251c4770fdcce3395643003aa626178446dBrian Paul srcType, src, srcPacking, 338539de9251c4770fdcce3395643003aa626178446dBrian Paul ctx->_ImageTransferState); 338639de9251c4770fdcce3395643003aa626178446dBrian Paul /* merge stencil values into depth values */ 338739de9251c4770fdcce3395643003aa626178446dBrian Paul for (i = 0; i < srcWidth; i++) 338839de9251c4770fdcce3395643003aa626178446dBrian Paul dstRow[i] = stencil[i]; 338939de9251c4770fdcce3395643003aa626178446dBrian Paul 339039de9251c4770fdcce3395643003aa626178446dBrian Paul src += srcRowStride; 339139de9251c4770fdcce3395643003aa626178446dBrian Paul dstRow += dstRowStride / sizeof(GLubyte); 339239de9251c4770fdcce3395643003aa626178446dBrian Paul } 339339de9251c4770fdcce3395643003aa626178446dBrian Paul } 339439de9251c4770fdcce3395643003aa626178446dBrian Paul 339539de9251c4770fdcce3395643003aa626178446dBrian Paul } 339639de9251c4770fdcce3395643003aa626178446dBrian Paul 339739de9251c4770fdcce3395643003aa626178446dBrian Paul return GL_TRUE; 339839de9251c4770fdcce3395643003aa626178446dBrian Paul} 339939de9251c4770fdcce3395643003aa626178446dBrian Paul 340039de9251c4770fdcce3395643003aa626178446dBrian Paul 3401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 3402f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Store an image in any of the formats: 3403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_rgba_float32 3404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_rgb_float32 3405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_alpha_float32 3406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_luminance_float32 3407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_luminance_alpha_float32 3408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_intensity_float32 3409f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 341049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3411b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float32(TEXSTORE_PARAMS) 3412f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 34131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 34141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 341522108bb571808542b89677752d62d3901698265fBrian Paul const GLint components = _mesa_components_in_format(baseFormat); 3416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 34171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 || 34181f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB_FLOAT32 || 34191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ALPHA_FLOAT32 || 34201f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 || 34211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 || 34220ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_INTENSITY_FLOAT32 || 34230ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_R_FLOAT32 || 34240ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_RG_FLOAT32); 3425f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3426f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB || 3427f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_ALPHA || 3428f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE || 3429f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 34300ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_INTENSITY || 34310ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RED || 34320ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RG); 343322108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == components * sizeof(GLfloat)); 3434f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3435f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 3436f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 3437f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 34389e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák baseInternalFormat == baseFormat && 3439f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_FLOAT) { 3440f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 344117bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 34425253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 34435253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3444f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3445f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 3446f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3447f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 3448f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 3449e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3450f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 345122108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 3452f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 3453f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 3454bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 3455bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 3456b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLfloat *srcRow = tempImage; 34579c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul GLint bytesPerRow; 3458f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 3459f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 3460f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 34619c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul bytesPerRow = srcWidth * components * sizeof(GLfloat); 3462f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 34635253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 3464b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 346522108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 3466f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 3467c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy(dstRow, srcRow, bytesPerRow); 3468b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 3469b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcRow += srcWidth * components; 3470f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3471f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3472f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 347332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 3474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3475f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 3476f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 3477f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3478c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3479f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3480f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 3481f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * As above, but store 16-bit floats. 3482f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 348349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3484b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float16(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_FLOAT16 || 34911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB_FLOAT16 || 34921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ALPHA_FLOAT16 || 34931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 || 34941f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 || 34950ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_INTENSITY_FLOAT16 || 34960ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_R_FLOAT16 || 34970ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_RG_FLOAT16); 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(GLhalfARB)); 3507f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3508f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 3509f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 3510f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 35119e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák baseInternalFormat == baseFormat && 3512f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_HALF_FLOAT_ARB) { 3513f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 351417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 35155253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 35165253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3517f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3518f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 3519f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3520f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 3521f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 3522e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3523f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 352422108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 3525f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 3526f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 3527bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 3528bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 3529f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLfloat *src = tempImage; 3530f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 3531f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 3532f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 3533f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 35345253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 3535b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 353622108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 3537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 3538f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLhalfARB *dstTexel = (GLhalfARB *) dstRow; 3539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i; 3540f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < srcWidth * components; i++) { 3541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstTexel[i] = _mesa_float_to_half(src[i]); 3542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 3544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += 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 3553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3554abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int8 */ 3555abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3556abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int8(TEXSTORE_PARAMS) 3557abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3558abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3559abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3560abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3561abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 356238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_INT8 || 356338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_INT8 || 356438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_INT8 || 356538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_INT8 || 356638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_INT8 || 356738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_INT8 || 356838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_INT8 || 356938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT8); 3570abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3571abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3572abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3573abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3574abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3575abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3576abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLbyte)); 3577abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3578bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3579bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3580bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3581bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3582abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3583abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_BYTE) { 3584abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3585abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 35865253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 35875253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3588abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3589abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3590abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3591abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3592abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3593e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3594abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat, 3595abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseFormat, 3596abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, 3597abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcFormat, srcType, srcAddr, 3598bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 0x0); 3599abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *src = tempImage; 3600abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3601abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3602abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3603abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 36045253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 3605abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3606abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3607abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3608abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLbyte *dstTexel = (GLbyte *) dstRow; 3609abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3610abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3611abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLbyte) src[i]; 3612abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3613abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3614abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3615abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3616abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3617abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3618abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3619abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3620abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3621abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3622abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3623abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3624abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int16 */ 3625abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3626abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int16(TEXSTORE_PARAMS) 3627abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3628abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3629abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3630abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3631abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 363238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_INT16 || 363338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_INT16 || 363438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_INT16 || 363538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_INT16 || 363638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_INT16 || 363738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_INT16 || 363838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_INT16 || 363938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT16); 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(GLshort)); 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 && 36539fc7fa0a4cbe9dc8faa124744f623491fa754bd7Brian Paul srcType == GL_SHORT) { 3654abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3655abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 36565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 36575253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3658abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3659abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3660abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3661abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3662abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3663e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3664abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat, 3665abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseFormat, 3666abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, 3667abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcFormat, srcType, srcAddr, 3668bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 0x0); 3669abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *src = tempImage; 3670abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3671abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3672abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3673abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 36745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 3675abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3676abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3677abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3678abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLshort *dstTexel = (GLshort *) dstRow; 3679abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3680abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3681abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLint) src[i]; 3682abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3683abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3684abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3685abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3686abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3687abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3688abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3689abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3690abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3691abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3692abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3693abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3694abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int32 */ 3695abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3696abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int32(TEXSTORE_PARAMS) 3697abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3698abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3699abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3700abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3701abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 370238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_INT32 || 370338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_INT32 || 370438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_INT32 || 370538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_INT32 || 370638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_INT32 || 370738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_INT32 || 370838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_INT32 || 370938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT32); 3710abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3711abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3712abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3713abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3714abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3715abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3716abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLint)); 3717abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3718bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3719bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3720bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3721bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3722abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3723abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_INT) { 3724abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3725abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 37265253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 37275253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3728abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3729abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3730abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3731abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3732abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3733e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3734abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat, 3735abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseFormat, 3736abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, 3737abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcFormat, srcType, srcAddr, 3738bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 0x0); 3739abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLfloat *src = tempImage; 3740abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3741abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3742abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3743abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 37445253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 3745abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3746abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3747abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3748abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint *dstTexel = (GLint *) dstRow; 3749abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3750abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3751abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLint) src[i]; 3752abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3753abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3754abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3755abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3756abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3757abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3758abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3759abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3760abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3761abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3762abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3763abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3764abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int8 */ 3765abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3766abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS) 3767abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3768abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3769abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3770abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3771abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 377238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_UINT8 || 377338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_UINT8 || 377438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_UINT8 || 377538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_UINT8 || 377638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_UINT8 || 377738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_UINT8 || 377838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_UINT8 || 377938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT8); 3780abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3781abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3782abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3783abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3784abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3785abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3786abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLubyte)); 3787abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3788bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3789bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3790bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3791bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3792abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3793abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_BYTE) { 3794abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3795abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 37965253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 37975253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3798abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3799abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3800abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3801abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3802abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3803dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *tempImage = 3804dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3805dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, srcDepth, 3806dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, srcAddr, srcPacking); 3807dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *src = tempImage; 3808abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3809abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3810abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3811abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 38125253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 3813abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3814abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3815abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3816abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstTexel = (GLubyte *) dstRow; 3817abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3818abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3819dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dstTexel[i] = (GLubyte) CLAMP(src[i], 0, 0xff); 3820abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3821abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3822abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3823abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3824abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3825abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3826abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3827abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3828abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3829abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3830abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3831abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3832abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int16 */ 3833abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3834abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS) 3835abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3836abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3837abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3838abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3839abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 384038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_UINT16 || 384138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_UINT16 || 384238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_UINT16 || 384338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_UINT16 || 384438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_UINT16 || 384538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_UINT16 || 384638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_UINT16 || 384738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT16); 3848abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3849abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3850abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3851abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3852abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3853abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3854abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLushort)); 3855abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3856bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3857bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3858bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3859bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3860abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3861abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_SHORT) { 3862abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3863abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 38645253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 38655253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3866abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3867abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3868abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3869abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3870abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3871dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *tempImage = 3872dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3873dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, srcDepth, 3874dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, srcAddr, srcPacking); 3875dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *src = tempImage; 3876abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3877abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3878abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3879abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 38805253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 3881abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3882abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3883abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3884abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLushort *dstTexel = (GLushort *) dstRow; 3885abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3886abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3887dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dstTexel[i] = (GLushort) CLAMP(src[i], 0, 0xffff); 3888abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3889abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3890abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3891abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3892abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3893abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3894abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3895abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3896abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3897abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3898abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3899abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3900abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int32 */ 3901abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3902abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS) 3903abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3904abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 3905abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3906abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3907abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 390838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_UINT32 || 390938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_UINT32 || 391038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_UINT32 || 391138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_UINT32 || 391238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_UINT32 || 391338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_UINT32 || 391438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_UINT32 || 391538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT32); 3916abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3917abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3918abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3919abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3920abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3921abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 3922abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(texelBytes == components * sizeof(GLuint)); 3923abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3924bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3925bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3926bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3927bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3928abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3929abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_INT) { 3930abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3931abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 39325253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 39335253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3934abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3935abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3936abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3937abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3938abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3939dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *tempImage = 3940dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3941dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, srcDepth, 3942dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, srcAddr, srcPacking); 3943dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *src = tempImage; 3944abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3945abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3946abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3947abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 39485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 3949abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstYoffset * dstRowStride 3950abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul + dstXoffset * texelBytes; 3951abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3952abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLuint *dstTexel = (GLuint *) dstRow; 3953abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3954abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3955dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dstTexel[i] = src[i]; 3956abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3957abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3958abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3959abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3960abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3961abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3962abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3963abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3964abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3965abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3966abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3967abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3968abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3969abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 39708d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#if FEATURE_EXT_texture_sRGB 397149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 39728d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgb8(TEXSTORE_PARAMS) 39738d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 39741f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 397546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 397646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 39771f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SRGB8); 397846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 397946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal rgb texstore code */ 39801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_RGB888; 398146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 39820f91e4461fb3a7410c948acde270d97caa851ed6Brian Paul k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat, 39835253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 398439de9251c4770fdcce3395643003aa626178446dBrian Paul dstXoffset, dstYoffset, dstZoffset, 39855253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 398639de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, srcDepth, 398739de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat, srcType, 398839de9251c4770fdcce3395643003aa626178446dBrian Paul srcAddr, srcPacking); 398946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 39908d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 39918d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 399254e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 399349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 39948d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgba8(TEXSTORE_PARAMS) 39958d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 39961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 399746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 399846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 39991f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SRGBA8); 400046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 400146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal rgba texstore code */ 40021f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_RGBA8888; 400346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat, 40045253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 400546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul dstXoffset, dstYoffset, dstZoffset, 40065253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 400746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcWidth, srcHeight, srcDepth, 400846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcFormat, srcType, 400946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcAddr, srcPacking); 401046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 40118d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 40128d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 401354e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 401449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 40155bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger_mesa_texstore_sargb8(TEXSTORE_PARAMS) 40165bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{ 40171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 40185bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger GLboolean k; 40195bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 40201f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SARGB8); 40215bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 40225bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger /* reuse normal rgba texstore code */ 40231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_ARGB8888; 40245bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 40255bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat, 40265253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 40275bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger dstXoffset, dstYoffset, dstZoffset, 40285253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 40295bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcWidth, srcHeight, srcDepth, 40305bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcFormat, srcType, 40315bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcAddr, srcPacking); 40325bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger return k; 40335bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger} 40345bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 40355bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 403649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 40378d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sl8(TEXSTORE_PARAMS) 40388d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 40391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 404046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 404146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 40421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SL8); 404346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 40441f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_L8; 404546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 404654e15d65858c1d1eeea7291059766686cf2e1671Brian Paul /* _mesa_textore_a8 handles luminance8 too */ 4047bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák k = _mesa_texstore_unorm8(ctx, dims, baseInternalFormat, 40485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 40495253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstXoffset, dstYoffset, dstZoffset, 40505253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 40515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul srcWidth, srcHeight, srcDepth, 40525253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul srcFormat, srcType, 40535253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul srcAddr, srcPacking); 405446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 40558d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 40568d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 405754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 405849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 40598d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sla8(TEXSTORE_PARAMS) 40608d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 40611f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 406246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 406346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 40641f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SLA8); 406546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 406646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal luminance/alpha texstore code */ 40671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_AL88; 406846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 40695d1387b2da3626326410804026f8b92f1a121fdcIan Romanick k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat, 40705253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 40715d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstXoffset, dstYoffset, dstZoffset, 40725253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 40735d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, 40745d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcFormat, srcType, 40755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcAddr, srcPacking); 407646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 40778d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 40788d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 40799927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#else 40809927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu 40819927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu/* these are used only in texstore_funcs[] below */ 40829927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgb8 NULL 40839927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgba8 NULL 40849927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sargb8 NULL 40859927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sl8 NULL 40869927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sla8 NULL 40879927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu 40888d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#endif /* FEATURE_EXT_texture_sRGB */ 40898d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 40909d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšákstatic GLboolean 40919d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák_mesa_texstore_rgb9_e5(TEXSTORE_PARAMS) 40929d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák{ 40939d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 40949d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák 40959d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák ASSERT(dstFormat == MESA_FORMAT_RGB9_E5_FLOAT); 40969d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák ASSERT(baseInternalFormat == GL_RGB); 40979d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák 40989d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák if (!ctx->_ImageTransferState && 40999d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák !srcPacking->SwapBytes && 41009d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcFormat == GL_RGB && 41019d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcType == GL_UNSIGNED_INT_5_9_9_9_REV) { 41029d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák /* simple memcpy path */ 41039d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák memcpy_texture(ctx, dims, 41045253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 41055253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 41069d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 41079d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcAddr, srcPacking); 41089d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41099d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák else { 41109d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák /* general path */ 41119d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 41129d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák baseInternalFormat, 41139d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák baseFormat, 41149d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcWidth, srcHeight, srcDepth, 41159d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcFormat, srcType, srcAddr, 41169d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcPacking, 41179d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák ctx->_ImageTransferState); 41189d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLfloat *srcRow = tempImage; 41199d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLint img, row, col; 41209d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák if (!tempImage) 41219d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák return GL_FALSE; 41229d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (img = 0; img < srcDepth; img++) { 41235253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 41249d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák + dstYoffset * dstRowStride 41259d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák + dstXoffset * 4; 41269d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (row = 0; row < srcHeight; row++) { 41279d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLuint *dstUI = (GLuint*)dstRow; 41289d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (col = 0; col < srcWidth; col++) { 41299d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák dstUI[col] = float3_to_rgb9e5(&srcRow[col * 3]); 41309d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41319d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák dstRow += dstRowStride; 41329d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcRow += srcWidth * 3; 41339d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41349d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41359d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák 41369d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák free((void *) tempImage); 41379d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 41389d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák return GL_TRUE; 41399d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák} 4140f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 4141631d23daa91c569bf268a2191bd466df73a64263Marek Olšákstatic GLboolean 4142631d23daa91c569bf268a2191bd466df73a64263Marek Olšák_mesa_texstore_r11_g11_b10f(TEXSTORE_PARAMS) 4143631d23daa91c569bf268a2191bd466df73a64263Marek Olšák{ 4144631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 4145631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 4146631d23daa91c569bf268a2191bd466df73a64263Marek Olšák ASSERT(dstFormat == MESA_FORMAT_R11_G11_B10_FLOAT); 4147631d23daa91c569bf268a2191bd466df73a64263Marek Olšák ASSERT(baseInternalFormat == GL_RGB); 4148631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 4149631d23daa91c569bf268a2191bd466df73a64263Marek Olšák if (!ctx->_ImageTransferState && 4150631d23daa91c569bf268a2191bd466df73a64263Marek Olšák !srcPacking->SwapBytes && 4151631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcFormat == GL_RGB && 4152631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcType == GL_UNSIGNED_INT_10F_11F_11F_REV) { 4153631d23daa91c569bf268a2191bd466df73a64263Marek Olšák /* simple memcpy path */ 4154631d23daa91c569bf268a2191bd466df73a64263Marek Olšák memcpy_texture(ctx, dims, 41555253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 41565253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 4157631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 4158631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcAddr, srcPacking); 4159631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4160631d23daa91c569bf268a2191bd466df73a64263Marek Olšák else { 4161631d23daa91c569bf268a2191bd466df73a64263Marek Olšák /* general path */ 4162631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 4163631d23daa91c569bf268a2191bd466df73a64263Marek Olšák baseInternalFormat, 4164631d23daa91c569bf268a2191bd466df73a64263Marek Olšák baseFormat, 4165631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcWidth, srcHeight, srcDepth, 4166631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcFormat, srcType, srcAddr, 4167631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcPacking, 4168631d23daa91c569bf268a2191bd466df73a64263Marek Olšák ctx->_ImageTransferState); 4169631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLfloat *srcRow = tempImage; 4170631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLint img, row, col; 4171631d23daa91c569bf268a2191bd466df73a64263Marek Olšák if (!tempImage) 4172631d23daa91c569bf268a2191bd466df73a64263Marek Olšák return GL_FALSE; 4173631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (img = 0; img < srcDepth; img++) { 41745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte *dstRow = dstSlices[dstZoffset + img] 4175631d23daa91c569bf268a2191bd466df73a64263Marek Olšák + dstYoffset * dstRowStride 4176631d23daa91c569bf268a2191bd466df73a64263Marek Olšák + dstXoffset * 4; 4177631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (row = 0; row < srcHeight; row++) { 4178631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLuint *dstUI = (GLuint*)dstRow; 4179631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (col = 0; col < srcWidth; col++) { 4180631d23daa91c569bf268a2191bd466df73a64263Marek Olšák dstUI[col] = float3_to_r11g11b10f(&srcRow[col * 3]); 4181631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4182631d23daa91c569bf268a2191bd466df73a64263Marek Olšák dstRow += dstRowStride; 4183631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcRow += srcWidth * 3; 4184631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4185631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4186631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 4187631d23daa91c569bf268a2191bd466df73a64263Marek Olšák free((void *) tempImage); 4188631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 4189631d23daa91c569bf268a2191bd466df73a64263Marek Olšák return GL_TRUE; 4190631d23daa91c569bf268a2191bd466df73a64263Marek Olšák} 4191631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 4192485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 4193b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšákstatic GLboolean 4194b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák_mesa_texstore_z32f_x24s8(TEXSTORE_PARAMS) 4195b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák{ 4196b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ASSERT(dstFormat == MESA_FORMAT_Z32_FLOAT_X24S8); 4197b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ASSERT(srcFormat == GL_DEPTH_STENCIL || 4198b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat == GL_DEPTH_COMPONENT || 4199b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat == GL_STENCIL_INDEX); 4200b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ASSERT(srcFormat != GL_DEPTH_STENCIL || 4201b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 4202b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 4203b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák if (srcFormat == GL_DEPTH_STENCIL && 4204b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ctx->Pixel.DepthScale == 1.0f && 4205b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ctx->Pixel.DepthBias == 0.0f && 4206b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák !srcPacking->SwapBytes) { 4207b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák /* simple path */ 4208b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák memcpy_texture(ctx, dims, 42095253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 42105253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 4211b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 4212b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcAddr, srcPacking); 4213b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 4214b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák else if (srcFormat == GL_DEPTH_COMPONENT || 4215b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat == GL_STENCIL_INDEX) { 4216b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák GLint img, row; 4217b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák const GLint srcRowStride 4218b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType) 4219b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák / sizeof(uint64_t); 4220b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 4221b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák /* In case we only upload depth we need to preserve the stencil */ 4222b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák for (img = 0; img < srcDepth; img++) { 42235253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul uint64_t *dstRow = (uint64_t *) (dstSlices[dstZoffset + img] 42245253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul + dstYoffset * dstRowStride 42255253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul + dstXoffset * 8); 4226b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák const uint64_t *src 4227b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák = (const uint64_t *) _mesa_image_address(dims, srcPacking, srcAddr, 4228b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcWidth, srcHeight, 4229b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat, srcType, 4230b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák img, 0, 0); 4231b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák for (row = 0; row < srcHeight; row++) { 4232b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák /* The unpack functions with: 4233b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák * dstType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV 4234b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák * only write their own dword, so the other dword (stencil 4235b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák * or depth) is preserved. */ 4236b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák if (srcFormat != GL_STENCIL_INDEX) 4237b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák _mesa_unpack_depth_span(ctx, srcWidth, 4238b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */ 4239b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstRow, /* dst addr */ 4240b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 1.0f, srcType, src, srcPacking); 4241b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 4242b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák if (srcFormat != GL_DEPTH_COMPONENT) 4243b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák _mesa_unpack_stencil_span(ctx, srcWidth, 4244b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */ 4245b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstRow, /* dst addr */ 4246b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcType, src, srcPacking, 4247b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ctx->_ImageTransferState); 4248b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 4249b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák src += srcRowStride; 4250b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstRow += dstRowStride / sizeof(uint64_t); 4251b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 4252b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 4253b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 4254b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák return GL_TRUE; 4255b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák} 4256b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 4257920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wustatic GLboolean 4258f449be660e70aac2aefd2ce84581e137de25520bDave Airlie_mesa_texstore_argb2101010_uint(TEXSTORE_PARAMS) 4259f449be660e70aac2aefd2ce84581e137de25520bDave Airlie{ 4260f449be660e70aac2aefd2ce84581e137de25520bDave Airlie const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 4261f449be660e70aac2aefd2ce84581e137de25520bDave Airlie const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 4262f449be660e70aac2aefd2ce84581e137de25520bDave Airlie 4263f449be660e70aac2aefd2ce84581e137de25520bDave Airlie ASSERT(dstFormat == MESA_FORMAT_ARGB2101010_UINT); 4264f449be660e70aac2aefd2ce84581e137de25520bDave Airlie ASSERT(texelBytes == 4); 4265f449be660e70aac2aefd2ce84581e137de25520bDave Airlie 4266f449be660e70aac2aefd2ce84581e137de25520bDave Airlie if (!srcPacking->SwapBytes && 4267f449be660e70aac2aefd2ce84581e137de25520bDave Airlie dstFormat == MESA_FORMAT_ARGB2101010_UINT && 4268f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcFormat == GL_BGRA_INTEGER_EXT && 4269f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcType == GL_UNSIGNED_INT_2_10_10_10_REV && 4270f449be660e70aac2aefd2ce84581e137de25520bDave Airlie baseInternalFormat == GL_RGBA) { 4271f449be660e70aac2aefd2ce84581e137de25520bDave Airlie /* simple memcpy path */ 4272f449be660e70aac2aefd2ce84581e137de25520bDave Airlie memcpy_texture(ctx, dims, 4273f449be660e70aac2aefd2ce84581e137de25520bDave Airlie dstFormat, dstXoffset, dstYoffset, dstZoffset, 4274f449be660e70aac2aefd2ce84581e137de25520bDave Airlie dstRowStride, dstSlices, 4275f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcWidth, srcHeight, srcDepth, srcFormat, srcType, 4276f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcAddr, srcPacking); 4277f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 4278f449be660e70aac2aefd2ce84581e137de25520bDave Airlie else { 4279f449be660e70aac2aefd2ce84581e137de25520bDave Airlie /* general path */ 4280f449be660e70aac2aefd2ce84581e137de25520bDave Airlie const GLuint *tempImage = make_temp_uint_image(ctx, dims, 4281f449be660e70aac2aefd2ce84581e137de25520bDave Airlie baseInternalFormat, 4282f449be660e70aac2aefd2ce84581e137de25520bDave Airlie baseFormat, 4283f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcWidth, srcHeight, 4284f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcDepth, srcFormat, 4285f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcType, srcAddr, 4286f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcPacking); 4287f449be660e70aac2aefd2ce84581e137de25520bDave Airlie const GLuint *src = tempImage; 4288f449be660e70aac2aefd2ce84581e137de25520bDave Airlie GLint img, row, col; 4289f449be660e70aac2aefd2ce84581e137de25520bDave Airlie if (!tempImage) 4290f449be660e70aac2aefd2ce84581e137de25520bDave Airlie return GL_FALSE; 4291f449be660e70aac2aefd2ce84581e137de25520bDave Airlie for (img = 0; img < srcDepth; img++) { 4292f449be660e70aac2aefd2ce84581e137de25520bDave Airlie GLubyte *dstRow = dstSlices[dstZoffset + img] 4293f449be660e70aac2aefd2ce84581e137de25520bDave Airlie + dstYoffset * dstRowStride 4294f449be660e70aac2aefd2ce84581e137de25520bDave Airlie + dstXoffset * texelBytes; 4295f449be660e70aac2aefd2ce84581e137de25520bDave Airlie 4296f449be660e70aac2aefd2ce84581e137de25520bDave Airlie for (row = 0; row < srcHeight; row++) { 4297f449be660e70aac2aefd2ce84581e137de25520bDave Airlie GLuint *dstUI = (GLuint *) dstRow; 4298f449be660e70aac2aefd2ce84581e137de25520bDave Airlie for (col = 0; col < srcWidth; col++) { 4299f449be660e70aac2aefd2ce84581e137de25520bDave Airlie GLushort a,r,g,b; 4300f449be660e70aac2aefd2ce84581e137de25520bDave Airlie r = src[RCOMP]; 4301f449be660e70aac2aefd2ce84581e137de25520bDave Airlie g = src[GCOMP]; 4302f449be660e70aac2aefd2ce84581e137de25520bDave Airlie b = src[BCOMP]; 4303f449be660e70aac2aefd2ce84581e137de25520bDave Airlie a = src[ACOMP]; 4304f449be660e70aac2aefd2ce84581e137de25520bDave Airlie dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b); 4305f449be660e70aac2aefd2ce84581e137de25520bDave Airlie src += 4; 4306f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 4307f449be660e70aac2aefd2ce84581e137de25520bDave Airlie dstRow += dstRowStride; 4308f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 4309f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 4310f449be660e70aac2aefd2ce84581e137de25520bDave Airlie free((void *) tempImage); 4311f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 4312f449be660e70aac2aefd2ce84581e137de25520bDave Airlie return GL_TRUE; 4313f449be660e70aac2aefd2ce84581e137de25520bDave Airlie} 4314f449be660e70aac2aefd2ce84581e137de25520bDave Airlie 4315f449be660e70aac2aefd2ce84581e137de25520bDave Airliestatic GLboolean 4316920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu_mesa_texstore_null(TEXSTORE_PARAMS) 4317920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu{ 4318920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) ctx; (void) dims; 4319920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) baseInternalFormat; 4320920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstFormat; 4321920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstXoffset; (void) dstYoffset; (void) dstZoffset; 43225253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul (void) dstRowStride; (void) dstSlices, 4323920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcWidth; (void) srcHeight; (void) srcDepth; 4324920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcFormat; (void) srcType; 4325920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcAddr; 4326920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcPacking; 4327920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 4328920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu /* should never happen */ 4329920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu _mesa_problem(NULL, "_mesa_texstore_null() is called"); 4330920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu return GL_FALSE; 4331920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu} 4332920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 4333920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 4334485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/** 4335485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Return the StoreTexImageFunc pointer to store an image in the given format. 4336485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */ 4337e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paulstatic StoreTexImageFunc 4338485105ed182e2e997b084f047e72d5a2c3460057Brian Paul_mesa_get_texstore_func(gl_format format) 4339485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{ 43406e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie static StoreTexImageFunc table[MESA_FORMAT_COUNT]; 43416e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie static GLboolean initialized = GL_FALSE; 43426e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie 43436e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie if (!initialized) { 43446e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_NONE] = _mesa_texstore_null; 43456e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie 43466e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA8888] = _mesa_texstore_rgba8888; 43476e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA8888_REV] = _mesa_texstore_rgba8888; 43486e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB8888] = _mesa_texstore_argb8888; 43496e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB8888_REV] = _mesa_texstore_argb8888; 4350d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu table[MESA_FORMAT_RGBX8888] = _mesa_texstore_rgba8888; 4351d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu table[MESA_FORMAT_RGBX8888_REV] = _mesa_texstore_rgba8888; 43526e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_XRGB8888] = _mesa_texstore_argb8888; 43536e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_XRGB8888_REV] = _mesa_texstore_argb8888; 43546e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB888] = _mesa_texstore_rgb888; 43556e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_BGR888] = _mesa_texstore_bgr888; 43566e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB565] = _mesa_texstore_rgb565; 43576e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB565_REV] = _mesa_texstore_rgb565; 43586e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB4444] = _mesa_texstore_argb4444; 43596e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB4444_REV] = _mesa_texstore_argb4444; 43606e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA5551] = _mesa_texstore_rgba5551; 43616e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB1555] = _mesa_texstore_argb1555; 43626e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB1555_REV] = _mesa_texstore_argb1555; 43636e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL44] = _mesa_texstore_unorm44; 43646e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL88] = _mesa_texstore_unorm88; 43656e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL88_REV] = _mesa_texstore_unorm88; 43666e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL1616] = _mesa_texstore_unorm1616; 43676e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL1616_REV] = _mesa_texstore_unorm1616; 43686e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB332] = _mesa_texstore_rgb332; 43696e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_A8] = _mesa_texstore_unorm8; 43706e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_A16] = _mesa_texstore_unorm16; 43716e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_L8] = _mesa_texstore_unorm8; 43726e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_L16] = _mesa_texstore_unorm16; 43736e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_I8] = _mesa_texstore_unorm8; 43746e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_I16] = _mesa_texstore_unorm16; 43756e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_YCBCR] = _mesa_texstore_ycbcr; 43766e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_YCBCR_REV] = _mesa_texstore_ycbcr; 43776e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R8] = _mesa_texstore_unorm8; 43780a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul table[MESA_FORMAT_GR88] = _mesa_texstore_unorm88; 4379b4aecc4e1861e60e40e14868719219084967e46dBrian Paul table[MESA_FORMAT_RG88] = _mesa_texstore_unorm88; 43806e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R16] = _mesa_texstore_unorm16; 43816e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG1616] = _mesa_texstore_unorm1616; 43826e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG1616_REV] = _mesa_texstore_unorm1616; 43836e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB2101010] = _mesa_texstore_argb2101010; 43846e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z24_S8] = _mesa_texstore_z24_s8; 43856e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_S8_Z24] = _mesa_texstore_s8_z24; 43866e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z16] = _mesa_texstore_z16; 43876e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_X8_Z24] = _mesa_texstore_x8_z24; 43886e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z24_X8] = _mesa_texstore_z24_x8; 43896e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z32] = _mesa_texstore_z32; 43906e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_S8] = _mesa_texstore_s8; 43916e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGB8] = _mesa_texstore_srgb8; 43926e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGBA8] = _mesa_texstore_srgba8; 43936e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SARGB8] = _mesa_texstore_sargb8; 43946e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SL8] = _mesa_texstore_sl8; 43956e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SLA8] = _mesa_texstore_sla8; 43966e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGB_DXT1] = _mesa_texstore_rgb_dxt1; 43976e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGBA_DXT1] = _mesa_texstore_rgba_dxt1; 43986e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGBA_DXT3] = _mesa_texstore_rgba_dxt3; 43996e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGBA_DXT5] = _mesa_texstore_rgba_dxt5; 44006e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB_FXT1] = _mesa_texstore_rgb_fxt1; 44016e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_FXT1] = _mesa_texstore_rgba_fxt1; 44026e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB_DXT1] = _mesa_texstore_rgb_dxt1; 44036e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_DXT1] = _mesa_texstore_rgba_dxt1; 44046e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_DXT3] = _mesa_texstore_rgba_dxt3; 44056e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_DXT5] = _mesa_texstore_rgba_dxt5; 44066e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_FLOAT32] = _mesa_texstore_rgba_float32; 44076e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_FLOAT16] = _mesa_texstore_rgba_float16; 44086e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB_FLOAT32] = _mesa_texstore_rgba_float32; 44096e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB_FLOAT16] = _mesa_texstore_rgba_float16; 44106e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32; 44116e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16; 44126e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LUMINANCE_FLOAT32] = _mesa_texstore_rgba_float32; 44136e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LUMINANCE_FLOAT16] = _mesa_texstore_rgba_float16; 44146e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32; 44156e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16; 44166e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_INTENSITY_FLOAT32] = _mesa_texstore_rgba_float32; 44176e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_INTENSITY_FLOAT16] = _mesa_texstore_rgba_float16; 44186e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R_FLOAT32] = _mesa_texstore_rgba_float32; 44196e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R_FLOAT16] = _mesa_texstore_rgba_float16; 44206e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG_FLOAT32] = _mesa_texstore_rgba_float32; 44216e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG_FLOAT16] = _mesa_texstore_rgba_float16; 44226e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_DUDV8] = _mesa_texstore_dudv8; 44236e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_R8] = _mesa_texstore_snorm8; 44246e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RG88_REV] = _mesa_texstore_snorm88; 44256e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGBX8888] = _mesa_texstore_signed_rgbx8888; 44266e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGBA8888] = _mesa_texstore_signed_rgba8888; 44276e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGBA8888_REV] = _mesa_texstore_signed_rgba8888; 44286e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_R16] = _mesa_texstore_snorm16; 44296e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_GR1616] = _mesa_texstore_snorm1616; 44306e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGB_16] = _mesa_texstore_signed_rgba_16; 44316e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGBA_16] = _mesa_texstore_signed_rgba_16; 44326e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_16] = _mesa_texstore_rgba_16; 44336e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RED_RGTC1] = _mesa_texstore_red_rgtc1; 44346e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RED_RGTC1] = _mesa_texstore_signed_red_rgtc1; 44356e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG_RGTC2] = _mesa_texstore_rg_rgtc2; 44366e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RG_RGTC2] = _mesa_texstore_signed_rg_rgtc2; 44376e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_L_LATC1] = _mesa_texstore_red_rgtc1; 44386e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_L_LATC1] = _mesa_texstore_signed_red_rgtc1; 44396e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LA_LATC2] = _mesa_texstore_rg_rgtc2; 44406e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_LA_LATC2] = _mesa_texstore_signed_rg_rgtc2; 4441d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu table[MESA_FORMAT_ETC1_RGB8] = _mesa_texstore_etc1_rgb8; 44426e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_A8] = _mesa_texstore_snorm8; 44436e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_L8] = _mesa_texstore_snorm8; 44446e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_AL88] = _mesa_texstore_snorm88; 44456e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_I8] = _mesa_texstore_snorm8; 44466e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_A16] = _mesa_texstore_snorm16; 44476e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_L16] = _mesa_texstore_snorm16; 44486e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_AL1616] = _mesa_texstore_snorm1616; 44496e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_I16] = _mesa_texstore_snorm16; 44506e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB9_E5_FLOAT] = _mesa_texstore_rgb9_e5; 44516e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R11_G11_B10_FLOAT] = _mesa_texstore_r11_g11_b10f; 44526e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z32_FLOAT] = _mesa_texstore_z32; 44536e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z32_FLOAT_X24S8] = _mesa_texstore_z32f_x24s8; 445438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 445538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_UINT8] = _mesa_texstore_rgba_uint8; 445638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_UINT16] = _mesa_texstore_rgba_uint16; 445738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_UINT32] = _mesa_texstore_rgba_uint32; 445838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_INT8] = _mesa_texstore_rgba_int8; 445938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_INT16] = _mesa_texstore_rgba_int16; 446038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_INT32] = _mesa_texstore_rgba_int32; 446138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 446238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_UINT8] = _mesa_texstore_rgba_uint8; 446338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_UINT16] = _mesa_texstore_rgba_uint16; 446438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_UINT32] = _mesa_texstore_rgba_uint32; 446538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_INT8] = _mesa_texstore_rgba_int8; 446638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_INT16] = _mesa_texstore_rgba_int16; 446738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_INT32] = _mesa_texstore_rgba_int32; 446838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 446938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_UINT8] = _mesa_texstore_rgba_uint8; 447038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_UINT16] = _mesa_texstore_rgba_uint16; 447138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_UINT32] = _mesa_texstore_rgba_uint32; 447238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_INT8] = _mesa_texstore_rgba_int8; 447338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_INT16] = _mesa_texstore_rgba_int16; 447438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_INT32] = _mesa_texstore_rgba_int32; 447538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 447638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = _mesa_texstore_rgba_uint8; 447738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = _mesa_texstore_rgba_uint16; 447838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = _mesa_texstore_rgba_uint32; 447938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_INT8] = _mesa_texstore_rgba_int8; 448038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_INT16] = _mesa_texstore_rgba_int16; 448138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_INT32] = _mesa_texstore_rgba_int32; 448238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 448338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_INT8] = _mesa_texstore_rgba_int8; 448438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_INT8] = _mesa_texstore_rgba_int8; 448538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_INT8] = _mesa_texstore_rgba_int8; 448638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_INT8] = _mesa_texstore_rgba_int8; 448738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_INT16] = _mesa_texstore_rgba_int16; 448838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_INT16] = _mesa_texstore_rgba_int16; 448938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_INT16] = _mesa_texstore_rgba_int16; 449038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_INT16] = _mesa_texstore_rgba_int16; 449138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_INT32] = _mesa_texstore_rgba_int32; 449238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_INT32] = _mesa_texstore_rgba_int32; 449338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_INT32] = _mesa_texstore_rgba_int32; 449438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_INT32] = _mesa_texstore_rgba_int32; 449538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 449638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_UINT8] = _mesa_texstore_rgba_uint8; 449738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_UINT8] = _mesa_texstore_rgba_uint8; 449838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_UINT8] = _mesa_texstore_rgba_uint8; 449938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_UINT8] = _mesa_texstore_rgba_uint8; 450038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_UINT16] = _mesa_texstore_rgba_uint16; 450138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_UINT16] = _mesa_texstore_rgba_uint16; 450238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_UINT16] = _mesa_texstore_rgba_uint16; 450338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_UINT16] = _mesa_texstore_rgba_uint16; 450438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_UINT32] = _mesa_texstore_rgba_uint32; 450538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_UINT32] = _mesa_texstore_rgba_uint32; 450638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_UINT32] = _mesa_texstore_rgba_uint32; 450738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_UINT32] = _mesa_texstore_rgba_uint32; 450838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 4509f449be660e70aac2aefd2ce84581e137de25520bDave Airlie table[MESA_FORMAT_ARGB2101010_UINT] = _mesa_texstore_argb2101010_uint; 45106e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie initialized = GL_TRUE; 4511485105ed182e2e997b084f047e72d5a2c3460057Brian Paul } 4512920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 45136e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie ASSERT(table[format]); 45146e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie return table[format]; 4515485105ed182e2e997b084f047e72d5a2c3460057Brian Paul} 4516485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 4517485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 4518660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul/** 4519660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Store user data into texture memory. 4520660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Called via glTex[Sub]Image1/2/3D() 4521660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul */ 4522660ca9c5a23240abca084089a626d4a94ef0799fBrian PaulGLboolean 4523660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul_mesa_texstore(TEXSTORE_PARAMS) 4524660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul{ 4525660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul StoreTexImageFunc storeImage; 4526660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul GLboolean success; 4527660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 45281f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul storeImage = _mesa_get_texstore_func(dstFormat); 4529660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 4530660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul success = storeImage(ctx, dims, baseInternalFormat, 45315253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstFormat, dstXoffset, dstYoffset, dstZoffset, 45325253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 4533660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul srcWidth, srcHeight, srcDepth, 4534660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul srcFormat, srcType, srcAddr, srcPacking); 4535660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul return success; 4536660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul} 4537660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 4538485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 453981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul/** 454081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * Normally, we'll only _write_ texel data to a texture when we map it. 454181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * But if the user is providing depth or stencil values and the texture 454281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * image is a combined depth/stencil format, we'll actually read from 454381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * the texture buffer too (in order to insert the depth or stencil values. 454481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param userFormat the user-provided image format 454581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param texFormat the destination texture format 454681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul */ 454781430ab54f57590c99883eadf622d2ecfae19c49Brian Paulstatic GLbitfield 454881430ab54f57590c99883eadf622d2ecfae19c49Brian Paulget_read_write_mode(GLenum userFormat, gl_format texFormat) 45495999c5b620236fb6a996cf56759aec31f01c126bBrian Paul{ 455081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if ((userFormat == GL_STENCIL_INDEX || userFormat == GL_DEPTH_COMPONENT) 455181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul && _mesa_get_format_base_format(texFormat) == GL_DEPTH_STENCIL) 455281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul return GL_MAP_READ_BIT | GL_MAP_WRITE_BIT; 455381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul else 455481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul return GL_MAP_WRITE_BIT; 45555999c5b620236fb6a996cf56759aec31f01c126bBrian Paul} 45565999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 4557ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul/** 45581da28fa959e80610ebc9b7a28bfb83e3cad3aee4Brian Paul * This is the software fallback for Driver.TexImage1D(). 45596b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d() 45608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 45618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4562f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage1d(struct gl_context *ctx, GLenum target, GLint level, 45638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 45648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint border, 45658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 45668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 45678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 45688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 45698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 457081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat); 457181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte *dstMap; 457281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint dstRowStride; 457381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLboolean success; 457481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4575a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 45768e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 4577b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt if (width == 0) 4578b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt return; 4579b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt 458078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 458178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat, 458278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul width, 1, 1)) { 45837d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); 45847d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 45857d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 45868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 4587e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type, 4588e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexImage1D"); 45896b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul if (!pixels) { 45906b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul /* Note: we check for a NULL image pointer here, _after_ we allocated 45916b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * memory for the texture. That's what the GL spec calls for. 45926b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul */ 459389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 45946b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul } 459581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 459681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Map dest texture buffer (write to whole region) */ 459781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, 0, 459881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 0, 0, width, 1, 459981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul rwMode, 460081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &dstMap, &dstRowStride); 46011ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (dstMap) { 46021ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = _mesa_texstore(ctx, 1, texImage->_BaseFormat, 46031ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul texImage->TexFormat, 46041ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 46051ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul 0, /* dstRowStride */ 46061ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul &dstMap, 46071ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul width, 1, 1, 46081ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul format, type, pixels, packing); 460981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 46101ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 46111ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 46121ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul else { 46131ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = GL_FALSE; 46141ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 461581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 461681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if (!success) 461781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); 4618f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul 461971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 46208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 46218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 46228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 46236b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/** 46241da28fa959e80610ebc9b7a28bfb83e3cad3aee4Brian Paul * This is the software fallback for Driver.TexImage2D(). 46256b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * 4626b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * This function is oriented toward storing images in main memory, rather 4627b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * than VRAM. Device driver's can easily plug in their own replacement. 46288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 46298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4630f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage2d(struct gl_context *ctx, GLenum target, GLint level, 46318e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 46328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint border, 46338e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 46348e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 46358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 46368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 46378e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 463881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat); 463981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte *dstMap; 464081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint dstRowStride; 464181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLboolean success; 464281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4643a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 46448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 4645b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt if (width == 0 || height == 0) 4646b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt return; 4647b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt 464878026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 464978026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat, 465078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul width, height, 1)) { 46517d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); 46527d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 46537d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 46548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 465571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type, 4656e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexImage2D"); 46576b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul if (!pixels) { 46586b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul /* Note: we check for a NULL image pointer here, _after_ we allocated 46596b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * memory for the texture. That's what the GL spec calls for. 46606b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul */ 466189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 46626b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul } 466381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4664229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt if (target == GL_TEXTURE_1D_ARRAY) { 4665229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt const GLint srcStride = 4666229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt _mesa_image_row_stride(packing, width, format, type); 4667229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt int y; 4668229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 4669229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt success = GL_TRUE; 4670229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 4671229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt for (y = 0; y < height; y++) { 4672229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt /* Map dest texture buffer (write to whole region) */ 4673229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt ctx->Driver.MapTextureImage(ctx, texImage, y, 4674229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 0, 0, width, 1, 4675229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt rwMode, 4676229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt &dstMap, &dstRowStride); 46771ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (dstMap) { 46781ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = _mesa_texstore(ctx, 2, texImage->_BaseFormat, 46791ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul texImage->TexFormat, 46801ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 46811ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul dstRowStride, 46821ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul &dstMap, 46831ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul width, 1, 1, 46841ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul format, type, pixels, packing); 46851ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, y); 46861ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 46871ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul else { 46881ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = GL_FALSE; 46891ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 4690229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 4691229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt if (!success) 4692229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt break; 4693229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 46946a04fa9cd4982f056588e11263345e1561197261Brian Paul pixels = (const GLubyte *) pixels + srcStride; 4695229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt } 4696229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt } else { 4697229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt /* Map dest texture buffer (write to whole region) */ 4698229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt ctx->Driver.MapTextureImage(ctx, texImage, 0, 4699229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 0, 0, width, height, 4700229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt rwMode, 4701229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt &dstMap, &dstRowStride); 47021ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (dstMap) { 47031ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = _mesa_texstore(ctx, 2, texImage->_BaseFormat, 47041ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul texImage->TexFormat, 47051ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 47061ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul dstRowStride, 47071ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul &dstMap, 47081ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul width, height, 1, 47091ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul format, type, pixels, packing); 4710229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 47111ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 47121ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 47131ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul else { 47141ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = GL_FALSE; 47151ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 4716229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt } 471781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 471881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if (!success) 471981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); 4720f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul 472171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 47228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 47238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 47248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 47258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 47266b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/** 47271da28fa959e80610ebc9b7a28bfb83e3cad3aee4Brian Paul * This is the software fallback for Driver.TexImage3D(). 47286b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d() 47298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 47308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4731f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_teximage3d(struct gl_context *ctx, GLenum target, GLint level, 47328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 47338e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, GLint border, 47348e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 47358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 47368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 47378e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 47388e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 473981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat); 47401ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul GLboolean success = GL_TRUE; 474181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint slice; 474281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte **sliceMaps; 474381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint dstRowStride; 474481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4745a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 47468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 4747b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt if (width == 0 || height == 0 || depth == 0) 4748b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt return; 4749b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt 475078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 475178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat, 475278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul width, height, depth)) { 475378026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D"); 47547d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 47557d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 47568e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 475781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, 475881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul format, type, 475981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul pixels, packing, "glTexImage3D"); 47606b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul if (!pixels) { 47616b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul /* Note: we check for a NULL image pointer here, _after_ we allocated 47626b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * memory for the texture. That's what the GL spec calls for. 47636b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul */ 476489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 47656b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul } 476681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4767229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt if (target == GL_TEXTURE_1D_ARRAY) { 4768229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt depth = height; 4769229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt height = 1; 4770229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt } 4771229ebf511dcd9b501d9299cfc06d029d1d50079dEric Anholt 47721ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul sliceMaps = (GLubyte **) calloc(depth, sizeof(GLubyte *)); 477381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 477481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Map dest texture buffer slices */ 477581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul for (slice = 0; slice < depth; slice++) { 477681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, slice, 477781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 0, 0, width, height, 477881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul rwMode, 477981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &sliceMaps[slice], &dstRowStride); 47801ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (!sliceMaps[slice]) { 47811ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = GL_FALSE; 47821ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul break; 47831ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 478481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul } 478581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 47861ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (success) { 47871ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = _mesa_texstore(ctx, 3, texImage->_BaseFormat, 47881ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul texImage->TexFormat, 47891ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 47901ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul dstRowStride, 47911ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul sliceMaps, 47921ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul width, height, depth, 47931ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul format, type, pixels, packing); 47941ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 479581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 479681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Unmap dest texture buffer slices */ 479781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul for (slice = 0; slice < depth; slice++) { 47981ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (sliceMaps[slice]) { 47991ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, slice); 48001ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 4801f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 4802f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul 480381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if (!success) 480481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D"); 480581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 480671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 480781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 480881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul free(sliceMaps); 48098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 48108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 48118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 48128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 48138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 48148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 481589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage1D() 481689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage1D(). 48178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 48188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4819f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage1d(struct gl_context *ctx, GLenum target, GLint level, 48208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint width, 48218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 48228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 48238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 48248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 48258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 482681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat); 482781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte *dstMap; 482881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint dstRowStride; 482981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLboolean success; 483081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4831b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 4832e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type, 4833e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexSubImage1D"); 48347a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!pixels) 48357a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 48367a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 483706913497d6b17f454bf4c5b8601d391980eb8265Brian Paul /* Map dest texture buffer */ 483881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, 0, 483981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul xoffset, 0, width, 1, 484081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul rwMode, 484181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &dstMap, &dstRowStride); 484281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 48431ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (dstMap) { 48441ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = _mesa_texstore(ctx, 1, texImage->_BaseFormat, 48451ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul texImage->TexFormat, 48461ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 48471ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul dstRowStride, 48481ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul &dstMap, 48491ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul width, 1, 1, 48501ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul format, type, pixels, packing); 485181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 48521ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 48531ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 48541ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul else { 48551ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = GL_FALSE; 48561ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 485781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 485881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if (!success) 485981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D"); 48603893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul 486171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 48628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 48638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 48648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 486589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 4866f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 486789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage2D() 486889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage2D(). 48698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 48708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4871f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage2d(struct gl_context *ctx, GLenum target, GLint level, 48728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint yoffset, 48738e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, 48748e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 48758e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 48768e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 48778e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 48788e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 487981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat); 488081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte *dstMap; 488181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint dstRowStride; 488281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLboolean success; 488381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4884b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 488571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type, 4886e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexSubImage2D"); 48877a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!pixels) 48887a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 48897a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 489006913497d6b17f454bf4c5b8601d391980eb8265Brian Paul /* Map dest texture buffer */ 489181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, 0, 489281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul xoffset, yoffset, width, height, 489381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul rwMode, 489481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &dstMap, &dstRowStride); 489581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 48961ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (dstMap) { 48971ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = _mesa_texstore(ctx, 2, texImage->_BaseFormat, 48981ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul texImage->TexFormat, 48991ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 49001ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul dstRowStride, 49011ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul &dstMap, 49021ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul width, height, 1, 49031ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul format, type, pixels, packing); 490481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 49051ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 49061ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 49071ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul else { 49081ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = GL_FALSE; 49091ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 491081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 491181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if (!success) 491281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D"); 49133893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul 491471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 49158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 49168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 49178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 49188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 49198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * This is the software fallback for Driver.TexSubImage3D(). 492089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage3D(). 49218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 49228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4923f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_texsubimage3d(struct gl_context *ctx, GLenum target, GLint level, 49248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 49258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, 49268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 49278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 49288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 49298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 49308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 493181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul const GLbitfield rwMode = get_read_write_mode(format, texImage->TexFormat); 49321ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul GLboolean success = GL_TRUE; 493381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint slice; 493481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte **sliceMaps; 493581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint dstRowStride; 493681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 4937b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 4938e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format, 4939e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul type, pixels, packing, 4940e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul "glTexSubImage3D"); 4941f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!pixels) 4942f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return; 4943f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 49441ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul sliceMaps = (GLubyte **) calloc(depth, sizeof(GLubyte *)); 494581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 494681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Map dest texture buffer slices */ 494781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul for (slice = 0; slice < depth; slice++) { 494881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, zoffset + slice, 494981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul xoffset, yoffset, width, height, 495081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul rwMode, 49515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul &sliceMaps[slice], &dstRowStride); 49521ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (!sliceMaps[slice]) { 49531ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = GL_FALSE; 49541ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul break; 49551ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 495681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul } 495781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 49581ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (success) { 49591ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul success = _mesa_texstore(ctx, 3, texImage->_BaseFormat, 49601ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul texImage->TexFormat, 49611ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul 0, 0, 0, 49621ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul dstRowStride, 49631ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul sliceMaps, 49641ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul width, height, depth, 49651ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul format, type, pixels, packing); 49661ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 496781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 496881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul /* Unmap dest texture buffer slices */ 496981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul for (slice = 0; slice < depth; slice++) { 49701ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (sliceMaps[slice]) { 49711ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, zoffset + slice); 49721ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 4973f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 49748f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul 497581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if (!success) 497681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage3D"); 497781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 497871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 497981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 498081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul free(sliceMaps); 49818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 49828e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 49838e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 49842aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul/* 49858e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage1D() 49868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 49878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 498878527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage1d(struct gl_context *ctx, 498978527154bd8693c0956ff78c369222d37c5668e7Brian Paul GLenum target, GLint level, 49908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 49918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint border, 49928e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLsizei imageSize, const GLvoid *data, 49938e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 49948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 49958e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 499689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* this space intentionally left blank */ 4997a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 4998a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 4999a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) internalFormat; 5000a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) border; 5001a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 5002a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 5003a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 50048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 50058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 50068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 50078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 5008b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul/** 50098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage2D() 50108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 50118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 501278527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage2d(struct gl_context *ctx, 501378527154bd8693c0956ff78c369222d37c5668e7Brian Paul GLenum target, GLint level, 50148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 50158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint border, 50168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLsizei imageSize, const GLvoid *data, 50178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 50188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 50198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 5020bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt /* This is pretty simple, because unlike the general texstore path we don't 5021bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt * have to worry about the usual image unpacking or image transfer 5022bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt * operations. 50238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 502489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texObj); 502589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage); 502689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Width > 0); 502789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Height > 0); 502889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Depth == 1); 502989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 503078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 503178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat, 503278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul width, height, 1)) { 503378026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D"); 503489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 503589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 503689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 5037bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt _mesa_store_compressed_texsubimage2d(ctx, target, level, 5038bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt 0, 0, 5039bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt width, height, 5040bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt texImage->TexFormat, 5041bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt imageSize, data, 5042bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt texObj, texImage); 50438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 50448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 50458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 50468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 50478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 50488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage3D() 50498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 50508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 505178527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage3d(struct gl_context *ctx, 505278527154bd8693c0956ff78c369222d37c5668e7Brian Paul GLenum target, GLint level, 50538e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 50548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, 50558e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint border, 50568e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLsizei imageSize, const GLvoid *data, 50578e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 50588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 50598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 506089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* this space intentionally left blank */ 5061a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 5062a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 5063a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) internalFormat; 5064a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) height; (void) depth; 5065a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 5066a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 5067a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 5068a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 50698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 50708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 50718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 50728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 507389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 507489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage1D() 5075e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul */ 5076e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paulvoid 5077f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage1d(struct gl_context *ctx, GLenum target, 507889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint level, 507989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLsizei width, 508089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 508189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei imageSize, const GLvoid *data, 508289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_object *texObj, 508389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage) 5084e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul{ 50855999c5b620236fb6a996cf56759aec31f01c126bBrian Paul /* there are no compressed 1D texture formats yet */ 5086a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 5087a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 5088a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) xoffset; (void) width; 5089a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) format; 5090a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 5091a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 5092a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 5093e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul} 5094e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 5095e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 509689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 509789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage2D() 509889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 509989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid 5100f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage2d(struct gl_context *ctx, GLenum target, 510189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint level, 510289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLint yoffset, 510389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei width, GLsizei height, 510489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 510589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei imageSize, const GLvoid *data, 510689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_object *texObj, 510789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage) 510889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 510981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint bytesPerRow, dstRowStride, srcRowStride; 511089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint i, rows; 511181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte *dstMap; 511289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul const GLubyte *src; 51131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const gl_format texFormat = texImage->TexFormat; 5114d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul GLuint bw, bh; 51155999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 5116d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul _mesa_get_format_block_size(texFormat, &bw, &bh); 51175999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 511889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* these should have been caught sooner */ 5119079bb3fff7104782f2c921200e9a299c38a53ab6Eric Anholt ASSERT((width % bw) == 0 || width < bw); 5120079bb3fff7104782f2c921200e9a299c38a53ab6Eric Anholt ASSERT((height % bh) == 0 || height < bh); 5121d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((xoffset % bw) == 0); 5122d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((yoffset % bh) == 0); 512389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 5124b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 5125e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data, 5126e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul &ctx->Unpack, 5127e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul "glCompressedTexSubImage2D"); 51287a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!data) 51297a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 51307a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 51312594168e9f3cdc4ac53c925486491167837cda30Brian Paul srcRowStride = _mesa_format_row_stride(texFormat, width); 513289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul src = (const GLubyte *) data; 513389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 513406913497d6b17f454bf4c5b8601d391980eb8265Brian Paul /* Map dest texture buffer */ 513581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, 0, 513681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul xoffset, yoffset, width, height, 513781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GL_MAP_WRITE_BIT, 513881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &dstMap, &dstRowStride); 513989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 51401ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (dstMap) { 51411ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul bytesPerRow = srcRowStride; /* bytes per row of blocks */ 51421e0b6a90d78ed78eb9e22c65abd5af314142a844Eric Anholt rows = (height + bh - 1) / bh; /* rows in blocks */ 514389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 51441ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul /* copy rows of blocks */ 51451ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul for (i = 0; i < rows; i++) { 51461ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul memcpy(dstMap, src, bytesPerRow); 51471ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul dstMap += dstRowStride; 51481ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul src += srcRowStride; 51491ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 51508f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul 51511ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 51521ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 51531ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul else { 51541ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D"); 51551ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 515681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 515771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack); 515889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 515989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 516089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 516189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 516289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage3D() 516389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 516489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid 5165f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_store_compressed_texsubimage3d(struct gl_context *ctx, GLenum target, 516689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint level, 516789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 516889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei width, GLsizei height, GLsizei depth, 516989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 517089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei imageSize, const GLvoid *data, 517189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_object *texObj, 517289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage) 517389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 51745999c5b620236fb6a996cf56759aec31f01c126bBrian Paul /* there are no compressed 3D texture formats yet */ 5175a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 5176a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 5177a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) xoffset; (void) yoffset; (void) zoffset; 5178a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) height; (void) depth; 5179a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) format; 5180a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 5181a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 5182a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 518389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 5184