texstore.c revision 6e9a1650e541bf7db15b7e8afaf90d7975b165fe
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" 584c7e44e8e6fd1f441a97016d8bcc67133149e15eBrian Paul#include "format_pack.h" 598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "image.h" 608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "macros.h" 6124edd9015951dd41898902b6c3973fe605e5871aBrian Paul#include "mipmap.h" 62db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h" 630117da40cd7edd3d165bb28569c289b37eca12b9Vinson Lee#include "mtypes.h" 641c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pack.h" 65b70610b9823fc7dc3672735c11be1a75fbb1a2a4Brian Paul#include "pbo.h" 663c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 6789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul#include "texcompress.h" 68da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_fxt1.h" 698d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "texcompress_rgtc.h" 70da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_s3tc.h" 71d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu#include "texcompress_etc.h" 728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "teximage.h" 738e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h" 742e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell#include "enums.h" 751271424615b62544662a606bb23f6d7117a8b0e7Marek Olšák#include "../../gallium/auxiliary/util/u_format_rgb9e5.h" 76631d23daa91c569bf268a2191bd466df73a64263Marek Olšák#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h" 778e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 78248200737398a7d6403a23930a6c9d93db06b942Brian Paul 79fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum { 80fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell ZERO = 4, 81fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell ONE = 5 82fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 8371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 84248200737398a7d6403a23930a6c9d93db06b942Brian Paul 85248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 86e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul * Texture image storage function. 87e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul */ 88e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paultypedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS); 89e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul 90e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul 91e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul/** 92248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Return GL_TRUE if the given image format is one that be converted 93248200737398a7d6403a23930a6c9d93db06b942Brian Paul * to another format by swizzling. 94248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 95248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic GLboolean 96248200737398a7d6403a23930a6c9d93db06b942Brian Paulcan_swizzle(GLenum logicalBaseFormat) 9771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 9871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell switch (logicalBaseFormat) { 9971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_RGBA: 10071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_RGB: 10171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_LUMINANCE_ALPHA: 10271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_INTENSITY: 10371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_ALPHA: 10471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_LUMINANCE: 1053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_RED: 1063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_GREEN: 1073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BLUE: 1083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGR: 1093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGRA: 1103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_ABGR_EXT: 1115d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG: 11271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell return GL_TRUE; 11371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell default: 11471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell return GL_FALSE; 11571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 11671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell} 11771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 1183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 120fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum { 121fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_LUMINANCE = 0, 122fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_ALPHA, 123fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_INTENSITY, 124fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_LUMINANCE_ALPHA, 125fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_RGB, 126fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_RGBA, 1273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RED, 1283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_GREEN, 1293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BLUE, 1303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGR, 1313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGRA, 1323aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ABGR, 1335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick IDX_RG, 134fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell MAX_IDX 135fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 136fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 1373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP1(x) MAP4(x, ZERO, ZERO, ZERO) 1383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP2(x,y) MAP4(x, y, ZERO, ZERO) 1393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP3(x,y,z) MAP4(x, y, z, ZERO) 1403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE } 141fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 142fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 1432e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwellstatic const struct { 1443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte format_idx; 1453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte to_rgba[6]; 1463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte from_rgba[6]; 1473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell} mappings[MAX_IDX] = 148fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{ 149fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_LUMINANCE, 1513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,0,0,ONE), 1523aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0) 153fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 154fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 155fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ALPHA, 1573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, ZERO, ZERO, 0), 1583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(3) 159fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 160fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 161fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_INTENSITY, 1633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0, 0, 0, 0), 1643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0), 165fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 166fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 167fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_LUMINANCE_ALPHA, 1693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,0,0,1), 1703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP2(0,3) 171fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 172fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 173fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RGB, 1753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,ONE), 1763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP3(0,1,2) 177fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 178fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 179fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RGBA, 1813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,3), 1823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,3), 1833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RED, 1873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0, ZERO, ZERO, ONE), 1883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0), 1893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_GREEN, 1933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, 0, ZERO, ONE), 1943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(1), 1953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BLUE, 1993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, ZERO, 0, ONE), 2003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(2), 2013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 2043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGR, 2053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,ONE), 2063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP3(2,1,0) 2073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 2103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGRA, 2113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,3), 2123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,3) 2133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 2163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ABGR, 2173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(3,2,1,0), 2183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(3,2,1,0) 2193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 2215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick { 2225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick IDX_RG, 2235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick MAP4(0, 1, ZERO, ONE), 2245d1387b2da3626326410804026f8b92f1a121fdcIan Romanick MAP2(0, 1) 2255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick }, 226fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 227fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 228fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 229fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 230248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 231248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Convert a GL image format enum to an IDX_* value (see above). 232248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 233248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic int 234248200737398a7d6403a23930a6c9d93db06b942Brian Paulget_map_idx(GLenum value) 235fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{ 236fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell switch (value) { 237fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_LUMINANCE: return IDX_LUMINANCE; 238fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_ALPHA: return IDX_ALPHA; 239fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_INTENSITY: return IDX_INTENSITY; 240fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA; 241fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_RGB: return IDX_RGB; 242fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_RGBA: return IDX_RGBA; 2433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_RED: return IDX_RED; 2443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_GREEN: return IDX_GREEN; 2453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BLUE: return IDX_BLUE; 2463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGR: return IDX_BGR; 2473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGRA: return IDX_BGRA; 2483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_ABGR_EXT: return IDX_ABGR; 2495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick case GL_RG: return IDX_RG; 250fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell default: 251fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell _mesa_problem(NULL, "Unexpected inFormat"); 252fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell return 0; 253fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell } 254fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell} 255fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * When promoting texture formats (see below) we need to compute the 259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * mapping of dest components back to source components. 260f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * This function does that. 261fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param inFormat the incoming format of the texture 262fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param outFormat the final texture format 263fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \return map[6] a full 6-component map 264f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 2653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellstatic void 2663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellcompute_component_mapping(GLenum inFormat, GLenum outFormat, 2673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte *map) 268f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 269248200737398a7d6403a23930a6c9d93db06b942Brian Paul const int inFmt = get_map_idx(inFormat); 270248200737398a7d6403a23930a6c9d93db06b942Brian Paul const int outFmt = get_map_idx(outFormat); 271248200737398a7d6403a23930a6c9d93db06b942Brian Paul const GLubyte *in2rgba = mappings[inFmt].to_rgba; 272248200737398a7d6403a23930a6c9d93db06b942Brian Paul const GLubyte *rgba2out = mappings[outFmt].from_rgba; 2733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell int i; 2742e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell 2753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell for (i = 0; i < 4; i++) 2763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[i] = in2rgba[rgba2out[i]]; 2773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[ZERO] = ZERO; 2793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[ONE] = ONE; 2803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2816b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#if 0 282298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n", 283298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg inFormat, _mesa_lookup_enum_by_nr(inFormat), 284298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg outFormat, _mesa_lookup_enum_by_nr(outFormat), 285298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[0], 286298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[1], 287298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[2], 288298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[3], 289298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[4], 290298be2b028263b2c343a707662c6fbfa18293cb2Kristian Høgsberg map[5]); 2916b6ac9aca08603fb0e3f91bf53fd6d49a1701e2aVinson Lee#endif 292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLfloat components. 297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations. 298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters. 299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format 30039de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures. So, we might 301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead. 302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do. 303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx the rendering context 305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims image dimensions: 1, 2 or 3 306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat basic texture derived from the user's 307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * internal texture format value 308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat the actual basic format of the texture 309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth source image width 310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight source image height 311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth source image depth 312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat source image format 313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType source image type 314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr source image address 315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking source image pixel packing 316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLfloat. 317f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 318e792e79f5ae6be008d9521eccf1c647492cd682aDave AirlieGLfloat * 319e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie_mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims, 320e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLenum logicalBaseFormat, 321e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLenum textureBaseFormat, 322e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLint srcWidth, GLint srcHeight, GLint srcDepth, 323e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLenum srcFormat, GLenum srcType, 324e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLvoid *srcAddr, 325e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const struct gl_pixelstore_attrib *srcPacking, 326e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie GLbitfield transferOps) 327f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 328f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *tempImage; 329a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt const GLint components = _mesa_components_in_format(logicalBaseFormat); 330a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt const GLint srcStride = 331a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 332a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt GLfloat *dst; 333a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt GLint img, row; 334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(dims >= 1 && dims <= 3); 336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(logicalBaseFormat == GL_RGBA || 338f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_RGB || 3395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RG || 3405d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RED || 341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE_ALPHA || 342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE || 343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_ALPHA || 344f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_INTENSITY || 345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_DEPTH_COMPONENT); 346f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 347f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(textureBaseFormat == GL_RGBA || 348f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_RGB || 3495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RG || 3505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RED || 351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA || 352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE || 353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_ALPHA || 354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_INTENSITY || 355f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_DEPTH_COMPONENT); 356f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 357a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt tempImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth 358a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt * components * sizeof(GLfloat)); 359a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt if (!tempImage) 360a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt return NULL; 361f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 362a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt dst = tempImage; 363a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt for (img = 0; img < srcDepth; img++) { 364a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt const GLubyte *src 365a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 366a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt srcWidth, srcHeight, 367a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt srcFormat, srcType, 368a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt img, 0, 0); 369a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt for (row = 0; row < srcHeight; row++) { 370a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat, 371a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt dst, srcFormat, srcType, src, 372a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt srcPacking, transferOps); 373a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt dst += srcWidth * components; 374a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt src += srcStride; 375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 377f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 378f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (logicalBaseFormat != textureBaseFormat) { 379f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* more work */ 380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint texComponents = _mesa_components_in_format(textureBaseFormat); 381f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 382f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *newImage; 383f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i, n; 3843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[6]; 385f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 38613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 38713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 38813ad04719e292a2bee7e1b3155da74a97921c035Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA); 389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 390f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* The actual texture format should have at least as many components 391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * as the logical texture format. 392f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 393f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(texComponents >= logComponents); 394f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 39532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg newImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth 396f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * texComponents * sizeof(GLfloat)); 397f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!newImage) { 39832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 4023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 403f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul n = srcWidth * srcHeight * srcDepth; 405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < n; i++) { 406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint k; 407f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (k = 0; k < texComponents; k++) { 408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint j = map[k]; 409f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (j == ZERO) 410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 0.0F; 411f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (j == ONE) 412f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 1.0F; 413f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else 414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 415f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 417f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 41832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 419f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul tempImage = newImage; 420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return tempImage; 423f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 424f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 425f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 426f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 427dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * Make temporary image with uint pixel values. Used for unsigned 428dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * integer-valued textures. 429dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul */ 430dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulstatic GLuint * 431dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paulmake_temp_uint_image(struct gl_context *ctx, GLuint dims, 432dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLenum logicalBaseFormat, 433dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLenum textureBaseFormat, 434dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 435dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLenum srcFormat, GLenum srcType, 436dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLvoid *srcAddr, 437dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const struct gl_pixelstore_attrib *srcPacking) 438dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul{ 439dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLuint *tempImage; 440dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLint components = _mesa_components_in_format(logicalBaseFormat); 441dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLint srcStride = 442dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 443dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLuint *dst; 444dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint img, row; 445dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 446dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(dims >= 1 && dims <= 3); 447dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 448dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(logicalBaseFormat == GL_RGBA || 449dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_RGB || 450dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_RG || 451dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_RED || 452dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_LUMINANCE_ALPHA || 453dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_LUMINANCE || 454dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_INTENSITY || 455dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul logicalBaseFormat == GL_ALPHA); 456dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 457dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(textureBaseFormat == GL_RGBA || 458dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_RGB || 459dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_RG || 460dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_RED || 461dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA || 462dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_LUMINANCE || 46338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie textureBaseFormat == GL_INTENSITY || 464dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_ALPHA); 465dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 466dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul tempImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth 467dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * components * sizeof(GLuint)); 468dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul if (!tempImage) 469dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul return NULL; 470dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 471dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dst = tempImage; 472dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul for (img = 0; img < srcDepth; img++) { 473dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLubyte *src 474dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 475dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, 476dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, 477dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul img, 0, 0); 478dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul for (row = 0; row < srcHeight; row++) { 479dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul _mesa_unpack_color_span_uint(ctx, srcWidth, logicalBaseFormat, 480dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dst, srcFormat, srcType, src, 481dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcPacking); 482dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dst += srcWidth * components; 483dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul src += srcStride; 484dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 485dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 486dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 487dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul if (logicalBaseFormat != textureBaseFormat) { 488dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul /* more work */ 489dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint texComponents = _mesa_components_in_format(textureBaseFormat); 490dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 491dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLuint *newImage; 492dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint i, n; 493dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLubyte map[6]; 494dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 495dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 496dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 497dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA); 498dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 499dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul /* The actual texture format should have at least as many components 500dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * as the logical texture format. 501dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul */ 502dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul ASSERT(texComponents >= logComponents); 503dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 504dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul newImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth 505dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul * texComponents * sizeof(GLuint)); 506dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul if (!newImage) { 507dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul free(tempImage); 508dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul return NULL; 509dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 510dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 511dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 512dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 513dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul n = srcWidth * srcHeight * srcDepth; 514dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul for (i = 0; i < n; i++) { 515dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint k; 516dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul for (k = 0; k < texComponents; k++) { 517dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul GLint j = map[k]; 518dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul if (j == ZERO) 519a240c998ac649d79f423bb0c445993132cd56f97Brian Paul newImage[i * texComponents + k] = 0; 520dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul else if (j == ONE) 521a240c998ac649d79f423bb0c445993132cd56f97Brian Paul newImage[i * texComponents + k] = 1; 522dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul else 523dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 524dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 525dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 526dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 527dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul free(tempImage); 528dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul tempImage = newImage; 529dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul } 530dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 531dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul return tempImage; 532dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul} 533dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 534dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 535dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul 536dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul/** 537663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * Make a temporary (color) texture image with GLubyte components. 538f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations. 539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters. 540f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format 54139de9251c4770fdcce3395643003aa626178446dBrian Paul * but the graphics hardware doesn't support luminance textures. So, we might 542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead. 543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do. 544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx the rendering context 546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims image dimensions: 1, 2 or 3 547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat basic texture derived from the user's 548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * internal texture format value 549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat the actual basic format of the texture 550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth source image width 551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight source image height 552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth source image depth 553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat source image format 554f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType source image type 555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr source image address 556f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking source image pixel packing 557663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * \return resulting image with format = textureBaseFormat and type = GLubyte. 558f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 559663f61a3e177a443c36f414a16a9d5f94e74135dBrian PaulGLubyte * 560663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul_mesa_make_temp_ubyte_image(struct gl_context *ctx, GLuint dims, 561663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLenum logicalBaseFormat, 562663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLenum textureBaseFormat, 563663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 564663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLenum srcFormat, GLenum srcType, 565663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLvoid *srcAddr, 566663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const struct gl_pixelstore_attrib *srcPacking) 567f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 568f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLuint transferOps = ctx->_ImageTransferState; 569f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint components = _mesa_components_in_format(logicalBaseFormat); 570f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 571663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLubyte *tempImage, *dst; 572f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 573f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(dims >= 1 && dims <= 3); 574f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 575f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(logicalBaseFormat == GL_RGBA || 576f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_RGB || 5775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RG || 5785d1387b2da3626326410804026f8b92f1a121fdcIan Romanick logicalBaseFormat == GL_RED || 579f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE_ALPHA || 580f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE || 581f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_ALPHA || 582f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_INTENSITY); 583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 584f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(textureBaseFormat == GL_RGBA || 585f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_RGB || 5865d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RG || 5875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick textureBaseFormat == GL_RED || 588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA || 589f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE || 590f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_ALPHA || 591f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_INTENSITY); 592f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 593f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* unpack and transfer the source image */ 594663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul tempImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth 595663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * components * sizeof(GLubyte)); 59696128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee if (!tempImage) { 597f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 59896128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee } 599f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 600f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst = tempImage; 601f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 6028c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcStride = 6038c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 6048c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLubyte *src = 6058c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 6068c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcWidth, srcHeight, 6078c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcFormat, srcType, 6088c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul img, 0, 0); 609f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 610e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul _mesa_unpack_color_span_ubyte(ctx, srcWidth, logicalBaseFormat, dst, 611e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul srcFormat, srcType, src, srcPacking, 612e1d703bec58be011636f73470e2b8a41b1363dc7Brian Paul transferOps); 613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst += srcWidth * components; 614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcStride; 615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (logicalBaseFormat != textureBaseFormat) { 619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* one more conversion step */ 620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint texComponents = _mesa_components_in_format(textureBaseFormat); 621f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 622663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul GLubyte *newImage; 623f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i, n; 6243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[6]; 625f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 62613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 62713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 62813ad04719e292a2bee7e1b3155da74a97921c035Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA); 629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* The actual texture format should have at least as many components 631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * as the logical texture format. 632f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(texComponents >= logComponents); 634f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 635663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul newImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth 636663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul * texComponents * sizeof(GLubyte)); 637f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!newImage) { 63832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 639f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 641f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 6423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 643f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul n = srcWidth * srcHeight * srcDepth; 645f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < n; i++) { 646f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint k; 647f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (k = 0; k < texComponents; k++) { 648f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint j = map[k]; 649f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (j == ZERO) 650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 0; 651f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (j == ONE) 652663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul newImage[i * texComponents + k] = 255; 653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else 654f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 655f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 65832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free(tempImage); 659f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul tempImage = newImage; 660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return tempImage; 663f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 664f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 665f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 666c039af165d5919008c6df599795951f85dea164dBrian Paul/** 667c039af165d5919008c6df599795951f85dea164dBrian Paul * Copy GLubyte pixels from <src> to <dst> with swizzling. 668c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dst destination pixels 669c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dstComponents number of color components in destination pixels 670c039af165d5919008c6df599795951f85dea164dBrian Paul * \param src source pixels 671c039af165d5919008c6df599795951f85dea164dBrian Paul * \param srcComponents number of color components in source pixels 672248200737398a7d6403a23930a6c9d93db06b942Brian Paul * \param map the swizzle mapping. map[X] says where to find the X component 673248200737398a7d6403a23930a6c9d93db06b942Brian Paul * in the source image's pixels. For example, if the source image 674248200737398a7d6403a23930a6c9d93db06b942Brian Paul * is GL_BGRA and X = red, map[0] yields 2. 675c039af165d5919008c6df599795951f85dea164dBrian Paul * \param count number of pixels to copy/swizzle. 676c039af165d5919008c6df599795951f85dea164dBrian Paul */ 677c039af165d5919008c6df599795951f85dea164dBrian Paulstatic void 678c039af165d5919008c6df599795951f85dea164dBrian Paulswizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src, 679c039af165d5919008c6df599795951f85dea164dBrian Paul GLuint srcComponents, const GLubyte *map, GLuint count) 68071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 681501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#define SWZ_CPY(dst, src, count, dstComps, srcComps) \ 682501338d70e96e0388fd5198625d856c4ec07745fBrian Paul do { \ 683501338d70e96e0388fd5198625d856c4ec07745fBrian Paul GLuint i; \ 684501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (i = 0; i < count; i++) { \ 685501338d70e96e0388fd5198625d856c4ec07745fBrian Paul GLuint j; \ 686501338d70e96e0388fd5198625d856c4ec07745fBrian Paul if (srcComps == 4) { \ 687501338d70e96e0388fd5198625d856c4ec07745fBrian Paul COPY_4UBV(tmp, src); \ 688501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 689501338d70e96e0388fd5198625d856c4ec07745fBrian Paul else { \ 690501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (j = 0; j < srcComps; j++) { \ 691501338d70e96e0388fd5198625d856c4ec07745fBrian Paul tmp[j] = src[j]; \ 692501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 693501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 694501338d70e96e0388fd5198625d856c4ec07745fBrian Paul src += srcComps; \ 695501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (j = 0; j < dstComps; j++) { \ 696501338d70e96e0388fd5198625d856c4ec07745fBrian Paul dst[j] = tmp[map[j]]; \ 697501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 698501338d70e96e0388fd5198625d856c4ec07745fBrian Paul dst += dstComps; \ 699501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 700501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } while (0) 701501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 702248200737398a7d6403a23930a6c9d93db06b942Brian Paul GLubyte tmp[6]; 70371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 70471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell tmp[ZERO] = 0x0; 70571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell tmp[ONE] = 0xff; 70671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 707501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ASSERT(srcComponents <= 4); 708501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ASSERT(dstComponents <= 4); 709501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 71071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell switch (dstComponents) { 71171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 4: 712501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 713501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 714501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 4); 715501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 716501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 717501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 3); 718501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 719501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 720501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 2); 721501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 722501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 723501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 1); 724501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 725501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 726501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 72771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 72871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 72971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 3: 730501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 731501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 732501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 4); 733501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 734501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 735501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 3); 736501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 737501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 738501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 2); 739501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 740501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 741501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 1); 742501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 743501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 744501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 74571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 74671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 74771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 2: 748501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 749501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 750501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 4); 751501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 752501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 753501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 3); 754501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 755501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 756501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 2); 757501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 758501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 759501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 1); 760501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 761501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 762501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 76371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 76471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 7653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case 1: 766501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 767501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 768501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 4); 769501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 770501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 771501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 3); 772501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 773501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 774501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 2); 775501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 776501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 777501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 1); 778501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 779501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 780501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 7813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 7823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell break; 783501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 784501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 78571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 786501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#undef SWZ_CPY 78771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell} 78871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 78946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 790501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 791bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE }; 792bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE }; 79346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 79439de9251c4770fdcce3395643003aa626178446dBrian Paul 79539de9251c4770fdcce3395643003aa626178446dBrian Paul/** 79639de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a 79739de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on endianness. 798bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell */ 79946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte * 800bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwelltype_mapping( GLenum srcType ) 80146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{ 80246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell switch (srcType) { 803c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger case GL_BYTE: 80446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_BYTE: 80546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_identity; 806bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8: 807df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer return _mesa_little_endian() ? map_3210 : map_identity; 808bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8_REV: 809df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer return _mesa_little_endian() ? map_identity : map_3210; 81046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell default: 81146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return NULL; 81246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 81346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell} 81446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 81539de9251c4770fdcce3395643003aa626178446dBrian Paul 81639de9251c4770fdcce3395643003aa626178446dBrian Paul/** 81739de9251c4770fdcce3395643003aa626178446dBrian Paul * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a 81839de9251c4770fdcce3395643003aa626178446dBrian Paul * mapping array depending on pixelstore byte swapping state. 81946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell */ 82046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte * 821bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellbyteswap_mapping( GLboolean swapBytes, 822bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell GLenum srcType ) 82346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{ 824bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell if (!swapBytes) 825bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell return map_identity; 826bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell 82746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell switch (srcType) { 828c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger case GL_BYTE: 82946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_BYTE: 83046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_identity; 83146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8: 83246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8_REV: 83346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_3210; 83446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell default: 83546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return NULL; 83646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 83746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell} 83846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 83946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 84046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 841c039af165d5919008c6df599795951f85dea164dBrian Paul/** 842c039af165d5919008c6df599795951f85dea164dBrian Paul * Transfer a GLubyte texture image with component swizzling. 843c039af165d5919008c6df599795951f85dea164dBrian Paul */ 84471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellstatic void 845f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_swizzle_ubyte_image(struct gl_context *ctx, 84671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLuint dimensions, 84771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLenum srcFormat, 84846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell GLenum srcType, 84946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 8500c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell GLenum baseInternalFormat, 8510c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell 85246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell const GLubyte *rgba2dst, 8530c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell GLuint dstComponents, 85471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 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 */ 899d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstImage = dstSlices[0]; 90071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map, 901b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcWidth * srcHeight); 90271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 90371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else { 90471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint img, row; 90571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (img = 0; img < srcDepth; img++) { 90671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const GLubyte *srcRow = srcImage; 907d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 90871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (row = 0; row < srcHeight; row++) { 90971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell swizzle_copy(dstRow, dstComponents, srcRow, srcComponents, map, srcWidth); 91071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 91171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 91271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 91371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcImage += srcImageStride; 91471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 91571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 91671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell} 91771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 91871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 919f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 920f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Teximage storage routine for when a simple memcpy will do. 921f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * No pixel transfer operations or special texel encodings allowed. 922f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 1D, 2D and 3D images supported. 923f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 924f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulstatic void 925f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergmemcpy_texture(struct gl_context *ctx, 92617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell GLuint dimensions, 9271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format dstFormat, 928b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint dstRowStride, 9295253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLubyte **dstSlices, 930f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 931f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLenum srcFormat, GLenum srcType, 932f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLvoid *srcAddr, 933f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const struct gl_pixelstore_attrib *srcPacking) 934f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 935f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, 936f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType); 937f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint srcImageStride = _mesa_image_image_stride(srcPacking, 938f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcFormat, srcType); 93960909388ab136d849d99eab49e782a53772a618fBrian Paul const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions, 94060909388ab136d849d99eab49e782a53772a618fBrian Paul srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); 9411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 94222108bb571808542b89677752d62d3901698265fBrian Paul const GLint bytesPerRow = srcWidth * texelBytes; 943b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul 944f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (dstRowStride == srcRowStride && 9455253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride == bytesPerRow) { 9465253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul /* memcpy image by image */ 9475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul GLint img; 9485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul for (img = 0; img < srcDepth; img++) { 949d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstImage = dstSlices[img]; 9505acb291f319a0b32d9701b3e6c8624175f1a80e7Brian Paul memcpy(dstImage, srcImage, bytesPerRow * srcHeight); 9515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul srcImage += srcImageStride; 9525253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul } 953f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 9545253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul else { 9555253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul /* memcpy row by row */ 956f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 957f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 958f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLubyte *srcRow = srcImage; 959d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 960f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 9615acb291f319a0b32d9701b3e6c8624175f1a80e7Brian Paul memcpy(dstRow, srcRow, bytesPerRow); 962f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 963f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcRow += srcRowStride; 964f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 965f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcImage += srcImageStride; 966f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 967f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 968f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 969f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 970f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 9716e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul/** 9726e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul * General-case function for storing a color texture images with 9736e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul * components that can be represented with ubytes. Example destination 9746e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul * texture formats are MESA_FORMAT_ARGB888, ARGB4444, RGB565. 9756e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul */ 9766e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paulstatic GLboolean 9776e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paulstore_ubyte_texture(TEXSTORE_PARAMS) 9786e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul{ 9796e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul const GLint srcRowStride = srcWidth * 4 * sizeof(GLubyte); 9806e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul GLubyte *tempImage, *src; 9816e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul GLint img; 9826e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul 9836e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 9846e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul baseInternalFormat, 9856e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul GL_RGBA, 9866e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 9876e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, 9886e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcPacking); 9896e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul if (!tempImage) 9906e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return GL_FALSE; 9916e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul 9926e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul src = tempImage; 9936e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul for (img = 0; img < srcDepth; img++) { 9946e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul _mesa_pack_ubyte_rgba_rect(dstFormat, srcWidth, srcHeight, 9956e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul src, srcRowStride, 9966e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstSlices[img], dstRowStride); 9976e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul src += srcHeight * srcRowStride; 9986e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul } 9996e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul free(tempImage); 10006e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul 10016e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return GL_TRUE; 10026e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul} 10036e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul 10046e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul 10056e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul 1006f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1008bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák * Store a 32-bit integer or float depth component texture image. 1009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 101049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1011b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z32(TEXSTORE_PARAMS) 1012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 101325cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian const GLuint depthScale = 0xffffffff; 1014755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt GLenum dstType; 1015a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 1016bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák ASSERT(dstFormat == MESA_FORMAT_Z32 || 1017bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák dstFormat == MESA_FORMAT_Z32_FLOAT); 101844c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == sizeof(GLuint)); 1019f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1020755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt if (dstFormat == MESA_FORMAT_Z32) 1021755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt dstType = GL_UNSIGNED_INT; 1022755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt else 1023755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt dstType = GL_FLOAT; 1024755f0a0a02c5cf3be7e69ad51b411711fcc0bc27Eric Anholt 1025966e199e409a1b52eef88e48997442250997f45eBrian Paul if (ctx->Pixel.DepthScale == 1.0f && 1026966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 1027f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1028a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_DEPTH_COMPONENT && 1029a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_DEPTH_COMPONENT && 1030bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák srcType == dstType) { 1031f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 103217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1033d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 10345253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1035f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1036f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1037f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1038f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1039f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1040f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 1041f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1042d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1043f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 104460909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 1045f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 10461ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 1047bc878c7f8bfdabb40a4f784984c13b94656569edMarek Olšák dstType, dstRow, 1048a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul depthScale, srcType, src, srcPacking); 1049f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1050f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1052f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1053f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1054f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1055f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1056f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1058e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul * Store a 24-bit integer depth component texture image. 1059f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 1060e4c700dbbf2a802f32bf62256c801105998c3729Brian Paulstatic GLboolean 1061e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul_mesa_texstore_x8_z24(TEXSTORE_PARAMS) 1062f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1063e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul const GLuint depthScale = 0xffffff; 1064e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul 1065a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 1066e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul ASSERT(dstFormat == MESA_FORMAT_X8_Z24); 1067f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1068e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul { 1069f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1070f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 1071f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1072d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1073f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 107460909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 1075f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 10761ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 1077a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul GL_UNSIGNED_INT, (GLuint *) dstRow, 1078a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul depthScale, srcType, src, srcPacking); 1079f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1080f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1081f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1082f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1083f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1084f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1085f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1086e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul 1087f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1088c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca * Store a 24-bit integer depth component texture image. 1089c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca */ 1090c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonsecastatic GLboolean 1091c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca_mesa_texstore_z24_x8(TEXSTORE_PARAMS) 1092c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca{ 1093c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLuint depthScale = 0xffffff; 1094c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1095c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca (void) dims; 1096c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca ASSERT(dstFormat == MESA_FORMAT_Z24_X8); 1097c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1098c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca { 1099c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca /* general path */ 1100c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLint img, row; 1101c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (img = 0; img < srcDepth; img++) { 1102d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1103c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (row = 0; row < srcHeight; row++) { 1104c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLvoid *src = _mesa_image_address(dims, srcPacking, 1105c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 1106c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLuint *dst = (GLuint *) dstRow; 1107c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLint i; 1108c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca _mesa_unpack_depth_span(ctx, srcWidth, 1109c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GL_UNSIGNED_INT, dst, 1110c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca depthScale, srcType, src, srcPacking); 1111c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (i = 0; i < srcWidth; i++) 1112c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca dst[i] <<= 8; 1113c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca dstRow += dstRowStride; 1114c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1115c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1116c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1117c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca return GL_TRUE; 1118c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca} 1119c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1120c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1121c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca/** 1122a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul * Store a 16-bit integer depth component texture image. 1123f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 112449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1125b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z16(TEXSTORE_PARAMS) 1126f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 112725cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian const GLuint depthScale = 0xffff; 1128a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 11291f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_Z16); 113044c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == sizeof(GLushort)); 1131f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1132966e199e409a1b52eef88e48997442250997f45eBrian Paul if (ctx->Pixel.DepthScale == 1.0f && 1133966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 1134f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1135f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_DEPTH_COMPONENT && 1136f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_DEPTH_COMPONENT && 1137a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_SHORT) { 1138f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 113917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1140d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 11415253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1142f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1144f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1145f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1146f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 11471ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul GLint img, row; 1148f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1149d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 115160909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 1152f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 1153a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dst16 = (GLushort *) dstRow; 11541ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 1155a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul GL_UNSIGNED_SHORT, dst16, depthScale, 1156f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType, src, srcPacking); 1157f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1159f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1160f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1161f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1162f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1163f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1166defb035b6cf03c555318d9dd48864242ed036f39Brian Paul * Store an rgb565 or rgb565_rev texture image. 1167f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 116849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1169b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb565(TEXSTORE_PARAMS) 1170f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 11711f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB565 || 11721f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB565_REV); 117344c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1174f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1176a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1177f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1178f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul srcPacking->SwapBytes)) { 1179f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 118017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1181d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 11825253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1183f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1184f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1185f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1186a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else if (!ctx->_ImageTransferState && 1187a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1188a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1189a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGB && 1190a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE && 1191a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dims == 2) { 1192a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* do optimized tex store */ 11938c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 11948c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1195a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLubyte *src = (const GLubyte *) 119660909388ab136d849d99eab49e782a53772a618fBrian Paul _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight, 1197a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, 0, 0, 0); 1198d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dst = dstSlices[0]; 1199a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLint row, col; 1200a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1201a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLubyte *srcUB = (const GLubyte *) src; 1202a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dstUS = (GLushort *) dst; 1203defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* check for byteswapped format */ 12041f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_RGB565) { 1205f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1206f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] ); 1207f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul srcUB += 3; 1208f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1209f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1210f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1211f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1212f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] ); 1213f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul srcUB += 3; 1214f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1215defb035b6cf03c555318d9dd48864242ed036f39Brian Paul } 1216a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dst += dstRowStride; 1217a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul src += srcRowStride; 1218a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1219a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1220f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 12216e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 12226e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 12236e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 12246e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 1225f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1227f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1228f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1229f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1230248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 1231248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV. 1232248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 123349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1234b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba8888(TEXSTORE_PARAMS) 1235f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1236184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 123771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 12381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA8888 || 1239d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu dstFormat == MESA_FORMAT_RGBA8888_REV || 1240d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu dstFormat == MESA_FORMAT_RGBX8888 || 1241d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu dstFormat == MESA_FORMAT_RGBX8888_REV); 124244c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 1243f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1244f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 12452e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger baseInternalFormat == GL_RGBA && 1246b27792335e284bcddcbcfa807e5152feff330f58Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1247b27792335e284bcddcbcfa807e5152feff330f58Brian Paul srcPacking->SwapBytes)) { 1248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 124917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1250d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 12515253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1252f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 125571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 125646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell (srcType == GL_UNSIGNED_BYTE || 125746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8 || 125846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8_REV) && 1259528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger can_swizzle(baseInternalFormat) && 126071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell can_swizzle(srcFormat)) { 126146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 126271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte dstmap[4]; 126371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 1264528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger /* dstmap - how to swizzle from RGBA to dst format: 126571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell */ 1266d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu if ((littleEndian && (dstFormat == MESA_FORMAT_RGBA8888 || 1267d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu dstFormat == MESA_FORMAT_RGBX8888)) || 1268d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu (!littleEndian && (dstFormat == MESA_FORMAT_RGBA8888_REV || 1269d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu dstFormat == MESA_FORMAT_RGBX8888_REV))) { 127046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 0; 127146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 1; 127246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 2; 127346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 3; 127446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 127546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell else { 127646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 3; 127746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 2; 127846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 1; 127946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 0; 128046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 128171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 128271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 128371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat, 128446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType, 1285528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger baseInternalFormat, 128671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstmap, 4, 12875253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 128871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 128971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcPacking); 129071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 1291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 12926e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 12936e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 12946e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 12956e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 1296a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1297a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1298a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1299a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1300a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 130149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1302b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb8888(TEXSTORE_PARAMS) 1303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1304184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 1305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 13061f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB8888 || 130774d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_ARGB8888_REV || 13082d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer dstFormat == MESA_FORMAT_XRGB8888 || 13092d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer dstFormat == MESA_FORMAT_XRGB8888_REV ); 131044c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 1311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1313a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGBA && 1314b27792335e284bcddcbcfa807e5152feff330f58Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1315b27792335e284bcddcbcfa807e5152feff330f58Brian Paul srcPacking->SwapBytes)) { 1316defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* simple memcpy path (big endian) */ 131717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1318d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 13195253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1320a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1321a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcAddr, srcPacking); 1322a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 132371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 132471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell !srcPacking->SwapBytes && 132574d61d03b54d72217d463c248468cdcd09320efcBrian Paul (dstFormat == MESA_FORMAT_ARGB8888 || 132674d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_XRGB8888) && 132771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat == GL_RGB && 13280c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell (baseInternalFormat == GL_RGBA || 13290c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat == GL_RGB) && 133071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcType == GL_UNSIGNED_BYTE) { 133171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell int img, row, col; 133271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (img = 0; img < srcDepth; img++) { 13338c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 13348c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 133571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 133671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1337d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 133871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (row = 0; row < srcHeight; row++) { 1339259eacfa94a1086e4c99db83516989cc27832ef4Brian GLuint *d4 = (GLuint *) dstRow; 134071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (col = 0; col < srcWidth; col++) { 134124748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul d4[col] = PACK_COLOR_8888(0xff, 134224748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + RCOMP], 134324748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + GCOMP], 134424748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + BCOMP]); 134571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 134671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 134771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 134871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 134971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 135071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 135171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 135271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell !srcPacking->SwapBytes && 13531f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB8888 && 135471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat == GL_RGBA && 13550c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat == GL_RGBA && 135624748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcType == GL_UNSIGNED_BYTE) { 1357259eacfa94a1086e4c99db83516989cc27832ef4Brian /* same as above case, but src data has alpha too */ 1358b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row, col; 1359ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* For some reason, streaming copies to write-combined regions 1360ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * are extremely sensitive to the characteristics of how the 1361ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * source data is retrieved. By reordering the source reads to 1362ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * be in-order, the speed of this operation increases by half. 1363ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Strangely the same isn't required for the RGB path, above. 1364ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 1365ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (img = 0; img < srcDepth; img++) { 13668c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 13678c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1368ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 1369ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1370d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1371ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (row = 0; row < srcHeight; row++) { 1372259eacfa94a1086e4c99db83516989cc27832ef4Brian GLuint *d4 = (GLuint *) dstRow; 1373ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (col = 0; col < srcWidth; col++) { 137424748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP], 137524748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + RCOMP], 137624748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + GCOMP], 137724748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + BCOMP]); 137871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 137971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 138071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 138171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 138271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 138371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 138471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 138546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell (srcType == GL_UNSIGNED_BYTE || 138646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8 || 138746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8_REV) && 13880c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell can_swizzle(baseInternalFormat) && 138971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell can_swizzle(srcFormat)) { 139071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 139171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte dstmap[4]; 139271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 13930c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 139471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell */ 13951f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 139674d61d03b54d72217d463c248468cdcd09320efcBrian Paul (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) || 13972d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) || 13982d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) { 139946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 3; /* alpha */ 140046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 0; /* red */ 140146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 1; /* green */ 140246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 2; /* blue */ 140346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 140446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell else { 14051f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) || 140674d61d03b54d72217d463c248468cdcd09320efcBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 14072d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) || 140874d61d03b54d72217d463c248468cdcd09320efcBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888)); 140946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 2; 141046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 1; 141146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 0; 141246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 3; 141346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 141471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 141571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 141671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat, 141746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType, 14180c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat, 141971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstmap, 4, 1420b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 14215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstSlices, 142271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 142371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcPacking); 142471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 1425a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else { 14266e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 14276e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 14286e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 14296e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 1430a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1431a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1432a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1433a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1434f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 143549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1436b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb888(TEXSTORE_PARAMS) 1437f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 14381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB888); 143944c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 3); 1440f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1441f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1442f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB && 1443f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1444f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul srcPacking->SwapBytes)) { 1445f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 144617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1447d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 14485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1449f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1450f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1451f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1452f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (!ctx->_ImageTransferState && 1453f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1454f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_RGBA && 1455f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 1456a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* extract RGB from RGBA */ 1457b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row, col; 1458f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 14598c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 14608c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 146160909388ab136d849d99eab49e782a53772a618fBrian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 146260909388ab136d849d99eab49e782a53772a618fBrian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1463d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1464f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1465f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1466f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP]; 1467f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1468f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP]; 1469f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1470f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1471f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcRow += srcRowStride; 1472f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1473f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 14753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 14763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 14773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 14783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 14793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 14803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 14813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 14823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 14833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 1484167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[0] = 2; 14853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 1; 1486167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[2] = 0; 14873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 14883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 14893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 14903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 14913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 14923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 14933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 3, 14945253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 14953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 14963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 14973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1498f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 14996e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 15006e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 15016e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 15026e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 1503f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1504f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1505f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1506f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1507f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 150849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1509b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_bgr888(TEXSTORE_PARAMS) 1510a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul{ 15111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_BGR888); 151244c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 3); 1513a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1514a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!ctx->_ImageTransferState && 1515a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1516f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1517f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul srcPacking->SwapBytes)) { 1518a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* simple memcpy path */ 151917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1520d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 15215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1522a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1523a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcAddr, srcPacking); 1524a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1525a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else if (!ctx->_ImageTransferState && 1526a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1527a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGBA && 1528a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE) { 1529a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* extract BGR from RGBA */ 1530a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul int img, row, col; 1531a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 15328c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 15338c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 153460909388ab136d849d99eab49e782a53772a618fBrian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 153560909388ab136d849d99eab49e782a53772a618fBrian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1536d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1537a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1538a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (col = 0; col < srcWidth; col++) { 1539a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP]; 1540a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1541a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP]; 1542a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1543a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1544a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcRow += srcRowStride; 1545a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1546a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1547a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 15483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 15493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 15503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 15513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 15523aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 15533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 15543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 15553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 15563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 1557167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[0] = 0; 15583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 1; 1559167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[2] = 2; 15603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 15613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 15623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 15633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 15643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 15653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 15663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 3, 15675253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 15683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 15693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 15703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1571a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else { 15726e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 15736e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 15746e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 15756e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 1576a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1577a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1578a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1579a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1580a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 158149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1582b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb4444(TEXSTORE_PARAMS) 1583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 15841f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB4444 || 15851f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB4444_REV); 158644c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1587f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1588f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1589f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1590f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1591f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul srcPacking->SwapBytes)) { 1592f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 159317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1594d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 15955253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1596f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1597f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1598f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1599f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 16006e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 16016e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 16026e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 16036e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 1604a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1605a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1606a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1607a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 160849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1609dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom_mesa_texstore_rgba5551(TEXSTORE_PARAMS) 1610dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom{ 16111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA5551); 161244c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1613a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1614dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom if (!ctx->_ImageTransferState && 1615dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom baseInternalFormat == GL_RGBA && 1616453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1617453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul srcPacking->SwapBytes)) { 1618dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom /* simple memcpy path */ 1619dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom memcpy_texture(ctx, dims, 1620d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 16215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1622dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1623dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcAddr, srcPacking); 1624dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1625dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom else { 16266e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 16276e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 16286e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 16296e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 1630dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1631dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom return GL_TRUE; 1632dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom} 1633defb035b6cf03c555318d9dd48864242ed036f39Brian Paul 163449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1635b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb1555(TEXSTORE_PARAMS) 1636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 16371f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB1555 || 16381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB1555_REV); 163944c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1641f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1642f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1643453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1644453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul srcPacking->SwapBytes)) { 1645f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 164617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1647d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 16485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1649f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1651f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 16536e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 16546e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 16556e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 16566e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 1657a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1658a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1659a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1660a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1662621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšákstatic GLboolean 1663621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák_mesa_texstore_argb2101010(TEXSTORE_PARAMS) 1664621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák{ 1665621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1666621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 1667621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák ASSERT(dstFormat == MESA_FORMAT_ARGB2101010); 166844c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 1669621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 1670621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák if (!ctx->_ImageTransferState && 1671453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul baseInternalFormat == GL_RGBA && 1672453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1673453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul srcPacking->SwapBytes)) { 1674621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák /* simple memcpy path */ 1675621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák memcpy_texture(ctx, dims, 1676d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 16775253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1678621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1679621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcAddr, srcPacking); 1680621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1681621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák else { 1682621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák /* general path */ 1683e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 1684621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák baseInternalFormat, 1685621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák baseFormat, 1686621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcWidth, srcHeight, srcDepth, 1687621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcFormat, srcType, srcAddr, 168850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák srcPacking, 168950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák ctx->_ImageTransferState); 169050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák const GLfloat *src = tempImage; 1691621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák GLint img, row, col; 1692621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák if (!tempImage) 1693621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák return GL_FALSE; 1694621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (img = 0; img < srcDepth; img++) { 1695d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1696621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák if (baseInternalFormat == GL_RGBA) { 1697621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (row = 0; row < srcHeight; row++) { 169850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLuint *dstUI = (GLuint *) dstRow; 1699621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (col = 0; col < srcWidth; col++) { 170050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLushort a,r,g,b; 170150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák 170250630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]); 170350630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); 170450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); 170550630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); 170650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák dstUI[col] = PACK_COLOR_2101010_US(a, r, g, b); 1707621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák src += 4; 1708621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1709621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák dstRow += dstRowStride; 1710621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1711621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } else if (baseInternalFormat == GL_RGB) { 1712621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (row = 0; row < srcHeight; row++) { 171350630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLuint *dstUI = (GLuint *) dstRow; 1714621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (col = 0; col < srcWidth; col++) { 171550630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLushort r,g,b; 171650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák 171750630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); 171850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); 171950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); 172050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b); 1721621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák src += 4; 1722621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1723621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák dstRow += dstRowStride; 1724621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1725621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } else { 1726621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák ASSERT(0); 1727621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1728621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1729621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák free((void *) tempImage); 1730621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1731621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák return GL_TRUE; 1732621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák} 1733621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 1734621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 173539de9251c4770fdcce3395643003aa626178446dBrian Paul/** 1736bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák * Do texstore for 2-channel, 4-bit/channel, unsigned normalized formats. 1737bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák */ 1738bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšákstatic GLboolean 1739bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák_mesa_texstore_unorm44(TEXSTORE_PARAMS) 1740bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák{ 1741bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1742bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 1743bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák ASSERT(dstFormat == MESA_FORMAT_AL44); 174444c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 1); 1745bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 1746bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák { 1747bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák /* general path */ 1748663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1749bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák baseInternalFormat, 1750bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák baseFormat, 1751bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák srcWidth, srcHeight, srcDepth, 1752bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák srcFormat, srcType, srcAddr, 1753bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák srcPacking); 1754663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 1755bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák GLint img, row, col; 1756bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák if (!tempImage) 1757bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák return GL_FALSE; 1758bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák for (img = 0; img < srcDepth; img++) { 1759d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1760bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák for (row = 0; row < srcHeight; row++) { 1761bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák GLubyte *dstUS = (GLubyte *) dstRow; 1762bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák for (col = 0; col < srcWidth; col++) { 1763bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák /* src[0] is luminance, src[1] is alpha */ 1764663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_44( src[1], 1765663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[0] ); 1766bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák src += 2; 1767bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 1768bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák dstRow += dstRowStride; 1769bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 1770bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 1771bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák free((void *) tempImage); 1772bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 1773bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák return GL_TRUE; 1774bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák} 1775bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 1776bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 1777bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák/** 177839de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats. 177939de9251c4770fdcce3395643003aa626178446dBrian Paul */ 178049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 17815d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm88(TEXSTORE_PARAMS) 1782f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1783184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 17841f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1785f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 17861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_AL88 || 17875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_AL88_REV || 17880a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul dstFormat == MESA_FORMAT_GR88 || 1789b4aecc4e1861e60e40e14868719219084967e46dBrian Paul dstFormat == MESA_FORMAT_RG88); 179044c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1791f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1792f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1793f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1794e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede ((dstFormat == MESA_FORMAT_AL88 && 1795e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == GL_LUMINANCE_ALPHA && 1796e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede srcFormat == GL_LUMINANCE_ALPHA) || 17970a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul (dstFormat == MESA_FORMAT_GR88 && 1798e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == srcFormat)) && 1799f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE && 1800f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul littleEndian) { 1801f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 180217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1803d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 18045253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1805f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1806f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1807f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 18083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 1809bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell littleEndian && 18103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 18113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 18123aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 18133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 18143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 18153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 18163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 18175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) { 18185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if ((littleEndian && dstFormat == MESA_FORMAT_AL88) || 18195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) { 18205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 0; 18215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 3; 18225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 18235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 18245d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 3; 18255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 0; 18265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 18273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 18283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else { 18290a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul if ((littleEndian && dstFormat == MESA_FORMAT_GR88) || 1830b4aecc4e1861e60e40e14868719219084967e46dBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_RG88)) { 18315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 0; 18325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 1; 18335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 18345d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 18355d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 1; 18365d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 0; 18375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 18383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 18393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[2] = ZERO; /* ? */ 18403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 18413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 18423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 18433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 18443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 18453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 18463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 2, 18475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 18483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 18493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 18503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1851f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1852f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1853663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1854f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 185522108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1856f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1857f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1858f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1859663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 1860f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1861f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1862f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1863f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1864d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1865f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1866f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 18675d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL88 || 18680a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul dstFormat == MESA_FORMAT_GR88) { 1869f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1870ae70caf7eb708351ee93b35926142e503be79d39Brian Paul /* src[0] is luminance (or R), src[1] is alpha (or G) */ 1871663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_88( src[1], 1872663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[0] ); 1873f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 2; 1874f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1875f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1876f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1877f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1878ae70caf7eb708351ee93b35926142e503be79d39Brian Paul /* src[0] is luminance (or R), src[1] is alpha (or G) */ 1879663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_88_REV( src[1], 1880663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[0] ); 1881f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 2; 1882f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1883a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1884a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1885a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1886a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 188732f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1888a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1889a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1890a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1891a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1892a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 189339de9251c4770fdcce3395643003aa626178446dBrian Paul/** 189439de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats. 189539de9251c4770fdcce3395643003aa626178446dBrian Paul */ 189649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 18975d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm1616(TEXSTORE_PARAMS) 18983325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick{ 18993325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLboolean littleEndian = _mesa_little_endian(); 19003325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 19013325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 19023325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick ASSERT(dstFormat == MESA_FORMAT_AL1616 || 19035d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_AL1616_REV || 19045d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616 || 19055d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616_REV); 190644c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 19073325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 19083325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick if (!ctx->_ImageTransferState && 19093325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick !srcPacking->SwapBytes && 1910e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede ((dstFormat == MESA_FORMAT_AL1616 && 1911e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == GL_LUMINANCE_ALPHA && 1912e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede srcFormat == GL_LUMINANCE_ALPHA) || 1913e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede (dstFormat == MESA_FORMAT_RG1616 && 1914e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == srcFormat)) && 19153325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcType == GL_UNSIGNED_SHORT && 19163325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick littleEndian) { 19173325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick /* simple memcpy path */ 19183325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick memcpy_texture(ctx, dims, 1919d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 19205253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 19213325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcWidth, srcHeight, srcDepth, srcFormat, srcType, 19223325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcAddr, srcPacking); 19233325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19243325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick else { 19253325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick /* general path */ 1926e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 19273325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick baseInternalFormat, 19283325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick baseFormat, 19293325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcWidth, srcHeight, srcDepth, 19303325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcFormat, srcType, srcAddr, 1931bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 1932bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 19333325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLfloat *src = tempImage; 19343325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick GLint img, row, col; 19353325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick if (!tempImage) 19363325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick return GL_FALSE; 19373325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (img = 0; img < srcDepth; img++) { 1938d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 19393325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (row = 0; row < srcHeight; row++) { 19403325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick GLuint *dstUI = (GLuint *) dstRow; 19415d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL1616 || 19425d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616) { 19433325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (col = 0; col < srcWidth; col++) { 1944db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt GLushort l, a; 1945db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt 1946db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(l, src[0]); 1947db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(a, src[1]); 1948db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt dstUI[col] = PACK_COLOR_1616(a, l); 1949db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt src += 2; 19503325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19513325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19523325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick else { 19533325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (col = 0; col < srcWidth; col++) { 1954db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt GLushort l, a; 1955db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt 1956db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(l, src[0]); 1957db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(a, src[1]); 1958db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt dstUI[col] = PACK_COLOR_1616_REV(a, l); 1959db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt src += 2; 19603325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19613325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19623325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick dstRow += dstRowStride; 19633325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19643325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 196532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 19663325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19673325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick return GL_TRUE; 19683325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick} 19693325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 19703325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 1971fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák/* Texstore for R16, A16, L16, I16. */ 19723325dc91be2534079ebf7997700b6e5f17a75283Ian Romanickstatic GLboolean 1973eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák_mesa_texstore_unorm16(TEXSTORE_PARAMS) 19745d1387b2da3626326410804026f8b92f1a121fdcIan Romanick{ 19755d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLboolean littleEndian = _mesa_little_endian(); 19765d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 19775d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 1978eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák ASSERT(dstFormat == MESA_FORMAT_R16 || 1979bb5ace68ce9e8bd171a39162ed6bd93632bd6619Marek Olšák dstFormat == MESA_FORMAT_A16 || 1980fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák dstFormat == MESA_FORMAT_L16 || 1981fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák dstFormat == MESA_FORMAT_I16); 198244c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 19835d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 19845d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (!ctx->_ImageTransferState && 19855d1387b2da3626326410804026f8b92f1a121fdcIan Romanick !srcPacking->SwapBytes && 1986eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák baseInternalFormat == srcFormat && 19875d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcType == GL_UNSIGNED_SHORT && 19885d1387b2da3626326410804026f8b92f1a121fdcIan Romanick littleEndian) { 19895d1387b2da3626326410804026f8b92f1a121fdcIan Romanick /* simple memcpy path */ 19905d1387b2da3626326410804026f8b92f1a121fdcIan Romanick memcpy_texture(ctx, dims, 1991d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 19925253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 19935d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, srcFormat, srcType, 19945d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcAddr, srcPacking); 19955d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 19965d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 19975d1387b2da3626326410804026f8b92f1a121fdcIan Romanick /* general path */ 1998e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 19995d1387b2da3626326410804026f8b92f1a121fdcIan Romanick baseInternalFormat, 20005d1387b2da3626326410804026f8b92f1a121fdcIan Romanick baseFormat, 20015d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, 20025d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcFormat, srcType, srcAddr, 2003bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2004bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 20055d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLfloat *src = tempImage; 20065d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLint img, row, col; 20075d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (!tempImage) 20085d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return GL_FALSE; 20095d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (img = 0; img < srcDepth; img++) { 2010d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 20115d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (row = 0; row < srcHeight; row++) { 20125d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLushort *dstUS = (GLushort *) dstRow; 20135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (col = 0; col < srcWidth; col++) { 20145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLushort r; 20155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 20165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick UNCLAMPED_FLOAT_TO_USHORT(r, src[0]); 20175d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstUS[col] = r; 20185d1387b2da3626326410804026f8b92f1a121fdcIan Romanick src += 1; 20195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 20205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstRow += dstRowStride; 20215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 20225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 20235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick free((void *) tempImage); 20245d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 20255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return GL_TRUE; 20265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick} 20275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 20285d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 20295d1387b2da3626326410804026f8b92f1a121fdcIan Romanickstatic GLboolean 203017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul_mesa_texstore_rgba_16(TEXSTORE_PARAMS) 203117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul{ 203217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 203317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 203417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_16); 203544c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 8); 203617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 203717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul if (!ctx->_ImageTransferState && 203817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul !srcPacking->SwapBytes && 203917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseInternalFormat == GL_RGBA && 204017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcFormat == GL_RGBA && 204117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcType == GL_UNSIGNED_SHORT) { 204217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul /* simple memcpy path */ 204317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul memcpy_texture(ctx, dims, 2044d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 20455253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 204617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 204717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcAddr, srcPacking); 204817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 204917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul else { 205017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul /* general path */ 2051e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 205217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseInternalFormat, 205317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseFormat, 205417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcWidth, srcHeight, srcDepth, 205517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcFormat, srcType, srcAddr, 2056bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2057bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 205817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLfloat *src = tempImage; 205917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLint img, row, col; 206017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul if (!tempImage) 206117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul return GL_FALSE; 206217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (img = 0; img < srcDepth; img++) { 2063d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 206417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (row = 0; row < srcHeight; row++) { 206517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLushort *dstUS = (GLushort *) dstRow; 206617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (col = 0; col < srcWidth; col++) { 206717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLushort r, g, b, a; 206817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 206917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(r, src[0]); 207017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(g, src[1]); 207117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(b, src[2]); 207217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(a, src[3]); 207317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+0] = r; 207417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+1] = g; 207517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+2] = b; 207617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+3] = a; 207717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul src += 4; 207817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 207917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstRow += dstRowStride; 208017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 208117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 208217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul free((void *) tempImage); 208317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 208417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul return GL_TRUE; 208517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul} 208617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 208717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 208817e96718946486ef77927fcf3bb299d8bff32b98Brian Paulstatic GLboolean 2089279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS) 2090279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul{ 2091279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2092279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2093daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGB_16 || 2094279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA_16); 2095279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2096279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul if (!ctx->_ImageTransferState && 2097279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul !srcPacking->SwapBytes && 2098279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseInternalFormat == GL_RGBA && 2099279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA_16 && 2100279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcFormat == GL_RGBA && 2101279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcType == GL_SHORT) { 2102279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* simple memcpy path */ 2103279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul memcpy_texture(ctx, dims, 2104d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 21055253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2106279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2107279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcAddr, srcPacking); 2108279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2109279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul else { 2110279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* general path */ 2111e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2112279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseInternalFormat, 2113279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseFormat, 2114279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcWidth, srcHeight, srcDepth, 2115279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcFormat, srcType, srcAddr, 2116bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2117bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 2118279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLfloat *src = tempImage; 2119279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2; 2120279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLint img, row, col; 2121279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2122279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul if (!tempImage) 2123279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul return GL_FALSE; 2124279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2125279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* Note: tempImage is always float[4] / RGBA. We convert to 1, 2, 2126279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul * 3 or 4 components/pixel here. 2127279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul */ 2128279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul for (img = 0; img < srcDepth; img++) { 2129d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 2130279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul for (row = 0; row < srcHeight; row++) { 2131279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLshort *dstRowS = (GLshort *) dstRow; 2132daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (dstFormat == MESA_FORMAT_SIGNED_RGBA_16) { 2133daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 2134daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLuint c; 2135daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (c = 0; c < comps; c++) { 2136daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort p; 2137daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]); 2138daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRowS[col * comps + c] = p; 2139daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2140daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2141daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 2142daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 4 * srcWidth; 2143daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } else { 2144daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 2145daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLuint c; 2146daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (c = 0; c < comps; c++) { 2147daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort p; 2148daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 3 + c]); 2149daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRowS[col * comps + c] = p; 2150daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2151279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2152daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 2153daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 3 * srcWidth; 2154279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2155279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2156279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2157279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul free((void *) tempImage); 2158279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2159279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul return GL_TRUE; 2160279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul} 2161279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2162279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2163279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paulstatic GLboolean 2164b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb332(TEXSTORE_PARAMS) 2165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 21661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB332); 216744c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 1); 2168f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2169f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2170f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB && 21716f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 21726f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul srcPacking->SwapBytes)) { 2173f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 217417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 2175d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 21765253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2177f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2178f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2179f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2180f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 21816e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 21826e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 21836e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 21846e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 2185f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2186f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2187f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2188f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2189f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2190f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 2191f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8. 2192f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 219349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2194bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák_mesa_texstore_unorm8(TEXSTORE_PARAMS) 2195f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 21961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 219722108bb571808542b89677752d62d3901698265fBrian Paul 21981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_A8 || 21991f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_L8 || 22005d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_I8 || 22015d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_R8); 220244c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 1); 2203f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2204f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2205f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2206f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 2207f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 2208f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 220917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 2210d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 22115253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2212f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2213f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2214f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 22153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 22163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 22173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 22183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 22193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 22203aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 22213aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 22223aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 22231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_A8) { 22243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 3; 22253aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 22263aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else { 22273aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 0; 22283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 22293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = ZERO; /* ? */ 22303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[2] = ZERO; /* ? */ 22313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 22323aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 22333aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 22343aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 22353aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 22363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 22373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 1, 22385253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 22393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 22403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 22413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 2242f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2243f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 2244663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 2245f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 224622108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2247f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2249f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2250663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 2251f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2252f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2254f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2255d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 2256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 2258663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col] = src[col]; 2259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2260f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 2261f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcWidth; 2262f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2263f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 226432f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2265f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2267f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2268f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2269f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2270f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2271f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 22721f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV. 2273f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 227449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2275b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ycbcr(TEXSTORE_PARAMS) 2276f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 2277184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 227822108bb571808542b89677752d62d3901698265fBrian Paul 2279a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; (void) dims; (void) baseInternalFormat; 2280f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 22811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT((dstFormat == MESA_FORMAT_YCBCR) || 22821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (dstFormat == MESA_FORMAT_YCBCR_REV)); 228344c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 2284f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(ctx->Extensions.MESA_ycbcr_texture); 2285f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(srcFormat == GL_YCBCR_MESA); 2286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) || 2287f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA)); 2288f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_YCBCR_MESA); 2289f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2290f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* always just memcpy since no pixel transfer ops apply */ 229117bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 2292d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 22935253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* Check if we need byte swapping */ 2298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* XXX the logic here _might_ be wrong */ 2299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (srcPacking->SwapBytes ^ 2300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^ 23011f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (dstFormat == MESA_FORMAT_YCBCR_REV) ^ 2302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !littleEndian) { 2303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 2304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2305d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 2306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2307b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul _mesa_swap2((GLushort *) dstRow, srcWidth); 2308b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 2309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 231549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2316114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_texstore_dudv8(TEXSTORE_PARAMS) 2317114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 2318114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const GLboolean littleEndian = _mesa_little_endian(); 23191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2320114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 23211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_DUDV8); 232222108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 2323114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT(ctx->Extensions.ATI_envmap_bumpmap); 2324114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT((srcFormat == GL_DU8DV8_ATI) || 2325114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger (srcFormat == GL_DUDV_ATI)); 2326114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT(baseInternalFormat == GL_DUDV_ATI); 2327114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2328114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!srcPacking->SwapBytes && srcType == GL_BYTE && 2329114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger littleEndian) { 2330114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* simple memcpy path */ 2331114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger memcpy_texture(ctx, dims, 2332d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 23335253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2334114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2335114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcAddr, srcPacking); 2336114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2337114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (srcType == GL_BYTE) { 2338114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLubyte dstmap[4]; 2339114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2340114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* dstmap - how to swizzle from RGBA to dst format: 2341114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger */ 2342114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (littleEndian) { 2343114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[0] = 0; 2344114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[1] = 3; 2345114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2346114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 2347114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[0] = 3; 2348114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[1] = 0; 2349114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2350114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[2] = ZERO; /* ? */ 2351114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[3] = ONE; /* ? */ 2352114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2353114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_swizzle_ubyte_image(ctx, dims, 2354114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_LUMINANCE_ALPHA, /* hack */ 2355114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_UNSIGNED_BYTE, /* hack */ 2356114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_LUMINANCE_ALPHA, /* hack */ 2357114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap, 2, 23585253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2359114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, srcDepth, srcAddr, 2360114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcPacking); 2361114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2362114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 2363114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* general path - note this is defined for 2d textures only */ 2364114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const GLint components = _mesa_components_in_format(baseInternalFormat); 23658c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth, 23668c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcFormat, srcType); 2367114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLbyte *tempImage, *dst, *src; 2368114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLint row; 2369114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 237032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth 2371114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger * components * sizeof(GLbyte)); 2372114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!tempImage) 2373114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_FALSE; 2374114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2375114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2376114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, 2377114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcFormat, srcType, 2378114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 0, 0, 0); 2379114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2380114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst = tempImage; 2381114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (row = 0; row < srcHeight; row++) { 2382114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat, 2383114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst, srcFormat, srcType, src, 2384114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcPacking, 0); 2385114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst += srcWidth * components; 2386114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src += srcStride; 2387114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2388114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2389114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src = tempImage; 2390d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dst = (GLbyte *) dstSlices[0]; 2391114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (row = 0; row < srcHeight; row++) { 239222108bb571808542b89677752d62d3901698265fBrian Paul memcpy(dst, src, srcWidth * texelBytes); 2393114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst += dstRowStride; 239422108bb571808542b89677752d62d3901698265fBrian Paul src += srcWidth * texelBytes; 2395114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 239632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2397114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2398114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_TRUE; 2399114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 2400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 240184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 240284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 2403daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized 8-bit format. 240484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 240584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 2406daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm8(TEXSTORE_PARAMS) 240784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 240884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 240984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2410daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_A8 || 2411daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_L8 || 2412daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_I8 || 2413daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_R8); 241444c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 1); 241584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2416daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 2417daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 2418daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 2419daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_BYTE) { 2420daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 2421daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 2422d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 24235253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2424daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2425daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 2426daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2427daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 242884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 2429e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 243084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 243184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 243284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 243384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 2434bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2435bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 2436daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 243784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 243884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 243984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 244084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 2441d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLbyte *dstRow = (GLbyte *) dstSlices[img]; 244284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 244384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 2444daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow[col] = FLOAT_TO_BYTE_TEX(src[col]); 244584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 244684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 2447daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += srcWidth; 244884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 244984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 245084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 245184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 245284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 245384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 245484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 245584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 245684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 2457daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized two-channel 16-bit format. 245884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 245984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 2460daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm88(TEXSTORE_PARAMS) 246184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 2462daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLboolean littleEndian = _mesa_little_endian(); 246384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 246484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2465daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL88 || 2466daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_RG88_REV); 246744c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 246884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2469daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 2470daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 2471daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 2472daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_BYTE && 2473daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák littleEndian) { 2474daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 2475daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 2476d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 24775253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2478daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2479daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 2480daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2481daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 248284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 2483e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 248484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 248584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 248684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 248784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 2488bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2489bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 2490daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 249184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 249284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 249384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 249484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 2495d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLbyte *dstRow = (GLbyte *) dstSlices[img]; 249684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 2497daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dst = dstRow; 249884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 2499daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = FLOAT_TO_BYTE_TEX(src[0]); 2500daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(src[1]); 2501daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 2; 2502daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 2; 250384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 250484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 250584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 250684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 250784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 250884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 250984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 251084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 251184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2512daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/* Texstore for signed R16, A16, L16, I16. */ 2513daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean 2514daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm16(TEXSTORE_PARAMS) 2515daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{ 2516daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLboolean littleEndian = _mesa_little_endian(); 2517daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2518daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2519daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_R16 || 2520daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_A16 || 2521daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_L16 || 2522daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_I16); 252344c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 2524daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2525daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 2526daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 2527daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 2528daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_SHORT && 2529daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák littleEndian) { 2530daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 2531daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 2532d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 25335253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2534daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2535daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 2536daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2537daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 2538daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* general path */ 2539daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2540daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat, 2541daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseFormat, 2542daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, 2543daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcFormat, srcType, srcAddr, 2544daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcPacking, 2545daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ctx->_ImageTransferState); 2546daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 2547daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLint img, row, col; 2548daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!tempImage) 2549daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_FALSE; 2550daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (img = 0; img < srcDepth; img++) { 2551d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 2552daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (row = 0; row < srcHeight; row++) { 2553daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort *dstUS = (GLshort *) dstRow; 2554daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 2555daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLushort r; 2556daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2557daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(r, src[0]); 2558daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstUS[col] = r; 2559daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 1; 2560daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2561daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 2562daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2563daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2564daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák free((void *) tempImage); 2565daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2566daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_TRUE; 2567daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák} 2568daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2569daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/** 2570daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Do texstore for 2-channel, 16-bit/channel, signed normalized formats. 2571daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák */ 2572daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean 2573daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm1616(TEXSTORE_PARAMS) 2574daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{ 2575daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLboolean littleEndian = _mesa_little_endian(); 2576daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2577daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2578daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL1616 || 2579daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_GR1616); 258044c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 2581daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2582daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 2583daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 2584daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 2585daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_SHORT && 2586daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák littleEndian) { 2587daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 2588daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 2589d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 25905253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2591daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2592daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 2593daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2594daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 2595daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* general path */ 2596daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2597daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat, 2598daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseFormat, 2599daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, 2600daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcFormat, srcType, srcAddr, 2601daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcPacking, 2602daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ctx->_ImageTransferState); 2603daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 2604daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLint img, row, col; 2605daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!tempImage) 2606daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_FALSE; 2607daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (img = 0; img < srcDepth; img++) { 2608d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 2609daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (row = 0; row < srcHeight; row++) { 2610daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort *dst = (GLshort *) dstRow; 2611daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 2612daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLushort l, a; 2613daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2614daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(l, src[0]); 2615daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(a, src[1]); 2616daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = l; 2617daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = a; 2618daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 2; 2619daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 2; 2620daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2621daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 2622daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2623daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2624daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák free((void *) tempImage); 2625daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2626daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_TRUE; 2627daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák} 262884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 262984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 263084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBX8888. 263184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 263284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 263384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS) 263484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 263584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 263684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 263784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888); 263844c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 263984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 264084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul { 264184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 2642e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 264384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 264484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 264584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 264684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 2647bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2648bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 264984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLfloat *srcRow = tempImage; 265084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 265184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 265284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 265384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 2654d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLbyte *dstRow = (GLbyte *) dstSlices[img]; 265584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 2656daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dst = dstRow; 265784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 2658daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 2659daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 2660daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 26618778bf221e90e9b59caad02ab72a0a0edcfe2451Brian Paul dst[0] = 127; 2662daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcRow += 3; 2663daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 4; 266484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 266584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 266684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 266784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 266884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 266984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 267084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 267184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 267284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 267384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 267484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2675c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger/** 267639de9251c4770fdcce3395643003aa626178446dBrian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or 267739de9251c4770fdcce3395643003aa626178446dBrian Paul * MESA_FORMAT_SIGNED_RGBA8888_REV 2678c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */ 267949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2680c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS) 2681c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger{ 26821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2683c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 26841f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 || 26851f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV); 268644c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 2687c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 2688c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger if (!ctx->_ImageTransferState && 2689c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat == GL_RGBA && 26906f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 26916f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul srcPacking->SwapBytes)) { 2692c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* simple memcpy path */ 2693c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger memcpy_texture(ctx, dims, 2694d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 26955253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2696c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2697c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcAddr, srcPacking); 2698c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2699c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger else { 2700c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* general path */ 2701e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2702c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat, 270322108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2704c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, 2705c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcFormat, srcType, srcAddr, 2706bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2707bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 2708c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger const GLfloat *srcRow = tempImage; 2709c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger GLint img, row, col; 2710c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger if (!tempImage) 2711c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger return GL_FALSE; 2712c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (img = 0; img < srcDepth; img++) { 2713d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLbyte *dstRow = (GLbyte *) dstSlices[img]; 2714c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (row = 0; row < srcHeight; row++) { 2715daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dst = dstRow; 27161f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) { 2717c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (col = 0; col < srcWidth; col++) { 2718daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 2719daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 2720daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 2721daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]); 2722c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcRow += 4; 2723daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 4; 2724c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2725c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2726bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger else { 2727bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger for (col = 0; col < srcWidth; col++) { 2728daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 2729daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 2730daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[2] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 2731daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[3] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]); 2732bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcRow += 4; 2733daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 4; 2734bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 2735bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 2736c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstRow += dstRowStride; 2737c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2738c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 273932f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2740c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2741c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger return GL_TRUE; 2742c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger} 2743f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 274484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2745184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul/** 2746184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul * Store a combined depth/stencil texture image. 2747184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul */ 274849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2749b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z24_s8(TEXSTORE_PARAMS) 2750184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul{ 275192098438784887fd6005918794476cfbbeac5035Karl Schultz const GLuint depthScale = 0xffffff; 2752c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz const GLint srcRowStride 2753b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 2754c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz GLint img, row; 275525cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian 27561f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_Z24_S8); 2757e41a91cea764cc1ba95906251cd907d837225293Marek Olšák ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || 2758e41a91cea764cc1ba95906251cd907d837225293Marek Olšák srcFormat == GL_DEPTH_COMPONENT || 2759e41a91cea764cc1ba95906251cd907d837225293Marek Olšák srcFormat == GL_STENCIL_INDEX); 2760c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT); 2761184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 2762e41a91cea764cc1ba95906251cd907d837225293Marek Olšák if (srcFormat == GL_DEPTH_STENCIL && ctx->Pixel.DepthScale == 1.0f && 2763966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 2764184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul !srcPacking->SwapBytes) { 2765ef8653a83800bc4b8e116e03ad52604097224378Brian Paul /* simple path */ 2766184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul memcpy_texture(ctx, dims, 2767d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 27685253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2769184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2770184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul srcAddr, srcPacking); 277139de9251c4770fdcce3395643003aa626178446dBrian Paul } 2772e41a91cea764cc1ba95906251cd907d837225293Marek Olšák else if (srcFormat == GL_DEPTH_COMPONENT || 2773e41a91cea764cc1ba95906251cd907d837225293Marek Olšák srcFormat == GL_STENCIL_INDEX) { 2774c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* In case we only upload depth we need to preserve the stencil */ 2775ef8653a83800bc4b8e116e03ad52604097224378Brian Paul for (img = 0; img < srcDepth; img++) { 2776d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLuint *dstRow = (GLuint *) dstSlices[img]; 2777b786db06540472beda9cedd18937d6e12855b3ebBrian Paul const GLubyte *src 2778b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2779c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcWidth, srcHeight, 2780c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcFormat, srcType, 2781c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie img, 0, 0); 2782ef8653a83800bc4b8e116e03ad52604097224378Brian Paul for (row = 0; row < srcHeight; row++) { 2783c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLuint depth[MAX_WIDTH]; 2784c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLubyte stencil[MAX_WIDTH]; 2785ef8653a83800bc4b8e116e03ad52604097224378Brian Paul GLint i; 2786c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; 2787c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2788c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */ 2789c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil = GL_TRUE; 279039de9251c4770fdcce3395643003aa626178446dBrian Paul } 279139de9251c4770fdcce3395643003aa626178446dBrian Paul else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */ 2792c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepdepth = GL_TRUE; 2793c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 2794c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2795c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepdepth == GL_FALSE) 2796c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* the 24 depth bits will be in the low position: */ 2797c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_depth_span(ctx, srcWidth, 2798c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_INT, /* dst type */ 2799c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil ? depth : dstRow, /* dst addr */ 2800c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie depthScale, 2801c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking); 2802c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2803c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil == GL_FALSE) 2804c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* get the 8-bit stencil values */ 2805c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_stencil_span(ctx, srcWidth, 2806c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_BYTE, /* dst type */ 2807c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie stencil, /* dst addr */ 2808c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking, 2809c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie ctx->_ImageTransferState); 2810c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2811c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (i = 0; i < srcWidth; i++) { 2812c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil) 2813c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF); 2814c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie else 2815c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF); 2816c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 2817ef8653a83800bc4b8e116e03ad52604097224378Brian Paul 2818ef8653a83800bc4b8e116e03ad52604097224378Brian Paul src += srcRowStride; 2819b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride / sizeof(GLuint); 2820ef8653a83800bc4b8e116e03ad52604097224378Brian Paul } 2821ef8653a83800bc4b8e116e03ad52604097224378Brian Paul } 2822184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul } 2823184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul return GL_TRUE; 2824184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul} 2825184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 2826184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 2827a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz/** 2828a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz * Store a combined depth/stencil texture image. 2829a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz */ 283049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2831a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz_mesa_texstore_s8_z24(TEXSTORE_PARAMS) 2832a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz{ 2833a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz const GLuint depthScale = 0xffffff; 2834a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz const GLint srcRowStride 2835b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 2836a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz GLint img, row; 2837a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz 28381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_S8_Z24); 283939de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || 284039de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat == GL_DEPTH_COMPONENT || 284139de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat == GL_STENCIL_INDEX); 284239de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || 284339de9251c4770fdcce3395643003aa626178446dBrian Paul srcType == GL_UNSIGNED_INT_24_8_EXT); 2844c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca 2845c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (img = 0; img < srcDepth; img++) { 2846d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLuint *dstRow = (GLuint *) dstSlices[img]; 2847b786db06540472beda9cedd18937d6e12855b3ebBrian Paul const GLubyte *src 2848b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2849c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcWidth, srcHeight, 2850c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcFormat, srcType, 2851c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie img, 0, 0); 2852c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (row = 0; row < srcHeight; row++) { 2853c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLuint depth[MAX_WIDTH]; 2854c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLubyte stencil[MAX_WIDTH]; 2855c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLint i; 2856c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; 2857c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2858c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */ 2859c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil = GL_TRUE; 286039de9251c4770fdcce3395643003aa626178446dBrian Paul } 286139de9251c4770fdcce3395643003aa626178446dBrian Paul else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */ 2862c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepdepth = GL_TRUE; 2863c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 2864666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz 2865c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepdepth == GL_FALSE) 2866c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* the 24 depth bits will be in the low position: */ 2867c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_depth_span(ctx, srcWidth, 2868c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_INT, /* dst type */ 2869c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil ? depth : dstRow, /* dst addr */ 2870c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie depthScale, 2871c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking); 2872c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2873c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil == GL_FALSE) 2874c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* get the 8-bit stencil values */ 2875c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_stencil_span(ctx, srcWidth, 2876c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_BYTE, /* dst type */ 2877c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie stencil, /* dst addr */ 2878c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking, 2879c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie ctx->_ImageTransferState); 2880c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2881c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* merge stencil values into depth values */ 2882c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (i = 0; i < srcWidth; i++) { 2883c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil) 2884c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000); 2885c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie else 2886c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24); 2887666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz 2888c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 2889c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie src += srcRowStride; 2890c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow += dstRowStride / sizeof(GLuint); 2891a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz } 2892a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz } 2893a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz return GL_TRUE; 2894a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz} 2895f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 289639de9251c4770fdcce3395643003aa626178446dBrian Paul 289739de9251c4770fdcce3395643003aa626178446dBrian Paul/** 289839de9251c4770fdcce3395643003aa626178446dBrian Paul * Store simple 8-bit/value stencil texture data. 289939de9251c4770fdcce3395643003aa626178446dBrian Paul */ 290039de9251c4770fdcce3395643003aa626178446dBrian Paulstatic GLboolean 290139de9251c4770fdcce3395643003aa626178446dBrian Paul_mesa_texstore_s8(TEXSTORE_PARAMS) 290239de9251c4770fdcce3395643003aa626178446dBrian Paul{ 290339de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(dstFormat == MESA_FORMAT_S8); 290439de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat == GL_STENCIL_INDEX); 290539de9251c4770fdcce3395643003aa626178446dBrian Paul 290639de9251c4770fdcce3395643003aa626178446dBrian Paul if (!ctx->_ImageTransferState && 290739de9251c4770fdcce3395643003aa626178446dBrian Paul !srcPacking->SwapBytes && 290839de9251c4770fdcce3395643003aa626178446dBrian Paul baseInternalFormat == srcFormat && 290939de9251c4770fdcce3395643003aa626178446dBrian Paul srcType == GL_UNSIGNED_BYTE) { 291039de9251c4770fdcce3395643003aa626178446dBrian Paul /* simple memcpy path */ 291139de9251c4770fdcce3395643003aa626178446dBrian Paul memcpy_texture(ctx, dims, 2912d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 29135253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 291439de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 291539de9251c4770fdcce3395643003aa626178446dBrian Paul srcAddr, srcPacking); 291639de9251c4770fdcce3395643003aa626178446dBrian Paul } 291739de9251c4770fdcce3395643003aa626178446dBrian Paul else { 291839de9251c4770fdcce3395643003aa626178446dBrian Paul const GLint srcRowStride 2919b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 292039de9251c4770fdcce3395643003aa626178446dBrian Paul GLint img, row; 292139de9251c4770fdcce3395643003aa626178446dBrian Paul 292239de9251c4770fdcce3395643003aa626178446dBrian Paul for (img = 0; img < srcDepth; img++) { 2923d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 2924b786db06540472beda9cedd18937d6e12855b3ebBrian Paul const GLubyte *src 2925b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 292639de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, 292739de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat, srcType, 292839de9251c4770fdcce3395643003aa626178446dBrian Paul img, 0, 0); 292939de9251c4770fdcce3395643003aa626178446dBrian Paul for (row = 0; row < srcHeight; row++) { 293039de9251c4770fdcce3395643003aa626178446dBrian Paul GLubyte stencil[MAX_WIDTH]; 293139de9251c4770fdcce3395643003aa626178446dBrian Paul GLint i; 293239de9251c4770fdcce3395643003aa626178446dBrian Paul 293339de9251c4770fdcce3395643003aa626178446dBrian Paul /* get the 8-bit stencil values */ 293439de9251c4770fdcce3395643003aa626178446dBrian Paul _mesa_unpack_stencil_span(ctx, srcWidth, 293539de9251c4770fdcce3395643003aa626178446dBrian Paul GL_UNSIGNED_BYTE, /* dst type */ 293639de9251c4770fdcce3395643003aa626178446dBrian Paul stencil, /* dst addr */ 293739de9251c4770fdcce3395643003aa626178446dBrian Paul srcType, src, srcPacking, 293839de9251c4770fdcce3395643003aa626178446dBrian Paul ctx->_ImageTransferState); 293939de9251c4770fdcce3395643003aa626178446dBrian Paul /* merge stencil values into depth values */ 294039de9251c4770fdcce3395643003aa626178446dBrian Paul for (i = 0; i < srcWidth; i++) 294139de9251c4770fdcce3395643003aa626178446dBrian Paul dstRow[i] = stencil[i]; 294239de9251c4770fdcce3395643003aa626178446dBrian Paul 294339de9251c4770fdcce3395643003aa626178446dBrian Paul src += srcRowStride; 294439de9251c4770fdcce3395643003aa626178446dBrian Paul dstRow += dstRowStride / sizeof(GLubyte); 294539de9251c4770fdcce3395643003aa626178446dBrian Paul } 294639de9251c4770fdcce3395643003aa626178446dBrian Paul } 294739de9251c4770fdcce3395643003aa626178446dBrian Paul 294839de9251c4770fdcce3395643003aa626178446dBrian Paul } 294939de9251c4770fdcce3395643003aa626178446dBrian Paul 295039de9251c4770fdcce3395643003aa626178446dBrian Paul return GL_TRUE; 295139de9251c4770fdcce3395643003aa626178446dBrian Paul} 295239de9251c4770fdcce3395643003aa626178446dBrian Paul 295339de9251c4770fdcce3395643003aa626178446dBrian Paul 2954f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 2955f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Store an image in any of the formats: 2956f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_rgba_float32 2957f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_rgb_float32 2958f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_alpha_float32 2959f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_luminance_float32 2960f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_luminance_alpha_float32 2961f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_intensity_float32 2962f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 296349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2964b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float32(TEXSTORE_PARAMS) 2965f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 29661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 296722108bb571808542b89677752d62d3901698265fBrian Paul const GLint components = _mesa_components_in_format(baseFormat); 2968f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 29691f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 || 29701f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB_FLOAT32 || 29711f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ALPHA_FLOAT32 || 29721f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 || 29731f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 || 29740ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_INTENSITY_FLOAT32 || 29750ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_R_FLOAT32 || 29760ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_RG_FLOAT32); 2977f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 2978f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB || 2979f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_ALPHA || 2980f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE || 2981f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 29820ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_INTENSITY || 29830ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RED || 29840ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RG); 298544c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLfloat)); 2986f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2987f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2988f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2989f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 29909e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák baseInternalFormat == baseFormat && 2991f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_FLOAT) { 2992f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 299317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 2994d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 29955253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2996f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2997f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2998f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2999f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 3000f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 3001e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3002f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 300322108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 3004f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 3005f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 3006bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 3007bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 3008b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLfloat *srcRow = tempImage; 30099c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul GLint bytesPerRow; 3010f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 3011f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 3012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 30139c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul bytesPerRow = srcWidth * components * sizeof(GLfloat); 3014f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 3015d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3016f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 3017c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy(dstRow, srcRow, bytesPerRow); 3018b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 3019b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcRow += srcWidth * components; 3020f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3021f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3022f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 302332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 3024f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3025f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 3026f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 3027f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3028c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3029f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3030f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 3031f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * As above, but store 16-bit floats. 3032f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 303349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3034b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float16(TEXSTORE_PARAMS) 3035f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 30361f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 303722108bb571808542b89677752d62d3901698265fBrian Paul const GLint components = _mesa_components_in_format(baseFormat); 3038f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 30391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 || 30401f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB_FLOAT16 || 30411f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ALPHA_FLOAT16 || 30421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 || 30431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 || 30440ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_INTENSITY_FLOAT16 || 30450ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_R_FLOAT16 || 30460ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_RG_FLOAT16); 3047f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3048f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB || 3049f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_ALPHA || 3050f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE || 3051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 30520ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_INTENSITY || 30530ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RED || 30540ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RG); 305544c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLhalfARB)); 3056f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 3058f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 3059f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 30609e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák baseInternalFormat == baseFormat && 3061f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_HALF_FLOAT_ARB) { 3062f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 306317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 3064d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 30655253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3066f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3067f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 3068f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3069f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 3070f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 3071e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3072f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 307322108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 3074f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 3075f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 3076bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 3077bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 3078f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLfloat *src = tempImage; 3079f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 3080f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 3081f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 3082f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 3083d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3084f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 3085f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLhalfARB *dstTexel = (GLhalfARB *) dstRow; 3086f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i; 3087f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < srcWidth * components; i++) { 3088f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstTexel[i] = _mesa_float_to_half(src[i]); 3089f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3090f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 3091f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcWidth * components; 3092f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3093f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3094f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 309532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 3096f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3097f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 3098f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 3099f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3100f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3101abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int8 */ 3102abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3103abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int8(TEXSTORE_PARAMS) 3104abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3105abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3106abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3107abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 310838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_INT8 || 310938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_INT8 || 311038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_INT8 || 311138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_INT8 || 311238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_INT8 || 311338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_INT8 || 311438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_INT8 || 311538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT8); 3116abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3117abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3118f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RG || 3119f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RED || 3120abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3121abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3122abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3123abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 312444c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLbyte)); 3125abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3126bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3127bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3128bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3129bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3130abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3131abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_BYTE) { 3132abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3133abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3134d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 31355253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3136abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3137abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3138abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3139abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3140abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 31415f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt const GLuint *tempImage = make_temp_uint_image(ctx, dims, 31425f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt baseInternalFormat, 31435f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt baseFormat, 31445f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcWidth, srcHeight, srcDepth, 31455f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcFormat, srcType, 31465f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcAddr, 31475f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcPacking); 31485f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt const GLuint *src = tempImage; 3149abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3150abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3151abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3152abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3153d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3154abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3155abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLbyte *dstTexel = (GLbyte *) dstRow; 3156abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3157abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3158abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLbyte) src[i]; 3159abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3160abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3161abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3162abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3163abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3164abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3165abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3166abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3167abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3168abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3169abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3170abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3171abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int16 */ 3172abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3173abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int16(TEXSTORE_PARAMS) 3174abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3175abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3176abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3177abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 317838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_INT16 || 317938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_INT16 || 318038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_INT16 || 318138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_INT16 || 318238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_INT16 || 318338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_INT16 || 318438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_INT16 || 318538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT16); 3186abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3187abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3188f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RG || 3189f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RED || 3190abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3191abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3192abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3193abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 319444c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLshort)); 3195abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3196bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3197bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3198bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3199bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3200abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 32019fc7fa0a4cbe9dc8faa124744f623491fa754bd7Brian Paul srcType == GL_SHORT) { 3202abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3203abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3204d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 32055253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3206abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3207abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3208abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3209abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3210abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 32115f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt const GLuint *tempImage = make_temp_uint_image(ctx, dims, 32125f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt baseInternalFormat, 32135f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt baseFormat, 32145f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcWidth, srcHeight, srcDepth, 32155f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcFormat, srcType, 32165f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcAddr, 32175f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcPacking); 32185f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt const GLuint *src = tempImage; 3219abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3220abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3221abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3222abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3223d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3224abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3225abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLshort *dstTexel = (GLshort *) dstRow; 3226abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3227abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3228abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLint) src[i]; 3229abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3230abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3231abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3232abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3233abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3234abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3235abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3236abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3237abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3238abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3239abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3240abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3241abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int32 */ 3242abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3243abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int32(TEXSTORE_PARAMS) 3244abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3245abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3246abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3247abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 324838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_INT32 || 324938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_INT32 || 325038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_INT32 || 325138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_INT32 || 325238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_INT32 || 325338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_INT32 || 325438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_INT32 || 325538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT32); 3256abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3257abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3258f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RG || 3259f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RED || 3260abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3261abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3262abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3263abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 326444c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLint)); 3265abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3266bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3267bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3268bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3269bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3270abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3271abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_INT) { 3272abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3273abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3274d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 32755253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3276abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3277abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3278abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3279abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3280abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 32815f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt const GLuint *tempImage = make_temp_uint_image(ctx, dims, 32825f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt baseInternalFormat, 32835f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt baseFormat, 32845f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcWidth, srcHeight, srcDepth, 32855f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcFormat, srcType, 32865f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcAddr, 32875f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcPacking); 32885f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt const GLuint *src = tempImage; 3289abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3290abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3291abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3292abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3293d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3294abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3295abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint *dstTexel = (GLint *) dstRow; 3296abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3297abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3298abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstTexel[i] = (GLint) src[i]; 3299abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3300abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3301abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3302abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3303abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3304abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3305abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3306abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3307abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3308abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3309abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3310abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3311abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int8 */ 3312abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3313abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS) 3314abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3315abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3316abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3317abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 331838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_UINT8 || 331938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_UINT8 || 332038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_UINT8 || 332138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_UINT8 || 332238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_UINT8 || 332338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_UINT8 || 332438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_UINT8 || 332538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT8); 3326abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3327abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3328f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RG || 3329f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RED || 3330abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3331abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3332abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3333abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 333444c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLubyte)); 3335abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3336bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3337bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3338bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3339bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3340abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3341abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_BYTE) { 3342abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3343abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3344d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 33455253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3346abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3347abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3348abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3349abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3350abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3351dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *tempImage = 3352dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3353dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, srcDepth, 3354dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, srcAddr, srcPacking); 3355dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *src = tempImage; 3356abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3357abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3358abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3359abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3360d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3361abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3362abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstTexel = (GLubyte *) dstRow; 3363abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3364abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3365dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dstTexel[i] = (GLubyte) CLAMP(src[i], 0, 0xff); 3366abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3367abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3368abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3369abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3370abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3371abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3372abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3373abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3374abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3375abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3376abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3377abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3378abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int16 */ 3379abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3380abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS) 3381abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3382abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3383abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3384abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 338538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_UINT16 || 338638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_UINT16 || 338738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_UINT16 || 338838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_UINT16 || 338938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_UINT16 || 339038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_UINT16 || 339138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_UINT16 || 339238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT16); 3393abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3394abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3395f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RG || 3396f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RED || 3397abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3398abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3399abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3400abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 340144c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLushort)); 3402abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3403bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3404bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3405bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3406bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3407abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3408abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_SHORT) { 3409abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3410abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3411d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 34125253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3413abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3414abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3415abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3416abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3417abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3418dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *tempImage = 3419dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3420dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, srcDepth, 3421dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, srcAddr, srcPacking); 3422dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *src = tempImage; 3423abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3424abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3425abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3426abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3427d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3428abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3429abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLushort *dstTexel = (GLushort *) dstRow; 3430abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3431abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3432dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dstTexel[i] = (GLushort) CLAMP(src[i], 0, 0xffff); 3433abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3434abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3435abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3436abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3437abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3438abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3439abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3440abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3441abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3442abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3443abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3444abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3445abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int32 */ 3446abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3447abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS) 3448abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3449abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3450abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3451abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 345238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_UINT32 || 345338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_UINT32 || 345438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_UINT32 || 345538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_UINT32 || 345638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_UINT32 || 345738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_UINT32 || 345838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_UINT32 || 345938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT32); 3460abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3461abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3462f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RG || 3463f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RED || 3464abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3465abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3466abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3467abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 346844c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLuint)); 3469abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3470bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3471bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3472bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3473bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3474abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3475abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_INT) { 3476abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3477abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3478d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 34795253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3480abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3481abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3482abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3483abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3484abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3485dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *tempImage = 3486dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3487dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, srcDepth, 3488dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, srcAddr, srcPacking); 3489dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *src = tempImage; 3490abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3491abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3492abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3493abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3494d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3495abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3496abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLuint *dstTexel = (GLuint *) dstRow; 3497abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3498abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (i = 0; i < srcWidth * components; i++) { 3499dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul dstTexel[i] = src[i]; 3500abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3501abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3502abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3503abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3504abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3505abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3506abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3507abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3508abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3509abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3510abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3511abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3512abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3513abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 35148d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#if FEATURE_EXT_texture_sRGB 351549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 35168d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgb8(TEXSTORE_PARAMS) 35178d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 35181f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 351946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 352046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 35211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SRGB8); 352246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 352346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal rgb texstore code */ 35241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_RGB888; 352546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 35260f91e4461fb3a7410c948acde270d97caa851ed6Brian Paul k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat, 35275253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 35285253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 352939de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, srcDepth, 353039de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat, srcType, 353139de9251c4770fdcce3395643003aa626178446dBrian Paul srcAddr, srcPacking); 353246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 35338d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 35348d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 353554e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 353649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 35378d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgba8(TEXSTORE_PARAMS) 35388d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 35391f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 354046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 354146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 35421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SRGBA8); 354346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 354446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal rgba texstore code */ 35451f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_RGBA8888; 354646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat, 35475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 35485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 354946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcWidth, srcHeight, srcDepth, 355046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcFormat, srcType, 355146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcAddr, srcPacking); 355246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 35538d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 35548d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 355554e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 355649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 35575bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger_mesa_texstore_sargb8(TEXSTORE_PARAMS) 35585bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{ 35591f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 35605bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger GLboolean k; 35615bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 35621f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SARGB8); 35635bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 35645bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger /* reuse normal rgba texstore code */ 35651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_ARGB8888; 35665bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 35675bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat, 35685253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 35695253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 35705bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcWidth, srcHeight, srcDepth, 35715bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcFormat, srcType, 35725bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcAddr, srcPacking); 35735bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger return k; 35745bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger} 35755bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 35765bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 357749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 35788d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sl8(TEXSTORE_PARAMS) 35798d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 35801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 358146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 358246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 35831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SL8); 358446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 35851f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_L8; 358646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 358754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul /* _mesa_textore_a8 handles luminance8 too */ 3588bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák k = _mesa_texstore_unorm8(ctx, dims, baseInternalFormat, 35895253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 35905253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 35915253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul srcWidth, srcHeight, srcDepth, 35925253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul srcFormat, srcType, 35935253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul srcAddr, srcPacking); 359446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 35958d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 35968d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 359754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 359849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 35998d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sla8(TEXSTORE_PARAMS) 36008d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 36011f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 360246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 360346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 36041f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SLA8); 360546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 360646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal luminance/alpha texstore code */ 36071f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_AL88; 360846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 36095d1387b2da3626326410804026f8b92f1a121fdcIan Romanick k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat, 36105253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 36115253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 36125d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, 36135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcFormat, srcType, 36145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcAddr, srcPacking); 361546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 36168d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 36178d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 36189927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#else 36199927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu 36209927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu/* these are used only in texstore_funcs[] below */ 36219927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgb8 NULL 36229927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgba8 NULL 36239927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sargb8 NULL 36249927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sl8 NULL 36259927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sla8 NULL 36269927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu 36278d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#endif /* FEATURE_EXT_texture_sRGB */ 36288d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 36299d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšákstatic GLboolean 36309d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák_mesa_texstore_rgb9_e5(TEXSTORE_PARAMS) 36319d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák{ 36329d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 36339d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák 36349d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák ASSERT(dstFormat == MESA_FORMAT_RGB9_E5_FLOAT); 36359d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák ASSERT(baseInternalFormat == GL_RGB); 36369d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák 36379d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák if (!ctx->_ImageTransferState && 363807ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 363907ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul srcPacking->SwapBytes)) { 36409d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák /* simple memcpy path */ 36419d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák memcpy_texture(ctx, dims, 3642d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 36435253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 36449d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 36459d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcAddr, srcPacking); 36469d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 36479d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák else { 36489d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák /* general path */ 36499d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 36509d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák baseInternalFormat, 36519d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák baseFormat, 36529d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcWidth, srcHeight, srcDepth, 36539d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcFormat, srcType, srcAddr, 36549d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcPacking, 36559d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák ctx->_ImageTransferState); 36569d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLfloat *srcRow = tempImage; 36579d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLint img, row, col; 36589d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák if (!tempImage) 36599d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák return GL_FALSE; 36609d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (img = 0; img < srcDepth; img++) { 3661d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 36629d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (row = 0; row < srcHeight; row++) { 36639d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLuint *dstUI = (GLuint*)dstRow; 36649d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (col = 0; col < srcWidth; col++) { 36659d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák dstUI[col] = float3_to_rgb9e5(&srcRow[col * 3]); 36669d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 36679d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák dstRow += dstRowStride; 36689d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcRow += srcWidth * 3; 36699d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 36709d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 36719d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák 36729d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák free((void *) tempImage); 36739d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 36749d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák return GL_TRUE; 36759d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák} 3676f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3677631d23daa91c569bf268a2191bd466df73a64263Marek Olšákstatic GLboolean 3678631d23daa91c569bf268a2191bd466df73a64263Marek Olšák_mesa_texstore_r11_g11_b10f(TEXSTORE_PARAMS) 3679631d23daa91c569bf268a2191bd466df73a64263Marek Olšák{ 3680631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3681631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 3682631d23daa91c569bf268a2191bd466df73a64263Marek Olšák ASSERT(dstFormat == MESA_FORMAT_R11_G11_B10_FLOAT); 3683631d23daa91c569bf268a2191bd466df73a64263Marek Olšák ASSERT(baseInternalFormat == GL_RGB); 3684631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 3685631d23daa91c569bf268a2191bd466df73a64263Marek Olšák if (!ctx->_ImageTransferState && 368607ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 368707ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul srcPacking->SwapBytes)) { 3688631d23daa91c569bf268a2191bd466df73a64263Marek Olšák /* simple memcpy path */ 3689631d23daa91c569bf268a2191bd466df73a64263Marek Olšák memcpy_texture(ctx, dims, 3690d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 36915253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3692631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3693631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcAddr, srcPacking); 3694631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3695631d23daa91c569bf268a2191bd466df73a64263Marek Olšák else { 3696631d23daa91c569bf268a2191bd466df73a64263Marek Olšák /* general path */ 3697631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3698631d23daa91c569bf268a2191bd466df73a64263Marek Olšák baseInternalFormat, 3699631d23daa91c569bf268a2191bd466df73a64263Marek Olšák baseFormat, 3700631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcWidth, srcHeight, srcDepth, 3701631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcFormat, srcType, srcAddr, 3702631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcPacking, 3703631d23daa91c569bf268a2191bd466df73a64263Marek Olšák ctx->_ImageTransferState); 3704631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLfloat *srcRow = tempImage; 3705631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLint img, row, col; 3706631d23daa91c569bf268a2191bd466df73a64263Marek Olšák if (!tempImage) 3707631d23daa91c569bf268a2191bd466df73a64263Marek Olšák return GL_FALSE; 3708631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (img = 0; img < srcDepth; img++) { 3709d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3710631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (row = 0; row < srcHeight; row++) { 3711631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLuint *dstUI = (GLuint*)dstRow; 3712631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (col = 0; col < srcWidth; col++) { 3713631d23daa91c569bf268a2191bd466df73a64263Marek Olšák dstUI[col] = float3_to_r11g11b10f(&srcRow[col * 3]); 3714631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3715631d23daa91c569bf268a2191bd466df73a64263Marek Olšák dstRow += dstRowStride; 3716631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcRow += srcWidth * 3; 3717631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3718631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3719631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 3720631d23daa91c569bf268a2191bd466df73a64263Marek Olšák free((void *) tempImage); 3721631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3722631d23daa91c569bf268a2191bd466df73a64263Marek Olšák return GL_TRUE; 3723631d23daa91c569bf268a2191bd466df73a64263Marek Olšák} 3724631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 3725485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3726b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšákstatic GLboolean 3727b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák_mesa_texstore_z32f_x24s8(TEXSTORE_PARAMS) 3728b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák{ 3729b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ASSERT(dstFormat == MESA_FORMAT_Z32_FLOAT_X24S8); 3730b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ASSERT(srcFormat == GL_DEPTH_STENCIL || 3731b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat == GL_DEPTH_COMPONENT || 3732b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat == GL_STENCIL_INDEX); 3733b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ASSERT(srcFormat != GL_DEPTH_STENCIL || 3734b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 3735b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 3736b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák if (srcFormat == GL_DEPTH_STENCIL && 3737b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ctx->Pixel.DepthScale == 1.0f && 3738b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ctx->Pixel.DepthBias == 0.0f && 3739b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák !srcPacking->SwapBytes) { 3740b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák /* simple path */ 3741b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák memcpy_texture(ctx, dims, 3742d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 37435253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3744b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3745b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcAddr, srcPacking); 3746b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 3747b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák else if (srcFormat == GL_DEPTH_COMPONENT || 3748b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat == GL_STENCIL_INDEX) { 3749b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák GLint img, row; 3750b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák const GLint srcRowStride 3751b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType) 3752b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák / sizeof(uint64_t); 3753b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 3754b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák /* In case we only upload depth we need to preserve the stencil */ 3755b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák for (img = 0; img < srcDepth; img++) { 3756d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul uint64_t *dstRow = (uint64_t *) dstSlices[img]; 3757b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák const uint64_t *src 3758b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák = (const uint64_t *) _mesa_image_address(dims, srcPacking, srcAddr, 3759b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcWidth, srcHeight, 3760b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat, srcType, 3761b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák img, 0, 0); 3762b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák for (row = 0; row < srcHeight; row++) { 3763b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák /* The unpack functions with: 3764b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák * dstType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV 3765b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák * only write their own dword, so the other dword (stencil 3766b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák * or depth) is preserved. */ 3767b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák if (srcFormat != GL_STENCIL_INDEX) 3768b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák _mesa_unpack_depth_span(ctx, srcWidth, 3769b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */ 3770b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstRow, /* dst addr */ 3771a240c998ac649d79f423bb0c445993132cd56f97Brian Paul ~0U, srcType, src, srcPacking); 3772b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 3773b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák if (srcFormat != GL_DEPTH_COMPONENT) 3774b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák _mesa_unpack_stencil_span(ctx, srcWidth, 3775b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */ 3776b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstRow, /* dst addr */ 3777b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcType, src, srcPacking, 3778b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ctx->_ImageTransferState); 3779b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 3780b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák src += srcRowStride; 3781b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstRow += dstRowStride / sizeof(uint64_t); 3782b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 3783b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 3784b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 3785b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák return GL_TRUE; 3786b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák} 3787b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 3788920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wustatic GLboolean 3789f449be660e70aac2aefd2ce84581e137de25520bDave Airlie_mesa_texstore_argb2101010_uint(TEXSTORE_PARAMS) 3790f449be660e70aac2aefd2ce84581e137de25520bDave Airlie{ 3791f449be660e70aac2aefd2ce84581e137de25520bDave Airlie const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3792f449be660e70aac2aefd2ce84581e137de25520bDave Airlie 3793f449be660e70aac2aefd2ce84581e137de25520bDave Airlie ASSERT(dstFormat == MESA_FORMAT_ARGB2101010_UINT); 379444c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 3795f449be660e70aac2aefd2ce84581e137de25520bDave Airlie 379607ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul if (baseInternalFormat == GL_RGBA && 379707ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 379807ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul srcPacking->SwapBytes)) { 3799f449be660e70aac2aefd2ce84581e137de25520bDave Airlie /* simple memcpy path */ 3800f449be660e70aac2aefd2ce84581e137de25520bDave Airlie memcpy_texture(ctx, dims, 3801d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 3802f449be660e70aac2aefd2ce84581e137de25520bDave Airlie dstRowStride, dstSlices, 3803f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3804f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcAddr, srcPacking); 3805f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 3806f449be660e70aac2aefd2ce84581e137de25520bDave Airlie else { 3807f449be660e70aac2aefd2ce84581e137de25520bDave Airlie /* general path */ 3808f449be660e70aac2aefd2ce84581e137de25520bDave Airlie const GLuint *tempImage = make_temp_uint_image(ctx, dims, 3809f449be660e70aac2aefd2ce84581e137de25520bDave Airlie baseInternalFormat, 3810f449be660e70aac2aefd2ce84581e137de25520bDave Airlie baseFormat, 3811f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcWidth, srcHeight, 3812f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcDepth, srcFormat, 3813f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcType, srcAddr, 3814f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcPacking); 3815f449be660e70aac2aefd2ce84581e137de25520bDave Airlie const GLuint *src = tempImage; 3816f449be660e70aac2aefd2ce84581e137de25520bDave Airlie GLint img, row, col; 3817f449be660e70aac2aefd2ce84581e137de25520bDave Airlie if (!tempImage) 3818f449be660e70aac2aefd2ce84581e137de25520bDave Airlie return GL_FALSE; 3819f449be660e70aac2aefd2ce84581e137de25520bDave Airlie for (img = 0; img < srcDepth; img++) { 3820d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3821f449be660e70aac2aefd2ce84581e137de25520bDave Airlie 3822f449be660e70aac2aefd2ce84581e137de25520bDave Airlie for (row = 0; row < srcHeight; row++) { 3823f449be660e70aac2aefd2ce84581e137de25520bDave Airlie GLuint *dstUI = (GLuint *) dstRow; 3824f449be660e70aac2aefd2ce84581e137de25520bDave Airlie for (col = 0; col < srcWidth; col++) { 3825f449be660e70aac2aefd2ce84581e137de25520bDave Airlie GLushort a,r,g,b; 3826f449be660e70aac2aefd2ce84581e137de25520bDave Airlie r = src[RCOMP]; 3827f449be660e70aac2aefd2ce84581e137de25520bDave Airlie g = src[GCOMP]; 3828f449be660e70aac2aefd2ce84581e137de25520bDave Airlie b = src[BCOMP]; 3829f449be660e70aac2aefd2ce84581e137de25520bDave Airlie a = src[ACOMP]; 3830f449be660e70aac2aefd2ce84581e137de25520bDave Airlie dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b); 3831f449be660e70aac2aefd2ce84581e137de25520bDave Airlie src += 4; 3832f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 3833f449be660e70aac2aefd2ce84581e137de25520bDave Airlie dstRow += dstRowStride; 3834f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 3835f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 3836f449be660e70aac2aefd2ce84581e137de25520bDave Airlie free((void *) tempImage); 3837f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 3838f449be660e70aac2aefd2ce84581e137de25520bDave Airlie return GL_TRUE; 3839f449be660e70aac2aefd2ce84581e137de25520bDave Airlie} 3840f449be660e70aac2aefd2ce84581e137de25520bDave Airlie 3841f449be660e70aac2aefd2ce84581e137de25520bDave Airliestatic GLboolean 3842920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu_mesa_texstore_null(TEXSTORE_PARAMS) 3843920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu{ 3844920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) ctx; (void) dims; 3845920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) baseInternalFormat; 3846920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstFormat; 38475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul (void) dstRowStride; (void) dstSlices, 3848920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcWidth; (void) srcHeight; (void) srcDepth; 3849920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcFormat; (void) srcType; 3850920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcAddr; 3851920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcPacking; 3852920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 3853920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu /* should never happen */ 3854920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu _mesa_problem(NULL, "_mesa_texstore_null() is called"); 3855920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu return GL_FALSE; 3856920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu} 3857920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 3858920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 3859485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/** 3860485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Return the StoreTexImageFunc pointer to store an image in the given format. 3861485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */ 3862e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paulstatic StoreTexImageFunc 3863485105ed182e2e997b084f047e72d5a2c3460057Brian Paul_mesa_get_texstore_func(gl_format format) 3864485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{ 38656e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie static StoreTexImageFunc table[MESA_FORMAT_COUNT]; 38666e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie static GLboolean initialized = GL_FALSE; 38676e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie 38686e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie if (!initialized) { 38696e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_NONE] = _mesa_texstore_null; 38706e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie 38716e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA8888] = _mesa_texstore_rgba8888; 38726e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA8888_REV] = _mesa_texstore_rgba8888; 38736e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB8888] = _mesa_texstore_argb8888; 38746e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB8888_REV] = _mesa_texstore_argb8888; 3875d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu table[MESA_FORMAT_RGBX8888] = _mesa_texstore_rgba8888; 3876d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu table[MESA_FORMAT_RGBX8888_REV] = _mesa_texstore_rgba8888; 38776e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_XRGB8888] = _mesa_texstore_argb8888; 38786e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_XRGB8888_REV] = _mesa_texstore_argb8888; 38796e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB888] = _mesa_texstore_rgb888; 38806e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_BGR888] = _mesa_texstore_bgr888; 38816e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB565] = _mesa_texstore_rgb565; 38826e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB565_REV] = _mesa_texstore_rgb565; 38836e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB4444] = _mesa_texstore_argb4444; 38846e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB4444_REV] = _mesa_texstore_argb4444; 38856e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA5551] = _mesa_texstore_rgba5551; 38866e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB1555] = _mesa_texstore_argb1555; 38876e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB1555_REV] = _mesa_texstore_argb1555; 38886e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL44] = _mesa_texstore_unorm44; 38896e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL88] = _mesa_texstore_unorm88; 38906e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL88_REV] = _mesa_texstore_unorm88; 38916e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL1616] = _mesa_texstore_unorm1616; 38926e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL1616_REV] = _mesa_texstore_unorm1616; 38936e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB332] = _mesa_texstore_rgb332; 38946e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_A8] = _mesa_texstore_unorm8; 38956e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_A16] = _mesa_texstore_unorm16; 38966e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_L8] = _mesa_texstore_unorm8; 38976e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_L16] = _mesa_texstore_unorm16; 38986e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_I8] = _mesa_texstore_unorm8; 38996e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_I16] = _mesa_texstore_unorm16; 39006e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_YCBCR] = _mesa_texstore_ycbcr; 39016e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_YCBCR_REV] = _mesa_texstore_ycbcr; 39026e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R8] = _mesa_texstore_unorm8; 39030a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul table[MESA_FORMAT_GR88] = _mesa_texstore_unorm88; 3904b4aecc4e1861e60e40e14868719219084967e46dBrian Paul table[MESA_FORMAT_RG88] = _mesa_texstore_unorm88; 39056e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R16] = _mesa_texstore_unorm16; 39066e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG1616] = _mesa_texstore_unorm1616; 39076e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG1616_REV] = _mesa_texstore_unorm1616; 39086e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB2101010] = _mesa_texstore_argb2101010; 39096e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z24_S8] = _mesa_texstore_z24_s8; 39106e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_S8_Z24] = _mesa_texstore_s8_z24; 39116e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z16] = _mesa_texstore_z16; 39126e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_X8_Z24] = _mesa_texstore_x8_z24; 39136e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z24_X8] = _mesa_texstore_z24_x8; 39146e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z32] = _mesa_texstore_z32; 39156e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_S8] = _mesa_texstore_s8; 39166e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGB8] = _mesa_texstore_srgb8; 39176e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGBA8] = _mesa_texstore_srgba8; 39186e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SARGB8] = _mesa_texstore_sargb8; 39196e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SL8] = _mesa_texstore_sl8; 39206e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SLA8] = _mesa_texstore_sla8; 39216e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGB_DXT1] = _mesa_texstore_rgb_dxt1; 39226e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGBA_DXT1] = _mesa_texstore_rgba_dxt1; 39236e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGBA_DXT3] = _mesa_texstore_rgba_dxt3; 39246e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGBA_DXT5] = _mesa_texstore_rgba_dxt5; 39256e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB_FXT1] = _mesa_texstore_rgb_fxt1; 39266e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_FXT1] = _mesa_texstore_rgba_fxt1; 39276e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB_DXT1] = _mesa_texstore_rgb_dxt1; 39286e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_DXT1] = _mesa_texstore_rgba_dxt1; 39296e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_DXT3] = _mesa_texstore_rgba_dxt3; 39306e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_DXT5] = _mesa_texstore_rgba_dxt5; 39316e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_FLOAT32] = _mesa_texstore_rgba_float32; 39326e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_FLOAT16] = _mesa_texstore_rgba_float16; 39336e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB_FLOAT32] = _mesa_texstore_rgba_float32; 39346e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB_FLOAT16] = _mesa_texstore_rgba_float16; 39356e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32; 39366e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16; 39376e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LUMINANCE_FLOAT32] = _mesa_texstore_rgba_float32; 39386e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LUMINANCE_FLOAT16] = _mesa_texstore_rgba_float16; 39396e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32; 39406e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16; 39416e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_INTENSITY_FLOAT32] = _mesa_texstore_rgba_float32; 39426e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_INTENSITY_FLOAT16] = _mesa_texstore_rgba_float16; 39436e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R_FLOAT32] = _mesa_texstore_rgba_float32; 39446e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R_FLOAT16] = _mesa_texstore_rgba_float16; 39456e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG_FLOAT32] = _mesa_texstore_rgba_float32; 39466e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG_FLOAT16] = _mesa_texstore_rgba_float16; 39476e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_DUDV8] = _mesa_texstore_dudv8; 39486e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_R8] = _mesa_texstore_snorm8; 39496e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RG88_REV] = _mesa_texstore_snorm88; 39506e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGBX8888] = _mesa_texstore_signed_rgbx8888; 39516e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGBA8888] = _mesa_texstore_signed_rgba8888; 39526e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGBA8888_REV] = _mesa_texstore_signed_rgba8888; 39536e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_R16] = _mesa_texstore_snorm16; 39546e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_GR1616] = _mesa_texstore_snorm1616; 39556e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGB_16] = _mesa_texstore_signed_rgba_16; 39566e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGBA_16] = _mesa_texstore_signed_rgba_16; 39576e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_16] = _mesa_texstore_rgba_16; 39586e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RED_RGTC1] = _mesa_texstore_red_rgtc1; 39596e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RED_RGTC1] = _mesa_texstore_signed_red_rgtc1; 39606e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG_RGTC2] = _mesa_texstore_rg_rgtc2; 39616e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RG_RGTC2] = _mesa_texstore_signed_rg_rgtc2; 39626e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_L_LATC1] = _mesa_texstore_red_rgtc1; 39636e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_L_LATC1] = _mesa_texstore_signed_red_rgtc1; 39646e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LA_LATC2] = _mesa_texstore_rg_rgtc2; 39656e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_LA_LATC2] = _mesa_texstore_signed_rg_rgtc2; 3966d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu table[MESA_FORMAT_ETC1_RGB8] = _mesa_texstore_etc1_rgb8; 39676e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_A8] = _mesa_texstore_snorm8; 39686e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_L8] = _mesa_texstore_snorm8; 39696e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_AL88] = _mesa_texstore_snorm88; 39706e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_I8] = _mesa_texstore_snorm8; 39716e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_A16] = _mesa_texstore_snorm16; 39726e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_L16] = _mesa_texstore_snorm16; 39736e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_AL1616] = _mesa_texstore_snorm1616; 39746e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_I16] = _mesa_texstore_snorm16; 39756e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB9_E5_FLOAT] = _mesa_texstore_rgb9_e5; 39766e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R11_G11_B10_FLOAT] = _mesa_texstore_r11_g11_b10f; 39776e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z32_FLOAT] = _mesa_texstore_z32; 39786e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z32_FLOAT_X24S8] = _mesa_texstore_z32f_x24s8; 397938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 398038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_UINT8] = _mesa_texstore_rgba_uint8; 398138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_UINT16] = _mesa_texstore_rgba_uint16; 398238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_UINT32] = _mesa_texstore_rgba_uint32; 398338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_INT8] = _mesa_texstore_rgba_int8; 398438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_INT16] = _mesa_texstore_rgba_int16; 398538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_INT32] = _mesa_texstore_rgba_int32; 398638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 398738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_UINT8] = _mesa_texstore_rgba_uint8; 398838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_UINT16] = _mesa_texstore_rgba_uint16; 398938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_UINT32] = _mesa_texstore_rgba_uint32; 399038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_INT8] = _mesa_texstore_rgba_int8; 399138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_INT16] = _mesa_texstore_rgba_int16; 399238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_INT32] = _mesa_texstore_rgba_int32; 399338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 399438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_UINT8] = _mesa_texstore_rgba_uint8; 399538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_UINT16] = _mesa_texstore_rgba_uint16; 399638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_UINT32] = _mesa_texstore_rgba_uint32; 399738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_INT8] = _mesa_texstore_rgba_int8; 399838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_INT16] = _mesa_texstore_rgba_int16; 399938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_INT32] = _mesa_texstore_rgba_int32; 400038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 400138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = _mesa_texstore_rgba_uint8; 400238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = _mesa_texstore_rgba_uint16; 400338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = _mesa_texstore_rgba_uint32; 400438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_INT8] = _mesa_texstore_rgba_int8; 400538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_INT16] = _mesa_texstore_rgba_int16; 400638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_INT32] = _mesa_texstore_rgba_int32; 400738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 400838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_INT8] = _mesa_texstore_rgba_int8; 400938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_INT8] = _mesa_texstore_rgba_int8; 401038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_INT8] = _mesa_texstore_rgba_int8; 401138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_INT8] = _mesa_texstore_rgba_int8; 401238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_INT16] = _mesa_texstore_rgba_int16; 401338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_INT16] = _mesa_texstore_rgba_int16; 401438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_INT16] = _mesa_texstore_rgba_int16; 401538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_INT16] = _mesa_texstore_rgba_int16; 401638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_INT32] = _mesa_texstore_rgba_int32; 401738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_INT32] = _mesa_texstore_rgba_int32; 401838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_INT32] = _mesa_texstore_rgba_int32; 401938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_INT32] = _mesa_texstore_rgba_int32; 402038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 402138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_UINT8] = _mesa_texstore_rgba_uint8; 402238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_UINT8] = _mesa_texstore_rgba_uint8; 402338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_UINT8] = _mesa_texstore_rgba_uint8; 402438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_UINT8] = _mesa_texstore_rgba_uint8; 402538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_UINT16] = _mesa_texstore_rgba_uint16; 402638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_UINT16] = _mesa_texstore_rgba_uint16; 402738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_UINT16] = _mesa_texstore_rgba_uint16; 402838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_UINT16] = _mesa_texstore_rgba_uint16; 402938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_UINT32] = _mesa_texstore_rgba_uint32; 403038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_UINT32] = _mesa_texstore_rgba_uint32; 403138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_UINT32] = _mesa_texstore_rgba_uint32; 403238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_UINT32] = _mesa_texstore_rgba_uint32; 403338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 4034f449be660e70aac2aefd2ce84581e137de25520bDave Airlie table[MESA_FORMAT_ARGB2101010_UINT] = _mesa_texstore_argb2101010_uint; 40356e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie initialized = GL_TRUE; 4036485105ed182e2e997b084f047e72d5a2c3460057Brian Paul } 4037920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 40386e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie ASSERT(table[format]); 40396e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie return table[format]; 4040485105ed182e2e997b084f047e72d5a2c3460057Brian Paul} 4041485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 4042485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 4043660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul/** 4044660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Store user data into texture memory. 4045660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Called via glTex[Sub]Image1/2/3D() 4046660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul */ 4047660ca9c5a23240abca084089a626d4a94ef0799fBrian PaulGLboolean 4048660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul_mesa_texstore(TEXSTORE_PARAMS) 4049660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul{ 4050660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul StoreTexImageFunc storeImage; 4051660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul GLboolean success; 4052660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 40531f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul storeImage = _mesa_get_texstore_func(dstFormat); 4054660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 4055660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul success = storeImage(ctx, dims, baseInternalFormat, 4056d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 40575253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 4058660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul srcWidth, srcHeight, srcDepth, 4059660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul srcFormat, srcType, srcAddr, srcPacking); 4060660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul return success; 4061660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul} 4062660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 4063485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 406481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul/** 406581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * Normally, we'll only _write_ texel data to a texture when we map it. 406681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * But if the user is providing depth or stencil values and the texture 406781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * image is a combined depth/stencil format, we'll actually read from 406881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * the texture buffer too (in order to insert the depth or stencil values. 406981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param userFormat the user-provided image format 407081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param texFormat the destination texture format 407181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul */ 407281430ab54f57590c99883eadf622d2ecfae19c49Brian Paulstatic GLbitfield 407381430ab54f57590c99883eadf622d2ecfae19c49Brian Paulget_read_write_mode(GLenum userFormat, gl_format texFormat) 40745999c5b620236fb6a996cf56759aec31f01c126bBrian Paul{ 407581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if ((userFormat == GL_STENCIL_INDEX || userFormat == GL_DEPTH_COMPONENT) 407681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul && _mesa_get_format_base_format(texFormat) == GL_DEPTH_STENCIL) 407781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul return GL_MAP_READ_BIT | GL_MAP_WRITE_BIT; 407881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul else 407964fdfefb9d1136c5f98f3e3b2ba716c224a4d792Brian Paul return GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT; 40805999c5b620236fb6a996cf56759aec31f01c126bBrian Paul} 40815999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 40825c818c6277247468ccf69abda00f5bc220b59644Brian Paul 4083ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul/** 40845c818c6277247468ccf69abda00f5bc220b59644Brian Paul * Helper function for storing 1D, 2D, 3D whole and subimages into texture 40855c818c6277247468ccf69abda00f5bc220b59644Brian Paul * memory. 40865c818c6277247468ccf69abda00f5bc220b59644Brian Paul * The source of the image data may be user memory or a PBO. In the later 40875c818c6277247468ccf69abda00f5bc220b59644Brian Paul * case, we'll map the PBO, copy from it, then unmap it. 40885c818c6277247468ccf69abda00f5bc220b59644Brian Paul */ 40895c818c6277247468ccf69abda00f5bc220b59644Brian Paulstatic void 40905c818c6277247468ccf69abda00f5bc220b59644Brian Paulstore_texsubimage(struct gl_context *ctx, 40915c818c6277247468ccf69abda00f5bc220b59644Brian Paul struct gl_texture_image *texImage, 40925c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 40935c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLint width, GLint height, GLint depth, 40945c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 40955c818c6277247468ccf69abda00f5bc220b59644Brian Paul const struct gl_pixelstore_attrib *packing, 40965c818c6277247468ccf69abda00f5bc220b59644Brian Paul const char *caller) 40975c818c6277247468ccf69abda00f5bc220b59644Brian Paul 40985c818c6277247468ccf69abda00f5bc220b59644Brian Paul{ 40995c818c6277247468ccf69abda00f5bc220b59644Brian Paul const GLbitfield mapMode = get_read_write_mode(format, texImage->TexFormat); 41005c818c6277247468ccf69abda00f5bc220b59644Brian Paul const GLenum target = texImage->TexObject->Target; 41015c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLboolean success = GL_FALSE; 41025c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLuint dims, slice, numSlices = 1, sliceOffset = 0; 41035c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLint srcImageStride = 0; 41045c818c6277247468ccf69abda00f5bc220b59644Brian Paul const GLubyte *src; 41055c818c6277247468ccf69abda00f5bc220b59644Brian Paul 41065c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(xoffset + width <= texImage->Width); 41075c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(yoffset + height <= texImage->Height); 41085c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(zoffset + depth <= texImage->Depth); 41095c818c6277247468ccf69abda00f5bc220b59644Brian Paul 41105c818c6277247468ccf69abda00f5bc220b59644Brian Paul switch (target) { 41115c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_1D: 41125c818c6277247468ccf69abda00f5bc220b59644Brian Paul dims = 1; 41135c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 41145c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_2D_ARRAY: 41155c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_3D: 41165c818c6277247468ccf69abda00f5bc220b59644Brian Paul dims = 3; 41175c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 41185c818c6277247468ccf69abda00f5bc220b59644Brian Paul default: 41195c818c6277247468ccf69abda00f5bc220b59644Brian Paul dims = 2; 41205c818c6277247468ccf69abda00f5bc220b59644Brian Paul } 41215c818c6277247468ccf69abda00f5bc220b59644Brian Paul 41225c818c6277247468ccf69abda00f5bc220b59644Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 41235c818c6277247468ccf69abda00f5bc220b59644Brian Paul src = (const GLubyte *) 41245c818c6277247468ccf69abda00f5bc220b59644Brian Paul _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, 41255c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type, pixels, packing, caller); 41265c818c6277247468ccf69abda00f5bc220b59644Brian Paul if (!src) 41275c818c6277247468ccf69abda00f5bc220b59644Brian Paul return; 41285c818c6277247468ccf69abda00f5bc220b59644Brian Paul 41295c818c6277247468ccf69abda00f5bc220b59644Brian Paul /* compute slice info (and do some sanity checks) */ 41305c818c6277247468ccf69abda00f5bc220b59644Brian Paul switch (target) { 41315c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_2D: 41325c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_RECTANGLE: 41335c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_CUBE_MAP: 41345c818c6277247468ccf69abda00f5bc220b59644Brian Paul /* one image slice, nothing special needs to be done */ 41355c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 41365c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_1D: 41375c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(height == 1); 41385c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(depth == 1); 41395c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(yoffset == 0); 41405c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(zoffset == 0); 41415c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 41425c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_1D_ARRAY: 41435c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(depth == 1); 41445c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(zoffset == 0); 41455c818c6277247468ccf69abda00f5bc220b59644Brian Paul numSlices = height; 41465c818c6277247468ccf69abda00f5bc220b59644Brian Paul sliceOffset = yoffset; 41475c818c6277247468ccf69abda00f5bc220b59644Brian Paul height = 1; 41485c818c6277247468ccf69abda00f5bc220b59644Brian Paul yoffset = 0; 41495c818c6277247468ccf69abda00f5bc220b59644Brian Paul srcImageStride = _mesa_image_row_stride(packing, width, format, type); 41505c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 41515c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_2D_ARRAY: 41525c818c6277247468ccf69abda00f5bc220b59644Brian Paul numSlices = depth; 41535c818c6277247468ccf69abda00f5bc220b59644Brian Paul sliceOffset = zoffset; 41545c818c6277247468ccf69abda00f5bc220b59644Brian Paul depth = 1; 41555c818c6277247468ccf69abda00f5bc220b59644Brian Paul zoffset = 0; 41565c818c6277247468ccf69abda00f5bc220b59644Brian Paul srcImageStride = _mesa_image_image_stride(packing, width, height, 41575c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type); 41585c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 41595c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_3D: 41605c818c6277247468ccf69abda00f5bc220b59644Brian Paul /* we'll store 3D images as a series of slices */ 41615c818c6277247468ccf69abda00f5bc220b59644Brian Paul numSlices = depth; 41625c818c6277247468ccf69abda00f5bc220b59644Brian Paul sliceOffset = zoffset; 41635c818c6277247468ccf69abda00f5bc220b59644Brian Paul srcImageStride = _mesa_image_image_stride(packing, width, height, 41645c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type); 41655c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 41665c818c6277247468ccf69abda00f5bc220b59644Brian Paul default: 41675c818c6277247468ccf69abda00f5bc220b59644Brian Paul _mesa_warning(ctx, "Unexpected target 0x%x in store_texsubimage()", target); 41685c818c6277247468ccf69abda00f5bc220b59644Brian Paul return; 41695c818c6277247468ccf69abda00f5bc220b59644Brian Paul } 41705c818c6277247468ccf69abda00f5bc220b59644Brian Paul 41715c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(numSlices == 1 || srcImageStride != 0); 41725c818c6277247468ccf69abda00f5bc220b59644Brian Paul 41735c818c6277247468ccf69abda00f5bc220b59644Brian Paul for (slice = 0; slice < numSlices; slice++) { 41745c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLubyte *dstMap; 41755c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLint dstRowStride; 41765c818c6277247468ccf69abda00f5bc220b59644Brian Paul 41775c818c6277247468ccf69abda00f5bc220b59644Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, 41785c818c6277247468ccf69abda00f5bc220b59644Brian Paul slice + sliceOffset, 41795c818c6277247468ccf69abda00f5bc220b59644Brian Paul xoffset, yoffset, width, height, 41805c818c6277247468ccf69abda00f5bc220b59644Brian Paul mapMode, &dstMap, &dstRowStride); 41815c818c6277247468ccf69abda00f5bc220b59644Brian Paul if (dstMap) { 41825c818c6277247468ccf69abda00f5bc220b59644Brian Paul /* Note: we're only storing a 2D (or 1D) slice at a time but we need 41835c818c6277247468ccf69abda00f5bc220b59644Brian Paul * to pass the right 'dims' value so that GL_UNPACK_SKIP_IMAGES is 41845c818c6277247468ccf69abda00f5bc220b59644Brian Paul * used for 3D images. 41855c818c6277247468ccf69abda00f5bc220b59644Brian Paul */ 41865c818c6277247468ccf69abda00f5bc220b59644Brian Paul success = _mesa_texstore(ctx, dims, texImage->_BaseFormat, 41875c818c6277247468ccf69abda00f5bc220b59644Brian Paul texImage->TexFormat, 41885c818c6277247468ccf69abda00f5bc220b59644Brian Paul dstRowStride, 41895c818c6277247468ccf69abda00f5bc220b59644Brian Paul &dstMap, 41905c818c6277247468ccf69abda00f5bc220b59644Brian Paul width, height, 1, /* w, h, d */ 41915c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type, src, packing); 41925c818c6277247468ccf69abda00f5bc220b59644Brian Paul 41935c818c6277247468ccf69abda00f5bc220b59644Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, slice + sliceOffset); 41945c818c6277247468ccf69abda00f5bc220b59644Brian Paul } 41955c818c6277247468ccf69abda00f5bc220b59644Brian Paul 41965c818c6277247468ccf69abda00f5bc220b59644Brian Paul src += srcImageStride; 41975c818c6277247468ccf69abda00f5bc220b59644Brian Paul 41985c818c6277247468ccf69abda00f5bc220b59644Brian Paul if (!success) 41995c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 42005c818c6277247468ccf69abda00f5bc220b59644Brian Paul } 42015c818c6277247468ccf69abda00f5bc220b59644Brian Paul 42025c818c6277247468ccf69abda00f5bc220b59644Brian Paul if (!success) 42035c818c6277247468ccf69abda00f5bc220b59644Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller); 42045c818c6277247468ccf69abda00f5bc220b59644Brian Paul 42055c818c6277247468ccf69abda00f5bc220b59644Brian Paul _mesa_unmap_teximage_pbo(ctx, packing); 42065c818c6277247468ccf69abda00f5bc220b59644Brian Paul} 42075c818c6277247468ccf69abda00f5bc220b59644Brian Paul 42085c818c6277247468ccf69abda00f5bc220b59644Brian Paul 42095c818c6277247468ccf69abda00f5bc220b59644Brian Paul 42105c818c6277247468ccf69abda00f5bc220b59644Brian Paul/** 42115c818c6277247468ccf69abda00f5bc220b59644Brian Paul * This is the fallback for Driver.TexImage1D(). 42128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 42138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 421492c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul_mesa_store_teximage1d(struct gl_context *ctx, 421592c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul struct gl_texture_image *texImage, 42168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 42178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint border, 42188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 421992c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul const struct gl_pixelstore_attrib *packing) 42208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 4221b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt if (width == 0) 4222b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt return; 4223b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt 422478026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 422578026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat, 422678026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul width, 1, 1)) { 42277d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); 42287d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 42297d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 42308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42315c818c6277247468ccf69abda00f5bc220b59644Brian Paul store_texsubimage(ctx, texImage, 42325c818c6277247468ccf69abda00f5bc220b59644Brian Paul 0, 0, 0, width, 1, 1, 42335c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type, pixels, packing, "glTexImage1D"); 42348e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 42358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42376b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/** 42385c818c6277247468ccf69abda00f5bc220b59644Brian Paul * This is the fallback for Driver.TexImage2D(). 42398e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 42408e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 424192c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul_mesa_store_teximage2d(struct gl_context *ctx, 424292c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul struct gl_texture_image *texImage, 42438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 42448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint border, 42458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 424692c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul const struct gl_pixelstore_attrib *packing) 42478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 4248b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt if (width == 0 || height == 0) 4249b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt return; 4250b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt 425178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 425278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat, 425378026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul width, height, 1)) { 42547d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); 42557d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 42567d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 42578e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42585c818c6277247468ccf69abda00f5bc220b59644Brian Paul store_texsubimage(ctx, texImage, 42595c818c6277247468ccf69abda00f5bc220b59644Brian Paul 0, 0, 0, width, height, 1, 42605c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type, pixels, packing, "glTexImage2D"); 42618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 42628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42656b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/** 42665c818c6277247468ccf69abda00f5bc220b59644Brian Paul * This is the fallback for Driver.TexImage3D(). 42678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 42688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 426992c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul_mesa_store_teximage3d(struct gl_context *ctx, 427092c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul struct gl_texture_image *texImage, 42718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 42728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, GLint border, 42738e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 427492c64624cd7533cde466dbec8722f7f72f275fd8Brian Paul const struct gl_pixelstore_attrib *packing) 42758e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 4276b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt if (width == 0 || height == 0 || depth == 0) 4277b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt return; 4278b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt 427978026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 428078026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat, 428178026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul width, height, depth)) { 428278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D"); 42837d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 42847d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 42858e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42865c818c6277247468ccf69abda00f5bc220b59644Brian Paul store_texsubimage(ctx, texImage, 42875c818c6277247468ccf69abda00f5bc220b59644Brian Paul 0, 0, 0, width, height, depth, 42885c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type, pixels, packing, "glTexImage3D"); 42898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 42908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42928e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42938e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 42948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 42955c818c6277247468ccf69abda00f5bc220b59644Brian Paul * This is the fallback for Driver.TexSubImage1D(). 42968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 42978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4298da0cc82a093eb97212e989648da638a262ed3e84Brian Paul_mesa_store_texsubimage1d(struct gl_context *ctx, 4299da0cc82a093eb97212e989648da638a262ed3e84Brian Paul struct gl_texture_image *texImage, 43008e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint width, 43018e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 4302da0cc82a093eb97212e989648da638a262ed3e84Brian Paul const struct gl_pixelstore_attrib *packing) 43038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 43045c818c6277247468ccf69abda00f5bc220b59644Brian Paul store_texsubimage(ctx, texImage, 43055c818c6277247468ccf69abda00f5bc220b59644Brian Paul xoffset, 0, 0, width, 1, 1, 43065c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type, pixels, packing, "glTexSubImage1D"); 43078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 43088e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 431089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 4311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 43125c818c6277247468ccf69abda00f5bc220b59644Brian Paul * This is the fallback for Driver.TexSubImage2D(). 43138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 43148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4315da0cc82a093eb97212e989648da638a262ed3e84Brian Paul_mesa_store_texsubimage2d(struct gl_context *ctx, 4316da0cc82a093eb97212e989648da638a262ed3e84Brian Paul struct gl_texture_image *texImage, 43178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint yoffset, 43188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, 43198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 4320da0cc82a093eb97212e989648da638a262ed3e84Brian Paul const struct gl_pixelstore_attrib *packing) 43218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 43225c818c6277247468ccf69abda00f5bc220b59644Brian Paul store_texsubimage(ctx, texImage, 43235c818c6277247468ccf69abda00f5bc220b59644Brian Paul xoffset, yoffset, 0, width, height, 1, 43245c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type, pixels, packing, "glTexSubImage2D"); 43258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 43268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 43295c818c6277247468ccf69abda00f5bc220b59644Brian Paul * This is the fallback for Driver.TexSubImage3D(). 43308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 43318e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4332da0cc82a093eb97212e989648da638a262ed3e84Brian Paul_mesa_store_texsubimage3d(struct gl_context *ctx, 4333da0cc82a093eb97212e989648da638a262ed3e84Brian Paul struct gl_texture_image *texImage, 43348e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 43358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, 43368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 4337da0cc82a093eb97212e989648da638a262ed3e84Brian Paul const struct gl_pixelstore_attrib *packing) 43388e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 43395c818c6277247468ccf69abda00f5bc220b59644Brian Paul store_texsubimage(ctx, texImage, 43405c818c6277247468ccf69abda00f5bc220b59644Brian Paul xoffset, yoffset, zoffset, width, height, depth, 43415c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type, pixels, packing, "glTexSubImage3D"); 43428e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 43438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43452aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul/* 43468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage1D() 43478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 43488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 434978527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage1d(struct gl_context *ctx, 435094a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul struct gl_texture_image *texImage, 43518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 43528e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint border, 435394a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul GLsizei imageSize, const GLvoid *data) 43548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 435594a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul /* no compressed 1D image formats at this time */ 4356a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 4357a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) internalFormat; 4358a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) border; 4359a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 4360a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 43618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 43628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 4365b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul/** 43668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage2D() 43678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 43688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 436978527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage2d(struct gl_context *ctx, 437094a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul struct gl_texture_image *texImage, 43718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 43728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint border, 437394a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul GLsizei imageSize, const GLvoid *data) 43748e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 4375bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt /* This is pretty simple, because unlike the general texstore path we don't 4376bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt * have to worry about the usual image unpacking or image transfer 4377bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt * operations. 43788e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 437989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage); 438089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Width > 0); 438189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Height > 0); 438289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Depth == 1); 438389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 438478026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 438578026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage, texImage->TexFormat, 438678026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul width, height, 1)) { 438778026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D"); 438889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 438989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 439089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 439194a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul _mesa_store_compressed_texsubimage2d(ctx, texImage, 4392bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt 0, 0, 4393bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt width, height, 4394bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt texImage->TexFormat, 439594a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul imageSize, data); 43968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 43978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 43998e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 44008e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 44018e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage3D() 44028e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 44038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 440478527154bd8693c0956ff78c369222d37c5668e7Brian Paul_mesa_store_compressed_teximage3d(struct gl_context *ctx, 440594a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul struct gl_texture_image *texImage, 44068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 44078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, 44088e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint border, 440994a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul GLsizei imageSize, const GLvoid *data) 44108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 441189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* this space intentionally left blank */ 4412a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 4413a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) internalFormat; 4414a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) height; (void) depth; 4415a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 4416a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 4417a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 44188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 44198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 44208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 44218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 442289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 442389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage1D() 4424e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul */ 4425e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paulvoid 442694a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul_mesa_store_compressed_texsubimage1d(struct gl_context *ctx, 442794a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul struct gl_texture_image *texImage, 442889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLsizei width, 442989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 443094a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul GLsizei imageSize, const GLvoid *data) 4431e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul{ 44325999c5b620236fb6a996cf56759aec31f01c126bBrian Paul /* there are no compressed 1D texture formats yet */ 4433a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 4434a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) xoffset; (void) width; 4435a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) format; 4436a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 4437a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 4438e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul} 4439e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 4440e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 444189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 444289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage2D() 444389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 444489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid 444594a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul_mesa_store_compressed_texsubimage2d(struct gl_context *ctx, 444694a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul struct gl_texture_image *texImage, 444789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLint yoffset, 444889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei width, GLsizei height, 444989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 445094a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul GLsizei imageSize, const GLvoid *data) 445189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 445281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint bytesPerRow, dstRowStride, srcRowStride; 445389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint i, rows; 445481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte *dstMap; 445589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul const GLubyte *src; 44561f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const gl_format texFormat = texImage->TexFormat; 4457d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul GLuint bw, bh; 44585999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 4459d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul _mesa_get_format_block_size(texFormat, &bw, &bh); 44605999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 446189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* these should have been caught sooner */ 4462079bb3fff7104782f2c921200e9a299c38a53ab6Eric Anholt ASSERT((width % bw) == 0 || width < bw); 4463079bb3fff7104782f2c921200e9a299c38a53ab6Eric Anholt ASSERT((height % bh) == 0 || height < bh); 4464d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((xoffset % bw) == 0); 4465d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((yoffset % bh) == 0); 446689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 4467b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 4468e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data, 4469e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul &ctx->Unpack, 4470e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul "glCompressedTexSubImage2D"); 44717a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!data) 44727a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 44737a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 44742594168e9f3cdc4ac53c925486491167837cda30Brian Paul srcRowStride = _mesa_format_row_stride(texFormat, width); 447589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul src = (const GLubyte *) data; 447689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 447706913497d6b17f454bf4c5b8601d391980eb8265Brian Paul /* Map dest texture buffer */ 447881430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, 0, 447981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul xoffset, yoffset, width, height, 448064fdfefb9d1136c5f98f3e3b2ba716c224a4d792Brian Paul GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT, 448181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &dstMap, &dstRowStride); 448289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 44831ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (dstMap) { 44841ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul bytesPerRow = srcRowStride; /* bytes per row of blocks */ 44851e0b6a90d78ed78eb9e22c65abd5af314142a844Eric Anholt rows = (height + bh - 1) / bh; /* rows in blocks */ 448689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 44871ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul /* copy rows of blocks */ 44881ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul for (i = 0; i < rows; i++) { 44891ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul memcpy(dstMap, src, bytesPerRow); 44901ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul dstMap += dstRowStride; 44911ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul src += srcRowStride; 44921ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 44938f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul 44941ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 44951ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 44961ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul else { 44971ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D"); 44981ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 449981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 450071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack); 450189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 450289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 450389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 450489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 450589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage3D() 450689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 450789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid 450894a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul_mesa_store_compressed_texsubimage3d(struct gl_context *ctx, 450994a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul struct gl_texture_image *texImage, 451094a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 451194a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul GLsizei width, GLsizei height, GLsizei depth, 451294a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul GLenum format, 451394a0c518dc90a24cb4c44ce0a5e6abeba57cbb08Brian Paul GLsizei imageSize, const GLvoid *data) 451489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 45155999c5b620236fb6a996cf56759aec31f01c126bBrian Paul /* there are no compressed 3D texture formats yet */ 4516a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 4517a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) xoffset; (void) yoffset; (void) zoffset; 4518a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) height; (void) depth; 4519a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) format; 4520a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 4521a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 452289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 4523