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: 40ac14f569fef6a8d92c14cd02d51c09bab53c5e45Brian Paul * ctx->Driver.TexImage = _mesa_store_teximage; 41ac14f569fef6a8d92c14cd02d51c09bab53c5e45Brian Paul * ctx->Driver.TexSubImage = _mesa_store_texsubimage; 4289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * etc... 4389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * 4489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Texture image processing is actually kind of complicated. We have to do: 4589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Format/type conversions 4689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * pixel unpacking 47a62efdf82c20747feb11dfd7756f0579aa914b57Eric Anholt * pixel transfer (scale, bais, lookup, etc) 4889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * 4989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * These functions can handle most everything, including processing full 5089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * images and sub-images. 5189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 5289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 5389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 543c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "glheader.h" 557a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul#include "bufferobj.h" 56e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul#include "colormac.h" 574c7e44e8e6fd1f441a97016d8bcc67133149e15eBrian Paul#include "format_pack.h" 588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "image.h" 598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "macros.h" 6024edd9015951dd41898902b6c3973fe605e5871aBrian Paul#include "mipmap.h" 61db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h" 620117da40cd7edd3d165bb28569c289b37eca12b9Vinson Lee#include "mtypes.h" 631c131752c3e07ef91f49d4970dafca6d26585334Brian Paul#include "pack.h" 64b70610b9823fc7dc3672735c11be1a75fbb1a2a4Brian Paul#include "pbo.h" 653c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 6689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul#include "texcompress.h" 67da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_fxt1.h" 688d47c919859e9cd90cfc04eb220ac8a5aa87048eDave Airlie#include "texcompress_rgtc.h" 69da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_s3tc.h" 70d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu#include "texcompress_etc.h" 718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "teximage.h" 728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h" 732e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell#include "enums.h" 74749c9060aca85277c388377d15fd6323ba20b78eJordan Justen#include "glformats.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 && 13530df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul dstFormat == MESA_FORMAT_ARGB8888 && 13540df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul srcFormat == GL_LUMINANCE_ALPHA && 13550df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul baseInternalFormat == GL_RGBA && 13560df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul srcType == GL_UNSIGNED_BYTE) { 13570df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul /* special case of storing LA -> ARGB8888 */ 13580df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul int img, row, col; 13590df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul const GLint srcRowStride = 13600df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 13610df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul for (img = 0; img < srcDepth; img++) { 13620df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul const GLubyte *srcRow = (const GLubyte *) 13630df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, 13640df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul srcHeight, srcFormat, srcType, img, 0, 0); 13650df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul GLubyte *dstRow = dstSlices[img]; 13660df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul for (row = 0; row < srcHeight; row++) { 13670df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul GLuint *d4 = (GLuint *) dstRow; 13680df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul for (col = 0; col < srcWidth; col++) { 13690df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul GLubyte l = srcRow[col * 2 + 0], a = srcRow[col * 2 + 1]; 13700df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul d4[col] = PACK_COLOR_8888(a, l, l, l); 13710df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul } 13720df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul dstRow += dstRowStride; 13730df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul srcRow += srcRowStride; 13740df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul } 13750df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul } 13760df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul } 13770df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul else if (!ctx->_ImageTransferState && 13780df14f9a55383641a9097900272a35ae1cfda4cbBrian Paul !srcPacking->SwapBytes && 13791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB8888 && 138071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat == GL_RGBA && 13810c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat == GL_RGBA && 138224748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcType == GL_UNSIGNED_BYTE) { 1383259eacfa94a1086e4c99db83516989cc27832ef4Brian /* same as above case, but src data has alpha too */ 1384b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row, col; 1385ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* For some reason, streaming copies to write-combined regions 1386ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * are extremely sensitive to the characteristics of how the 1387ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * source data is retrieved. By reordering the source reads to 1388ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * be in-order, the speed of this operation increases by half. 1389ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Strangely the same isn't required for the RGB path, above. 1390ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 1391ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (img = 0; img < srcDepth; img++) { 13928c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 13938c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1394ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 1395ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1396d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1397ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (row = 0; row < srcHeight; row++) { 1398259eacfa94a1086e4c99db83516989cc27832ef4Brian GLuint *d4 = (GLuint *) dstRow; 1399ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (col = 0; col < srcWidth; col++) { 140024748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP], 140124748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + RCOMP], 140224748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + GCOMP], 140324748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + BCOMP]); 140471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 140571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 140671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 140771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 140871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 140971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 141071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 141146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell (srcType == GL_UNSIGNED_BYTE || 141246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8 || 141346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8_REV) && 14140c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell can_swizzle(baseInternalFormat) && 141571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell can_swizzle(srcFormat)) { 141671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 141771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte dstmap[4]; 141871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 14190c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 142071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell */ 14211f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 142274d61d03b54d72217d463c248468cdcd09320efcBrian Paul (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) || 14232d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) || 14242d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) { 142546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 3; /* alpha */ 142646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 0; /* red */ 142746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 1; /* green */ 142846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 2; /* blue */ 142946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 143046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell else { 14311f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) || 143274d61d03b54d72217d463c248468cdcd09320efcBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 14332d0c2952566810ef1b277b49b064f4874a973112Michel Dänzer (littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) || 143474d61d03b54d72217d463c248468cdcd09320efcBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888)); 143546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 2; 143646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 1; 143746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 0; 143846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 3; 143946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 144071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 144171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 144271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat, 144346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType, 14440c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat, 144571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstmap, 4, 1446b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 14475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstSlices, 144871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 144971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcPacking); 145071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 1451a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else { 14526e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 14536e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 14546e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 14556e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 1456a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1457a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1458a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1459a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1460f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 146149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1462b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb888(TEXSTORE_PARAMS) 1463f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 14641f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB888); 146544c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 3); 1466f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1467f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1468f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB && 1469f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1470f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul srcPacking->SwapBytes)) { 1471f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 147217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1473d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 14745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1475f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1476f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1477f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1478f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (!ctx->_ImageTransferState && 1479f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1480f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_RGBA && 1481f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 1482a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* extract RGB from RGBA */ 1483b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row, col; 1484f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 14858c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 14868c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 148760909388ab136d849d99eab49e782a53772a618fBrian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 148860909388ab136d849d99eab49e782a53772a618fBrian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1489d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1490f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1491f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1492f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP]; 1493f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1494f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP]; 1495f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1496f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1497f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcRow += srcRowStride; 1498f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1499f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1500f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 15013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 15023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 15033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 15043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 15053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 15063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 15073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 15083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 15093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 1510167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[0] = 2; 15113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 1; 1512167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[2] = 0; 15133aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 15143aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 15153aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 15163aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 15173aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 15183aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 15193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 3, 15205253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 15213aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 15223aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 15233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 15256e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 15266e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 15276e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 15286e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 1529f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1530f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1531f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1532f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1533f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 153449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1535b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_bgr888(TEXSTORE_PARAMS) 1536a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul{ 15371f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_BGR888); 153844c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 3); 1539a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1540a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!ctx->_ImageTransferState && 1541a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1542f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1543f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul srcPacking->SwapBytes)) { 1544a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* simple memcpy path */ 154517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1546d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 15475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1548a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1549a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcAddr, srcPacking); 1550a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1551a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else if (!ctx->_ImageTransferState && 1552a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1553a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGBA && 1554a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE) { 1555a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* extract BGR from RGBA */ 1556a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul int img, row, col; 1557a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 15588c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 15598c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 156060909388ab136d849d99eab49e782a53772a618fBrian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 156160909388ab136d849d99eab49e782a53772a618fBrian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1562d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1563a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1564a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (col = 0; col < srcWidth; col++) { 1565a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP]; 1566a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1567a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP]; 1568a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1569a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1570a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcRow += srcRowStride; 1571a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1572a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1573a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 15743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 15753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 15763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 15773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 15783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 15793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 15803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 15813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 15823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 1583167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[0] = 0; 15843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 1; 1585167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[2] = 2; 15863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 15873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 15883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 15893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 15903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 15913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 15923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 3, 15935253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 15943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 15953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 15963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1597a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else { 15986e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 15996e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 16006e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 16016e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 1602a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1603a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1604a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1605a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1606a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 160749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1608b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb4444(TEXSTORE_PARAMS) 1609f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 16101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB4444 || 16111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB4444_REV); 161244c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1616f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1617f6af4c511fd3d2750c5279d0d93492bb4e92aac9Brian Paul srcPacking->SwapBytes)) { 1618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 161917bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1620d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 16215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1623f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1624f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1625f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 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); 1630a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1631a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1632a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1633a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 163449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1635dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom_mesa_texstore_rgba5551(TEXSTORE_PARAMS) 1636dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom{ 16371f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA5551); 163844c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1639a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1640dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom if (!ctx->_ImageTransferState && 1641dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom baseInternalFormat == GL_RGBA && 1642453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1643453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul srcPacking->SwapBytes)) { 1644dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom /* simple memcpy path */ 1645dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom memcpy_texture(ctx, dims, 1646d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 16475253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1648dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1649dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcAddr, srcPacking); 1650dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1651dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom else { 16526e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 16536e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 16546e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 16556e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 1656dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1657dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom return GL_TRUE; 1658dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom} 1659defb035b6cf03c555318d9dd48864242ed036f39Brian Paul 166049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1661b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb1555(TEXSTORE_PARAMS) 1662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 16631f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB1555 || 16641f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB1555_REV); 166544c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1666f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1667f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1668f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1669453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1670453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul srcPacking->SwapBytes)) { 1671f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 167217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1673d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 16745253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1675f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1676f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1677f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1678f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 16796e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 16806e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 16816e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 16826e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 1683a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1684a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1685a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1686a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1687f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1688621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšákstatic GLboolean 1689621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák_mesa_texstore_argb2101010(TEXSTORE_PARAMS) 1690621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák{ 1691621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1692621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 1693621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák ASSERT(dstFormat == MESA_FORMAT_ARGB2101010); 169444c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 1695621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 1696621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák if (!ctx->_ImageTransferState && 1697453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul baseInternalFormat == GL_RGBA && 1698453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1699453d4b40bc1dfd4fc1e48c25bda1d293f66597a1Brian Paul srcPacking->SwapBytes)) { 1700621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák /* simple memcpy path */ 1701621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák memcpy_texture(ctx, dims, 1702d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 17035253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1704621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1705621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcAddr, srcPacking); 1706621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1707621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák else { 1708621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák /* general path */ 1709e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 1710621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák baseInternalFormat, 1711621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák baseFormat, 1712621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcWidth, srcHeight, srcDepth, 1713621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák srcFormat, srcType, srcAddr, 171450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák srcPacking, 171550630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák ctx->_ImageTransferState); 171650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák const GLfloat *src = tempImage; 1717621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák GLint img, row, col; 1718621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák if (!tempImage) 1719621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák return GL_FALSE; 1720621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (img = 0; img < srcDepth; img++) { 1721d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1722621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák if (baseInternalFormat == GL_RGBA) { 1723621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (row = 0; row < srcHeight; row++) { 172450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLuint *dstUI = (GLuint *) dstRow; 1725621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (col = 0; col < srcWidth; col++) { 172650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLushort a,r,g,b; 172750630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák 172850630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]); 172950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); 173050630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); 173150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); 173250630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák dstUI[col] = PACK_COLOR_2101010_US(a, r, g, b); 1733621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák src += 4; 1734621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1735621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák dstRow += dstRowStride; 1736621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1737621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } else if (baseInternalFormat == GL_RGB) { 1738621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (row = 0; row < srcHeight; row++) { 173950630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLuint *dstUI = (GLuint *) dstRow; 1740621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák for (col = 0; col < srcWidth; col++) { 174150630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák GLushort r,g,b; 174250630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák 174350630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); 174450630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); 174550630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); 174650630f9016bdf0ea33ae1007c5a523cdcde3e3c9Marek Olšák dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b); 1747621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák src += 4; 1748621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1749621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák dstRow += dstRowStride; 1750621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1751621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } else { 1752621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák ASSERT(0); 1753621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1754621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1755621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák free((void *) tempImage); 1756621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák } 1757621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák return GL_TRUE; 1758621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák} 1759621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 1760621e5254ef6714520f106bd3707fe6ddc279aa0cMarek Olšák 176139de9251c4770fdcce3395643003aa626178446dBrian Paul/** 1762bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák * Do texstore for 2-channel, 4-bit/channel, unsigned normalized formats. 1763bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák */ 1764bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšákstatic GLboolean 1765bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák_mesa_texstore_unorm44(TEXSTORE_PARAMS) 1766bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák{ 1767bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1768bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 1769bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák ASSERT(dstFormat == MESA_FORMAT_AL44); 177044c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 1); 1771bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 1772bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák { 1773bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák /* general path */ 1774663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1775bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák baseInternalFormat, 1776bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák baseFormat, 1777bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák srcWidth, srcHeight, srcDepth, 1778bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák srcFormat, srcType, srcAddr, 1779bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák srcPacking); 1780663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 1781bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák GLint img, row, col; 1782bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák if (!tempImage) 1783bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák return GL_FALSE; 1784bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák for (img = 0; img < srcDepth; img++) { 1785d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1786bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák for (row = 0; row < srcHeight; row++) { 1787bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák GLubyte *dstUS = (GLubyte *) dstRow; 1788bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák for (col = 0; col < srcWidth; col++) { 1789bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák /* src[0] is luminance, src[1] is alpha */ 1790663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_44( src[1], 1791663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[0] ); 1792bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák src += 2; 1793bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 1794bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák dstRow += dstRowStride; 1795bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 1796bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 1797bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák free((void *) tempImage); 1798bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák } 1799bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák return GL_TRUE; 1800bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák} 1801bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 1802bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák 1803bae9d511f343c7bd5eb66d1d1d18d32b47e738e3Marek Olšák/** 180439de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats. 180539de9251c4770fdcce3395643003aa626178446dBrian Paul */ 180649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 18075d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm88(TEXSTORE_PARAMS) 1808f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1809184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 18101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1811f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 18121f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_AL88 || 18135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_AL88_REV || 18140a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul dstFormat == MESA_FORMAT_GR88 || 1815b4aecc4e1861e60e40e14868719219084967e46dBrian Paul dstFormat == MESA_FORMAT_RG88); 181644c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1817f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1818f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1819f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1820e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede ((dstFormat == MESA_FORMAT_AL88 && 1821e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == GL_LUMINANCE_ALPHA && 1822e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede srcFormat == GL_LUMINANCE_ALPHA) || 18230a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul (dstFormat == MESA_FORMAT_GR88 && 1824e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == srcFormat)) && 1825f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE && 1826f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul littleEndian) { 1827f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 182817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 1829d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 18305253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 1831f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1832f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1833f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 18343aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 1835bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell littleEndian && 18363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 18373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 18383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 18393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 18403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 18413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 18423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 18435d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) { 18445d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if ((littleEndian && dstFormat == MESA_FORMAT_AL88) || 18455d1387b2da3626326410804026f8b92f1a121fdcIan Romanick (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) { 18465d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 0; 18475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 3; 18485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 18495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 18505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 3; 18515d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 0; 18525d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 18533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 18543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else { 18550a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul if ((littleEndian && dstFormat == MESA_FORMAT_GR88) || 1856b4aecc4e1861e60e40e14868719219084967e46dBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_RG88)) { 18575d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 0; 18585d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 1; 18595d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 18605d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 18615d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[0] = 1; 18625d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstmap[1] = 0; 18635d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 18643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 18653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[2] = ZERO; /* ? */ 18663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 18673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 18683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 18693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 18703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 18713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 18723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 2, 18735253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 18743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 18753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 18763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1877f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1878f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1879663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1880f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 188122108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1882f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1883f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1884f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1885663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 1886f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1887f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1888f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1889f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1890d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 1891f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1892f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 18935d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL88 || 18940a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul dstFormat == MESA_FORMAT_GR88) { 1895f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1896ae70caf7eb708351ee93b35926142e503be79d39Brian Paul /* src[0] is luminance (or R), src[1] is alpha (or G) */ 1897663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_88( src[1], 1898663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[0] ); 1899f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 2; 1900f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1901f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1902f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1903f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1904ae70caf7eb708351ee93b35926142e503be79d39Brian Paul /* src[0] is luminance (or R), src[1] is alpha (or G) */ 1905663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstUS[col] = PACK_COLOR_88_REV( src[1], 1906663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul src[0] ); 1907f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 2; 1908f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1909a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1910a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1911a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1912a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 191332f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 1914a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1915a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1916a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1917a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1918a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 191939de9251c4770fdcce3395643003aa626178446dBrian Paul/** 192039de9251c4770fdcce3395643003aa626178446dBrian Paul * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats. 192139de9251c4770fdcce3395643003aa626178446dBrian Paul */ 192249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 19235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick_mesa_texstore_unorm1616(TEXSTORE_PARAMS) 19243325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick{ 19253325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLboolean littleEndian = _mesa_little_endian(); 19263325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 19273325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 19283325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick ASSERT(dstFormat == MESA_FORMAT_AL1616 || 19295d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_AL1616_REV || 19305d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616 || 19315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616_REV); 193244c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 19333325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 19343325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick if (!ctx->_ImageTransferState && 19353325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick !srcPacking->SwapBytes && 1936e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede ((dstFormat == MESA_FORMAT_AL1616 && 1937e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == GL_LUMINANCE_ALPHA && 1938e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede srcFormat == GL_LUMINANCE_ALPHA) || 1939e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede (dstFormat == MESA_FORMAT_RG1616 && 1940e338a1b0cea94f8c57968b01eebd795c6c8ce74eHans de Goede baseInternalFormat == srcFormat)) && 19413325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcType == GL_UNSIGNED_SHORT && 19423325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick littleEndian) { 19433325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick /* simple memcpy path */ 19443325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick memcpy_texture(ctx, dims, 1945d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 19465253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 19473325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcWidth, srcHeight, srcDepth, srcFormat, srcType, 19483325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcAddr, srcPacking); 19493325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19503325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick else { 19513325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick /* general path */ 1952e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 19533325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick baseInternalFormat, 19543325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick baseFormat, 19553325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcWidth, srcHeight, srcDepth, 19563325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick srcFormat, srcType, srcAddr, 1957bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 1958bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 19593325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick const GLfloat *src = tempImage; 19603325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick GLint img, row, col; 19613325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick if (!tempImage) 19623325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick return GL_FALSE; 19633325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (img = 0; img < srcDepth; img++) { 1964d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 19653325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (row = 0; row < srcHeight; row++) { 19663325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick GLuint *dstUI = (GLuint *) dstRow; 19675d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (dstFormat == MESA_FORMAT_AL1616 || 19685d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_RG1616) { 19693325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (col = 0; col < srcWidth; col++) { 1970db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt GLushort l, a; 1971db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt 1972db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(l, src[0]); 1973db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(a, src[1]); 1974db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt dstUI[col] = PACK_COLOR_1616(a, l); 1975db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt src += 2; 19763325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19773325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19783325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick else { 19793325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick for (col = 0; col < srcWidth; col++) { 1980db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt GLushort l, a; 1981db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt 1982db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(l, src[0]); 1983db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt UNCLAMPED_FLOAT_TO_USHORT(a, src[1]); 1984db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt dstUI[col] = PACK_COLOR_1616_REV(a, l); 1985db352f58fab419c475b89418cd27b35f5f5d3822Eric Anholt src += 2; 19863325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19873325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19883325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick dstRow += dstRowStride; 19893325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19903325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 199132f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 19923325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick } 19933325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick return GL_TRUE; 19943325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick} 19953325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 19963325dc91be2534079ebf7997700b6e5f17a75283Ian Romanick 1997fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák/* Texstore for R16, A16, L16, I16. */ 19983325dc91be2534079ebf7997700b6e5f17a75283Ian Romanickstatic GLboolean 1999eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák_mesa_texstore_unorm16(TEXSTORE_PARAMS) 20005d1387b2da3626326410804026f8b92f1a121fdcIan Romanick{ 20015d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLboolean littleEndian = _mesa_little_endian(); 20025d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 20035d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 2004eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák ASSERT(dstFormat == MESA_FORMAT_R16 || 2005bb5ace68ce9e8bd171a39162ed6bd93632bd6619Marek Olšák dstFormat == MESA_FORMAT_A16 || 2006fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák dstFormat == MESA_FORMAT_L16 || 2007fd8aa7ac71699facf9839e2ae56b5e37579c6bccMarek Olšák dstFormat == MESA_FORMAT_I16); 200844c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 20095d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 20105d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (!ctx->_ImageTransferState && 20115d1387b2da3626326410804026f8b92f1a121fdcIan Romanick !srcPacking->SwapBytes && 2012eb31837a0d4fa4fe115bb288ddb37cbedea954aeMarek Olšák baseInternalFormat == srcFormat && 20135d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcType == GL_UNSIGNED_SHORT && 20145d1387b2da3626326410804026f8b92f1a121fdcIan Romanick littleEndian) { 20155d1387b2da3626326410804026f8b92f1a121fdcIan Romanick /* simple memcpy path */ 20165d1387b2da3626326410804026f8b92f1a121fdcIan Romanick memcpy_texture(ctx, dims, 2017d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 20185253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 20195d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, srcFormat, srcType, 20205d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcAddr, srcPacking); 20215d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 20225d1387b2da3626326410804026f8b92f1a121fdcIan Romanick else { 20235d1387b2da3626326410804026f8b92f1a121fdcIan Romanick /* general path */ 2024e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 20255d1387b2da3626326410804026f8b92f1a121fdcIan Romanick baseInternalFormat, 20265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick baseFormat, 20275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, 20285d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcFormat, srcType, srcAddr, 2029bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2030bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 20315d1387b2da3626326410804026f8b92f1a121fdcIan Romanick const GLfloat *src = tempImage; 20325d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLint img, row, col; 20335d1387b2da3626326410804026f8b92f1a121fdcIan Romanick if (!tempImage) 20345d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return GL_FALSE; 20355d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (img = 0; img < srcDepth; img++) { 2036d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 20375d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (row = 0; row < srcHeight; row++) { 20385d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLushort *dstUS = (GLushort *) dstRow; 20395d1387b2da3626326410804026f8b92f1a121fdcIan Romanick for (col = 0; col < srcWidth; col++) { 20405d1387b2da3626326410804026f8b92f1a121fdcIan Romanick GLushort r; 20415d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 20425d1387b2da3626326410804026f8b92f1a121fdcIan Romanick UNCLAMPED_FLOAT_TO_USHORT(r, src[0]); 20435d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstUS[col] = r; 20445d1387b2da3626326410804026f8b92f1a121fdcIan Romanick src += 1; 20455d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 20465d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstRow += dstRowStride; 20475d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 20485d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 20495d1387b2da3626326410804026f8b92f1a121fdcIan Romanick free((void *) tempImage); 20505d1387b2da3626326410804026f8b92f1a121fdcIan Romanick } 20515d1387b2da3626326410804026f8b92f1a121fdcIan Romanick return GL_TRUE; 20525d1387b2da3626326410804026f8b92f1a121fdcIan Romanick} 20535d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 20545d1387b2da3626326410804026f8b92f1a121fdcIan Romanick 20555d1387b2da3626326410804026f8b92f1a121fdcIan Romanickstatic GLboolean 205617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul_mesa_texstore_rgba_16(TEXSTORE_PARAMS) 205717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul{ 205817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 205917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 206017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_16); 206144c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 8); 206217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 206317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul if (!ctx->_ImageTransferState && 206417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul !srcPacking->SwapBytes && 206517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseInternalFormat == GL_RGBA && 206617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcFormat == GL_RGBA && 206717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcType == GL_UNSIGNED_SHORT) { 206817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul /* simple memcpy path */ 206917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul memcpy_texture(ctx, dims, 2070d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 20715253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 207217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 207317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcAddr, srcPacking); 207417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 207517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul else { 207617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul /* general path */ 2077e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 207817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseInternalFormat, 207917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul baseFormat, 208017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcWidth, srcHeight, srcDepth, 208117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul srcFormat, srcType, srcAddr, 2082bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2083bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 208417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul const GLfloat *src = tempImage; 208517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLint img, row, col; 208617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul if (!tempImage) 208717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul return GL_FALSE; 208817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (img = 0; img < srcDepth; img++) { 2089d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 209017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (row = 0; row < srcHeight; row++) { 209117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLushort *dstUS = (GLushort *) dstRow; 209217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul for (col = 0; col < srcWidth; col++) { 209317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul GLushort r, g, b, a; 209417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 209517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(r, src[0]); 209617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(g, src[1]); 209717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(b, src[2]); 209817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul UNCLAMPED_FLOAT_TO_USHORT(a, src[3]); 209917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+0] = r; 210017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+1] = g; 210117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+2] = b; 210217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstUS[col*4+3] = a; 210317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul src += 4; 210417e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 210517e96718946486ef77927fcf3bb299d8bff32b98Brian Paul dstRow += dstRowStride; 210617e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 210717e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 210817e96718946486ef77927fcf3bb299d8bff32b98Brian Paul free((void *) tempImage); 210917e96718946486ef77927fcf3bb299d8bff32b98Brian Paul } 211017e96718946486ef77927fcf3bb299d8bff32b98Brian Paul return GL_TRUE; 211117e96718946486ef77927fcf3bb299d8bff32b98Brian Paul} 211217e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 211317e96718946486ef77927fcf3bb299d8bff32b98Brian Paul 211417e96718946486ef77927fcf3bb299d8bff32b98Brian Paulstatic GLboolean 2115279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS) 2116279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul{ 2117279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2118279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2119daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGB_16 || 2120279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA_16); 2121279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2122279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul if (!ctx->_ImageTransferState && 2123279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul !srcPacking->SwapBytes && 2124279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseInternalFormat == GL_RGBA && 2125279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA_16 && 2126279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcFormat == GL_RGBA && 2127279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcType == GL_SHORT) { 2128279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* simple memcpy path */ 2129279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul memcpy_texture(ctx, dims, 2130d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 21315253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2132279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2133279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcAddr, srcPacking); 2134279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2135279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul else { 2136279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* general path */ 2137e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2138279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseInternalFormat, 2139279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul baseFormat, 2140279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcWidth, srcHeight, srcDepth, 2141279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul srcFormat, srcType, srcAddr, 2142bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2143bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 2144279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLfloat *src = tempImage; 2145279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2; 2146279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLint img, row, col; 2147279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2148279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul if (!tempImage) 2149279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul return GL_FALSE; 2150279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2151279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul /* Note: tempImage is always float[4] / RGBA. We convert to 1, 2, 2152279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul * 3 or 4 components/pixel here. 2153279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul */ 2154279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul for (img = 0; img < srcDepth; img++) { 2155d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 2156279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul for (row = 0; row < srcHeight; row++) { 2157279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul GLshort *dstRowS = (GLshort *) dstRow; 2158daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (dstFormat == MESA_FORMAT_SIGNED_RGBA_16) { 2159daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 2160daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLuint c; 2161daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (c = 0; c < comps; c++) { 2162daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort p; 2163daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]); 2164daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRowS[col * comps + c] = p; 2165daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2166daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2167daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 2168daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 4 * srcWidth; 2169daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } else { 2170daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 2171daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLuint c; 2172daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (c = 0; c < comps; c++) { 2173daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort p; 2174daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 3 + c]); 2175daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRowS[col * comps + c] = p; 2176daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2177279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2178daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 2179daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 3 * srcWidth; 2180279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2181279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2182279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2183279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul free((void *) tempImage); 2184279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul } 2185279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul return GL_TRUE; 2186279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul} 2187279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2188279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paul 2189279056f8034f67ce7f17ccc1e5d96cd3c53a23f8Brian Paulstatic GLboolean 2190b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb332(TEXSTORE_PARAMS) 2191f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 21921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB332); 219344c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 1); 2194f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2195f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2196f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB && 21976f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 21986f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul srcPacking->SwapBytes)) { 2199f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 220017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 2201d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 22025253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2203f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2204f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2205f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2206f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 22076e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul return store_ubyte_texture(ctx, dims, baseInternalFormat, 22086e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul dstFormat, dstRowStride, dstSlices, 22096e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcWidth, srcHeight, srcDepth, 22106e9a1650e541bf7db15b7e8afaf90d7975b165feBrian Paul srcFormat, srcType, srcAddr, srcPacking); 2211f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2212f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2213f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2214f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2215f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2216f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 2217f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8. 2218f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 221949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2220bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák_mesa_texstore_unorm8(TEXSTORE_PARAMS) 2221f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 22221f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 222322108bb571808542b89677752d62d3901698265fBrian Paul 22241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_A8 || 22251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_L8 || 22265d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_I8 || 22275d1387b2da3626326410804026f8b92f1a121fdcIan Romanick dstFormat == MESA_FORMAT_R8); 222844c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 1); 2229f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2230f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2231f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2232f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 2233f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 2234f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 223517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 2236d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 22375253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2238f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2239f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2240f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 22413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 22423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 22433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 22443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 22453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 22463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 22473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 22483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 22491f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_A8) { 22503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 3; 22513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 22523aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else { 22533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 0; 22543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 22553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = ZERO; /* ? */ 22563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[2] = ZERO; /* ? */ 22573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 22583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 22593aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 22603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 22613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 22623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 22633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 1, 22645253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 22653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 22663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 22673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 2268f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2269f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 2270663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 2271f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 227222108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2273f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2274f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2275f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2276663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul const GLubyte *src = tempImage; 2277f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2278f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2279f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2280f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2281d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 2282f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2283f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 2284663f61a3e177a443c36f414a16a9d5f94e74135dBrian Paul dstRow[col] = src[col]; 2285f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 2287f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcWidth; 2288f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2289f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 229032f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 22981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV. 2299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 230049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2301b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ycbcr(TEXSTORE_PARAMS) 2302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 2303184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 230422108bb571808542b89677752d62d3901698265fBrian Paul 2305a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; (void) dims; (void) baseInternalFormat; 2306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 23071f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT((dstFormat == MESA_FORMAT_YCBCR) || 23081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (dstFormat == MESA_FORMAT_YCBCR_REV)); 230944c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 2310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(ctx->Extensions.MESA_ycbcr_texture); 2311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(srcFormat == GL_YCBCR_MESA); 2312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) || 2313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA)); 2314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_YCBCR_MESA); 2315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* always just memcpy since no pixel transfer ops apply */ 231717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 2318d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 23195253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2320f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2321f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2322f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2323f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* Check if we need byte swapping */ 2324f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* XXX the logic here _might_ be wrong */ 2325f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (srcPacking->SwapBytes ^ 2326f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^ 23271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (dstFormat == MESA_FORMAT_YCBCR_REV) ^ 2328f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !littleEndian) { 2329f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 2330f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2331d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 2332f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2333b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul _mesa_swap2((GLushort *) dstRow, srcWidth); 2334b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 2335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2338f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2339f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 234149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2342114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_texstore_dudv8(TEXSTORE_PARAMS) 2343114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 2344114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const GLboolean littleEndian = _mesa_little_endian(); 23451f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2346114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 23471f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_DUDV8); 234822108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 2349114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT(ctx->Extensions.ATI_envmap_bumpmap); 2350114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT((srcFormat == GL_DU8DV8_ATI) || 2351114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger (srcFormat == GL_DUDV_ATI)); 2352114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT(baseInternalFormat == GL_DUDV_ATI); 2353114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2354114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!srcPacking->SwapBytes && srcType == GL_BYTE && 2355114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger littleEndian) { 2356114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* simple memcpy path */ 2357114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger memcpy_texture(ctx, dims, 2358d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 23595253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2360114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2361114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcAddr, srcPacking); 2362114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2363114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (srcType == GL_BYTE) { 2364114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLubyte dstmap[4]; 2365114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2366114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* dstmap - how to swizzle from RGBA to dst format: 2367114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger */ 2368114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (littleEndian) { 2369114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[0] = 0; 2370114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[1] = 3; 2371114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2372114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 2373114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[0] = 3; 2374114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[1] = 0; 2375114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2376114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[2] = ZERO; /* ? */ 2377114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[3] = ONE; /* ? */ 2378114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2379114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_swizzle_ubyte_image(ctx, dims, 2380114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_LUMINANCE_ALPHA, /* hack */ 2381114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_UNSIGNED_BYTE, /* hack */ 2382114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_LUMINANCE_ALPHA, /* hack */ 2383114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap, 2, 23845253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2385114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, srcDepth, srcAddr, 2386114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcPacking); 2387114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2388114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 2389114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* general path - note this is defined for 2d textures only */ 2390114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const GLint components = _mesa_components_in_format(baseInternalFormat); 23918c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth, 23928c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcFormat, srcType); 2393114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLbyte *tempImage, *dst, *src; 2394114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLint row; 2395114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 239632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth 2397114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger * components * sizeof(GLbyte)); 2398114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!tempImage) 2399114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_FALSE; 2400114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2401114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2402114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, 2403114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcFormat, srcType, 2404114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 0, 0, 0); 2405114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2406114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst = tempImage; 2407114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (row = 0; row < srcHeight; row++) { 2408114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat, 2409114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst, srcFormat, srcType, src, 2410114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcPacking, 0); 2411114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst += srcWidth * components; 2412114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src += srcStride; 2413114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2414114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2415114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src = tempImage; 2416d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dst = (GLbyte *) dstSlices[0]; 2417114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (row = 0; row < srcHeight; row++) { 241822108bb571808542b89677752d62d3901698265fBrian Paul memcpy(dst, src, srcWidth * texelBytes); 2419114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst += dstRowStride; 242022108bb571808542b89677752d62d3901698265fBrian Paul src += srcWidth * texelBytes; 2421114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 242232f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2423114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2424114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_TRUE; 2425114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 2426f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 242784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 242884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 2429daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized 8-bit format. 243084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 243184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 2432daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm8(TEXSTORE_PARAMS) 243384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 243484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 243584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2436daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_A8 || 2437daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_L8 || 2438daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_I8 || 2439daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_R8); 244044c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 1); 244184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2442daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 2443daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 2444daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 2445daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_BYTE) { 2446daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 2447daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 2448d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 24495253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2450daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2451daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 2452daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2453daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 245484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 2455e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 245684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 245784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 245884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 245984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 2460bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2461bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 2462daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 246384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 246484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 246584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 246684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 2467d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLbyte *dstRow = (GLbyte *) dstSlices[img]; 246884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 246984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 2470daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow[col] = FLOAT_TO_BYTE_TEX(src[col]); 247184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 247284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 2473daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += srcWidth; 247484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 247584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 247684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 247784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 247884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 247984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 248084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 248184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 248284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 2483daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Store a texture in a signed normalized two-channel 16-bit format. 248484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 248584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 2486daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm88(TEXSTORE_PARAMS) 248784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 2488daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLboolean littleEndian = _mesa_little_endian(); 248984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 249084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2491daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL88 || 2492daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_RG88_REV); 249344c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 249484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2495daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 2496daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 2497daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 2498daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_BYTE && 2499daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák littleEndian) { 2500daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 2501daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 2502d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 25035253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2504daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2505daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 2506daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2507daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 250884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 2509e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 251084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 251184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 251284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 251384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 2514bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2515bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 2516daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 251784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 251884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 251984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 252084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 2521d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLbyte *dstRow = (GLbyte *) dstSlices[img]; 252284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 2523daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dst = dstRow; 252484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 2525daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = FLOAT_TO_BYTE_TEX(src[0]); 2526daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(src[1]); 2527daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 2; 2528daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 2; 252984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 253084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 253184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 253284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 253384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 253484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 253584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 253684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 253784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2538daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/* Texstore for signed R16, A16, L16, I16. */ 2539daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean 2540daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm16(TEXSTORE_PARAMS) 2541daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{ 2542daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLboolean littleEndian = _mesa_little_endian(); 2543daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2544daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2545daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_R16 || 2546daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_A16 || 2547daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_L16 || 2548daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_I16); 254944c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 2550daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2551daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 2552daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 2553daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 2554daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_SHORT && 2555daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák littleEndian) { 2556daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 2557daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 2558d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 25595253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2560daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2561daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 2562daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2563daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 2564daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* general path */ 2565daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2566daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat, 2567daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseFormat, 2568daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, 2569daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcFormat, srcType, srcAddr, 2570daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcPacking, 2571daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ctx->_ImageTransferState); 2572daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 2573daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLint img, row, col; 2574daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!tempImage) 2575daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_FALSE; 2576daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (img = 0; img < srcDepth; img++) { 2577d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 2578daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (row = 0; row < srcHeight; row++) { 2579daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort *dstUS = (GLshort *) dstRow; 2580daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 2581daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLushort r; 2582daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2583daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(r, src[0]); 2584daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstUS[col] = r; 2585daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 1; 2586daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2587daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 2588daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2589daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2590daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák free((void *) tempImage); 2591daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2592daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_TRUE; 2593daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák} 2594daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2595daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák/** 2596daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák * Do texstore for 2-channel, 16-bit/channel, signed normalized formats. 2597daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák */ 2598daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšákstatic GLboolean 2599daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák_mesa_texstore_snorm1616(TEXSTORE_PARAMS) 2600daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák{ 2601daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLboolean littleEndian = _mesa_little_endian(); 2602daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2603daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2604daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL1616 || 2605daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstFormat == MESA_FORMAT_SIGNED_GR1616); 260644c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 2607daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2608daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!ctx->_ImageTransferState && 2609daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák !srcPacking->SwapBytes && 2610daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat == srcFormat && 2611daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcType == GL_SHORT && 2612daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák littleEndian) { 2613daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* simple memcpy path */ 2614daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák memcpy_texture(ctx, dims, 2615d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 26165253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2617daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2618daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcAddr, srcPacking); 2619daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2620daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák else { 2621daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák /* general path */ 2622daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2623daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseInternalFormat, 2624daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák baseFormat, 2625daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcWidth, srcHeight, srcDepth, 2626daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcFormat, srcType, srcAddr, 2627daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcPacking, 2628daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák ctx->_ImageTransferState); 2629daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák const GLfloat *src = tempImage; 2630daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLint img, row, col; 2631daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák if (!tempImage) 2632daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_FALSE; 2633daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (img = 0; img < srcDepth; img++) { 2634d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 2635daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (row = 0; row < srcHeight; row++) { 2636daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLshort *dst = (GLshort *) dstRow; 2637daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák for (col = 0; col < srcWidth; col++) { 2638daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLushort l, a; 2639daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák 2640daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(l, src[0]); 2641daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák UNCLAMPED_FLOAT_TO_SHORT(a, src[1]); 2642daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = l; 2643daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = a; 2644daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák src += 2; 2645daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 2; 2646daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2647daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dstRow += dstRowStride; 2648daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2649daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2650daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák free((void *) tempImage); 2651daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák } 2652daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák return GL_TRUE; 2653daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák} 265484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 265584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul/** 265684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBX8888. 265784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul */ 265884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paulstatic GLboolean 265984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS) 266084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul{ 266184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 266284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 266384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888); 266444c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 266584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 266684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul { 266784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul /* general path */ 2668e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 266984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseInternalFormat, 267084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul baseFormat, 267184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcWidth, srcHeight, srcDepth, 267284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul srcFormat, srcType, srcAddr, 2673bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2674bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 267584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul const GLfloat *srcRow = tempImage; 267684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul GLint img, row, col; 267784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul if (!tempImage) 267884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_FALSE; 267984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (img = 0; img < srcDepth; img++) { 2680d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLbyte *dstRow = (GLbyte *) dstSlices[img]; 268184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (row = 0; row < srcHeight; row++) { 2682daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dst = dstRow; 268384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul for (col = 0; col < srcWidth; col++) { 2684daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 2685daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 2686daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 26878778bf221e90e9b59caad02ab72a0a0edcfe2451Brian Paul dst[0] = 127; 2688daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák srcRow += 3; 2689daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 4; 269084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 269184407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul dstRow += dstRowStride; 269284407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 269384407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 269484407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul free((void *) tempImage); 269584407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul } 269684407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul return GL_TRUE; 269784407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul} 269884407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 269984407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 270084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2701c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger/** 270239de9251c4770fdcce3395643003aa626178446dBrian Paul * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or 270339de9251c4770fdcce3395643003aa626178446dBrian Paul * MESA_FORMAT_SIGNED_RGBA8888_REV 2704c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */ 270549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2706c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS) 2707c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger{ 27081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2709c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 27101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 || 27111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV); 271244c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 2713c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 2714c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger if (!ctx->_ImageTransferState && 2715c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat == GL_RGBA && 27166f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 27176f55ef3740420924930eb0fc06f7c4979ce0b6ddBrian Paul srcPacking->SwapBytes)) { 2718c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* simple memcpy path */ 2719c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger memcpy_texture(ctx, dims, 2720d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 27215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2722c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2723c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcAddr, srcPacking); 2724c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2725c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger else { 2726c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* general path */ 2727e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2728c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat, 272922108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2730c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, 2731c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcFormat, srcType, srcAddr, 2732bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 2733bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 2734c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger const GLfloat *srcRow = tempImage; 2735c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger GLint img, row, col; 2736c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger if (!tempImage) 2737c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger return GL_FALSE; 2738c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (img = 0; img < srcDepth; img++) { 2739d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLbyte *dstRow = (GLbyte *) dstSlices[img]; 2740c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (row = 0; row < srcHeight; row++) { 2741daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák GLbyte *dst = dstRow; 27421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) { 2743c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (col = 0; col < srcWidth; col++) { 2744daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 2745daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 2746daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 2747daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]); 2748c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcRow += 4; 2749daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 4; 2750c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2751c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2752bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger else { 2753bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger for (col = 0; col < srcWidth; col++) { 2754daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[0] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 2755daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[1] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 2756daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[2] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 2757daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst[3] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]); 2758bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcRow += 4; 2759daa5242f9eafaf61f9f492f1e798de8701e6f498Marek Olšák dst += 4; 2760bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 2761bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 2762c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstRow += dstRowStride; 2763c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2764c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 276532f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 2766c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2767c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger return GL_TRUE; 2768c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger} 2769f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 277084407d7365e101c36a83fd0a58c58b0c0c57db14Brian Paul 2771184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul/** 2772184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul * Store a combined depth/stencil texture image. 2773184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul */ 277449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2775b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z24_s8(TEXSTORE_PARAMS) 2776184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul{ 277792098438784887fd6005918794476cfbbeac5035Karl Schultz const GLuint depthScale = 0xffffff; 2778c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz const GLint srcRowStride 2779b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 2780c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz GLint img, row; 278125cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian 27821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_Z24_S8); 2783e41a91cea764cc1ba95906251cd907d837225293Marek Olšák ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || 2784e41a91cea764cc1ba95906251cd907d837225293Marek Olšák srcFormat == GL_DEPTH_COMPONENT || 2785e41a91cea764cc1ba95906251cd907d837225293Marek Olšák srcFormat == GL_STENCIL_INDEX); 2786c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT); 2787184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 2788e41a91cea764cc1ba95906251cd907d837225293Marek Olšák if (srcFormat == GL_DEPTH_STENCIL && ctx->Pixel.DepthScale == 1.0f && 2789966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 2790184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul !srcPacking->SwapBytes) { 2791ef8653a83800bc4b8e116e03ad52604097224378Brian Paul /* simple path */ 2792184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul memcpy_texture(ctx, dims, 2793d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 27945253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 2795184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2796184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul srcAddr, srcPacking); 279739de9251c4770fdcce3395643003aa626178446dBrian Paul } 2798e41a91cea764cc1ba95906251cd907d837225293Marek Olšák else if (srcFormat == GL_DEPTH_COMPONENT || 2799e41a91cea764cc1ba95906251cd907d837225293Marek Olšák srcFormat == GL_STENCIL_INDEX) { 28002e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul GLuint *depth = (GLuint *) malloc(srcWidth * sizeof(GLuint)); 28012e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul GLubyte *stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte)); 28022e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul 28032e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul if (!depth || !stencil) { 28042e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul free(depth); 28052e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul free(stencil); 28062e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul return GL_FALSE; 28072e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul } 28082e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul 2809c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* In case we only upload depth we need to preserve the stencil */ 2810ef8653a83800bc4b8e116e03ad52604097224378Brian Paul for (img = 0; img < srcDepth; img++) { 2811d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLuint *dstRow = (GLuint *) dstSlices[img]; 2812b786db06540472beda9cedd18937d6e12855b3ebBrian Paul const GLubyte *src 2813b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2814c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcWidth, srcHeight, 2815c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcFormat, srcType, 2816c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie img, 0, 0); 2817ef8653a83800bc4b8e116e03ad52604097224378Brian Paul for (row = 0; row < srcHeight; row++) { 2818ef8653a83800bc4b8e116e03ad52604097224378Brian Paul GLint i; 2819c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; 2820c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2821c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */ 2822c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil = GL_TRUE; 282339de9251c4770fdcce3395643003aa626178446dBrian Paul } 282439de9251c4770fdcce3395643003aa626178446dBrian Paul else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */ 2825c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepdepth = GL_TRUE; 2826c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 2827c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2828c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepdepth == GL_FALSE) 2829c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* the 24 depth bits will be in the low position: */ 2830c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_depth_span(ctx, srcWidth, 2831c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_INT, /* dst type */ 2832c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil ? depth : dstRow, /* dst addr */ 2833c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie depthScale, 2834c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking); 2835c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2836c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil == GL_FALSE) 2837c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* get the 8-bit stencil values */ 2838c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_stencil_span(ctx, srcWidth, 2839c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_BYTE, /* dst type */ 2840c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie stencil, /* dst addr */ 2841c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking, 2842c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie ctx->_ImageTransferState); 2843c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2844c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (i = 0; i < srcWidth; i++) { 2845c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil) 2846c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF); 2847c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie else 2848c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF); 2849c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 2850ef8653a83800bc4b8e116e03ad52604097224378Brian Paul 2851ef8653a83800bc4b8e116e03ad52604097224378Brian Paul src += srcRowStride; 2852b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride / sizeof(GLuint); 2853ef8653a83800bc4b8e116e03ad52604097224378Brian Paul } 2854ef8653a83800bc4b8e116e03ad52604097224378Brian Paul } 28552e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul 28562e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul free(depth); 28572e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul free(stencil); 2858184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul } 2859184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul return GL_TRUE; 2860184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul} 2861184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 2862184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 2863a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz/** 2864a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz * Store a combined depth/stencil texture image. 2865a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz */ 286649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2867a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz_mesa_texstore_s8_z24(TEXSTORE_PARAMS) 2868a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz{ 2869a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz const GLuint depthScale = 0xffffff; 2870a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz const GLint srcRowStride 2871b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 2872a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz GLint img, row; 28732e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul GLuint *depth; 28742e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul GLubyte *stencil; 2875a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz 28761f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_S8_Z24); 287739de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || 287839de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat == GL_DEPTH_COMPONENT || 287939de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat == GL_STENCIL_INDEX); 288039de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || 288139de9251c4770fdcce3395643003aa626178446dBrian Paul srcType == GL_UNSIGNED_INT_24_8_EXT); 2882c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca 28832e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul depth = (GLuint *) malloc(srcWidth * sizeof(GLuint)); 28842e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte)); 28852e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul 28862e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul if (!depth || !stencil) { 28872e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul free(depth); 28882e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul free(stencil); 28892e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul return GL_FALSE; 28902e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul } 28912e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul 2892c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (img = 0; img < srcDepth; img++) { 2893d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLuint *dstRow = (GLuint *) dstSlices[img]; 2894b786db06540472beda9cedd18937d6e12855b3ebBrian Paul const GLubyte *src 2895b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2896c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcWidth, srcHeight, 2897c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcFormat, srcType, 2898c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie img, 0, 0); 2899c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (row = 0; row < srcHeight; row++) { 2900c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLint i; 2901c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; 2902c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2903c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */ 2904c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil = GL_TRUE; 290539de9251c4770fdcce3395643003aa626178446dBrian Paul } 290639de9251c4770fdcce3395643003aa626178446dBrian Paul else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */ 2907c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepdepth = GL_TRUE; 2908c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 2909666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz 2910c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepdepth == GL_FALSE) 2911c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* the 24 depth bits will be in the low position: */ 2912c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_depth_span(ctx, srcWidth, 2913c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_INT, /* dst type */ 2914c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie keepstencil ? depth : dstRow, /* dst addr */ 2915c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie depthScale, 2916c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking); 2917c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2918c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil == GL_FALSE) 2919c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* get the 8-bit stencil values */ 2920c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie _mesa_unpack_stencil_span(ctx, srcWidth, 2921c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie GL_UNSIGNED_BYTE, /* dst type */ 2922c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie stencil, /* dst addr */ 2923c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie srcType, src, srcPacking, 2924c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie ctx->_ImageTransferState); 2925c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 2926c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie /* merge stencil values into depth values */ 2927c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie for (i = 0; i < srcWidth; i++) { 2928c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie if (keepstencil) 2929c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000); 2930c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie else 2931c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24); 2932666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz 2933c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie } 2934c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie src += srcRowStride; 2935c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie dstRow += dstRowStride / sizeof(GLuint); 2936a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz } 2937a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz } 29382e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul 29392e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul free(depth); 29402e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul free(stencil); 29412e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul 2942a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz return GL_TRUE; 2943a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz} 2944f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 294539de9251c4770fdcce3395643003aa626178446dBrian Paul 294639de9251c4770fdcce3395643003aa626178446dBrian Paul/** 294739de9251c4770fdcce3395643003aa626178446dBrian Paul * Store simple 8-bit/value stencil texture data. 294839de9251c4770fdcce3395643003aa626178446dBrian Paul */ 294939de9251c4770fdcce3395643003aa626178446dBrian Paulstatic GLboolean 295039de9251c4770fdcce3395643003aa626178446dBrian Paul_mesa_texstore_s8(TEXSTORE_PARAMS) 295139de9251c4770fdcce3395643003aa626178446dBrian Paul{ 295239de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(dstFormat == MESA_FORMAT_S8); 295339de9251c4770fdcce3395643003aa626178446dBrian Paul ASSERT(srcFormat == GL_STENCIL_INDEX); 295439de9251c4770fdcce3395643003aa626178446dBrian Paul 295539de9251c4770fdcce3395643003aa626178446dBrian Paul if (!ctx->_ImageTransferState && 295639de9251c4770fdcce3395643003aa626178446dBrian Paul !srcPacking->SwapBytes && 295739de9251c4770fdcce3395643003aa626178446dBrian Paul baseInternalFormat == srcFormat && 295839de9251c4770fdcce3395643003aa626178446dBrian Paul srcType == GL_UNSIGNED_BYTE) { 295939de9251c4770fdcce3395643003aa626178446dBrian Paul /* simple memcpy path */ 296039de9251c4770fdcce3395643003aa626178446dBrian Paul memcpy_texture(ctx, dims, 2961d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 29625253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 296339de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 296439de9251c4770fdcce3395643003aa626178446dBrian Paul srcAddr, srcPacking); 296539de9251c4770fdcce3395643003aa626178446dBrian Paul } 296639de9251c4770fdcce3395643003aa626178446dBrian Paul else { 296739de9251c4770fdcce3395643003aa626178446dBrian Paul const GLint srcRowStride 2968b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 296939de9251c4770fdcce3395643003aa626178446dBrian Paul GLint img, row; 29702e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul GLubyte *stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte)); 29712e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul 29722e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul if (!stencil) 29732e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul return GL_FALSE; 29742e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul 297539de9251c4770fdcce3395643003aa626178446dBrian Paul for (img = 0; img < srcDepth; img++) { 2976d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 2977b786db06540472beda9cedd18937d6e12855b3ebBrian Paul const GLubyte *src 2978b786db06540472beda9cedd18937d6e12855b3ebBrian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 297939de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, 298039de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat, srcType, 298139de9251c4770fdcce3395643003aa626178446dBrian Paul img, 0, 0); 298239de9251c4770fdcce3395643003aa626178446dBrian Paul for (row = 0; row < srcHeight; row++) { 298339de9251c4770fdcce3395643003aa626178446dBrian Paul GLint i; 298439de9251c4770fdcce3395643003aa626178446dBrian Paul 298539de9251c4770fdcce3395643003aa626178446dBrian Paul /* get the 8-bit stencil values */ 298639de9251c4770fdcce3395643003aa626178446dBrian Paul _mesa_unpack_stencil_span(ctx, srcWidth, 298739de9251c4770fdcce3395643003aa626178446dBrian Paul GL_UNSIGNED_BYTE, /* dst type */ 298839de9251c4770fdcce3395643003aa626178446dBrian Paul stencil, /* dst addr */ 298939de9251c4770fdcce3395643003aa626178446dBrian Paul srcType, src, srcPacking, 299039de9251c4770fdcce3395643003aa626178446dBrian Paul ctx->_ImageTransferState); 299139de9251c4770fdcce3395643003aa626178446dBrian Paul /* merge stencil values into depth values */ 299239de9251c4770fdcce3395643003aa626178446dBrian Paul for (i = 0; i < srcWidth; i++) 299339de9251c4770fdcce3395643003aa626178446dBrian Paul dstRow[i] = stencil[i]; 299439de9251c4770fdcce3395643003aa626178446dBrian Paul 299539de9251c4770fdcce3395643003aa626178446dBrian Paul src += srcRowStride; 299639de9251c4770fdcce3395643003aa626178446dBrian Paul dstRow += dstRowStride / sizeof(GLubyte); 299739de9251c4770fdcce3395643003aa626178446dBrian Paul } 299839de9251c4770fdcce3395643003aa626178446dBrian Paul } 299939de9251c4770fdcce3395643003aa626178446dBrian Paul 30002e09fe4b9c7fdc57a0c98b9df977625e23a0cf1cBrian Paul free(stencil); 300139de9251c4770fdcce3395643003aa626178446dBrian Paul } 300239de9251c4770fdcce3395643003aa626178446dBrian Paul 300339de9251c4770fdcce3395643003aa626178446dBrian Paul return GL_TRUE; 300439de9251c4770fdcce3395643003aa626178446dBrian Paul} 300539de9251c4770fdcce3395643003aa626178446dBrian Paul 300639de9251c4770fdcce3395643003aa626178446dBrian Paul 3007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 3008f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Store an image in any of the formats: 3009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_rgba_float32 3010f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_rgb_float32 3011f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_alpha_float32 3012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_luminance_float32 3013f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_luminance_alpha_float32 3014f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_intensity_float32 3015f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 301649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3017b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float32(TEXSTORE_PARAMS) 3018f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 30191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 302022108bb571808542b89677752d62d3901698265fBrian Paul const GLint components = _mesa_components_in_format(baseFormat); 3021f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 30221f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 || 30231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB_FLOAT32 || 30241f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ALPHA_FLOAT32 || 30251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 || 30261f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 || 30270ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_INTENSITY_FLOAT32 || 30280ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_R_FLOAT32 || 30290ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_RG_FLOAT32); 3030f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3031f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB || 3032f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_ALPHA || 3033f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE || 3034f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 30350ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_INTENSITY || 30360ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RED || 30370ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RG); 303844c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLfloat)); 3039f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3040f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 3041f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 3042f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 30439e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák baseInternalFormat == baseFormat && 3044f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_FLOAT) { 3045f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 304617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 3047d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 30485253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3049f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3050f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 3051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3052f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 3053f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 3054e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3055f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 305622108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 3057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 3058f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 3059bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 3060bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 3061b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLfloat *srcRow = tempImage; 30629c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul GLint bytesPerRow; 3063f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 3064f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 3065f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 30669c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul bytesPerRow = srcWidth * components * sizeof(GLfloat); 3067f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 3068d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3069f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 3070c7ac486261ad30ef654f6d0b1608da4e8483cd40Kenneth Graunke memcpy(dstRow, srcRow, bytesPerRow); 3071b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 3072b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcRow += srcWidth * components; 3073f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3074f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3075f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 307632f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 3077f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3078f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 3079f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 3080f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3081c79e681a68a1ef73cdb756f7b46b2a1df1bcc710Dave Airlie 3082f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3083f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 3084f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * As above, but store 16-bit floats. 3085f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 308649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 3087b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float16(TEXSTORE_PARAMS) 3088f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 30891f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 309022108bb571808542b89677752d62d3901698265fBrian Paul const GLint components = _mesa_components_in_format(baseFormat); 3091f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 30921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 || 30931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB_FLOAT16 || 30941f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ALPHA_FLOAT16 || 30951f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 || 30961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 || 30970ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_INTENSITY_FLOAT16 || 30980ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_R_FLOAT16 || 30990ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák dstFormat == MESA_FORMAT_RG_FLOAT16); 3100f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3101f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB || 3102f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_ALPHA || 3103f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE || 3104f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 31050ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_INTENSITY || 31060ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RED || 31070ecbb0ab7472fe5cb33be13a8307e16f875254e5Marek Olšák baseInternalFormat == GL_RG); 310844c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLhalfARB)); 3109f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3110f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 3111f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 3112f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 31139e59ed59c17daeb4e77f9455ac8794307cc1cae2Marek Olšák baseInternalFormat == baseFormat && 3114f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_HALF_FLOAT_ARB) { 3115f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 311617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 3117d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 31185253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3119f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3120f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 3121f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3122f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 3123f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 3124e792e79f5ae6be008d9521eccf1c647492cd682aDave Airlie const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3125f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 312622108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 3127f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 3128f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 3129bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul srcPacking, 3130bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul ctx->_ImageTransferState); 3131f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLfloat *src = tempImage; 3132f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 3133f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 3134f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 3135f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 3136d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3137f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 3138f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLhalfARB *dstTexel = (GLhalfARB *) dstRow; 3139f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i; 3140f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < srcWidth * components; i++) { 3141f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstTexel[i] = _mesa_float_to_half(src[i]); 3142f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 3144f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcWidth * components; 3145f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3146f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3147f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 314832f2fd1c5d6088692551c80352b7d6fa35b0cd09Kristian Høgsberg free((void *) tempImage); 3149f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 3151f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 3152f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3153f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3154abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int8 */ 3155abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3156abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int8(TEXSTORE_PARAMS) 3157abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3158abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3159abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3160abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 316138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_INT8 || 316238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_INT8 || 316338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_INT8 || 316438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_INT8 || 316538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_INT8 || 316638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_INT8 || 316738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_INT8 || 316838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT8); 3169abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3170abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3171f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RG || 3172f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RED || 3173abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3174abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3175abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3176abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 317744c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLbyte)); 3178abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3179bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3180bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3181bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3182bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3183abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3184abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_BYTE) { 3185abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3186abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3187d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 31885253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3189abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3190abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3191abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3192abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3193abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 31945f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt const GLuint *tempImage = make_temp_uint_image(ctx, dims, 31955f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt baseInternalFormat, 31965f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt baseFormat, 31975f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcWidth, srcHeight, srcDepth, 31985f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcFormat, srcType, 31995f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcAddr, 32005f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcPacking); 32015f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt const GLuint *src = tempImage; 3202abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3203b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3204abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3205abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3206abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3207d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3208abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3209abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLbyte *dstTexel = (GLbyte *) dstRow; 3210abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3211b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen if (is_unsigned) { 3212b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (i = 0; i < srcWidth * components; i++) { 3213b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstTexel[i] = (GLbyte) MIN2(src[i], 0x7f); 3214b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3215b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } else { 3216b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (i = 0; i < srcWidth * components; i++) { 3217b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstTexel[i] = (GLbyte) CLAMP((GLint) src[i], -0x80, 0x7f); 3218b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3219abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3220abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3221abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3222abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3223abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3224abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3225abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3226abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3227abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3228abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3229abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3230abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3231abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int16 */ 3232abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3233abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int16(TEXSTORE_PARAMS) 3234abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3235abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3236abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3237abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 323838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_INT16 || 323938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_INT16 || 324038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_INT16 || 324138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_INT16 || 324238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_INT16 || 324338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_INT16 || 324438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_INT16 || 324538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT16); 3246abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3247abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3248f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RG || 3249f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RED || 3250abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3251abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3252abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3253abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 325444c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLshort)); 3255abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3256bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3257bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3258bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3259bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3260abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 32619fc7fa0a4cbe9dc8faa124744f623491fa754bd7Brian Paul srcType == GL_SHORT) { 3262abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3263abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3264d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 32655253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3266abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3267abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3268abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3269abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3270abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 32715f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt const GLuint *tempImage = make_temp_uint_image(ctx, dims, 32725f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt baseInternalFormat, 32735f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt baseFormat, 32745f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcWidth, srcHeight, srcDepth, 32755f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcFormat, srcType, 32765f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcAddr, 32775f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcPacking); 32785f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt const GLuint *src = tempImage; 3279abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3280b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3281abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3282abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3283abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3284d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3285abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3286abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLshort *dstTexel = (GLshort *) dstRow; 3287abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3288b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen if (is_unsigned) { 3289b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (i = 0; i < srcWidth * components; i++) { 3290b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstTexel[i] = (GLshort) MIN2(src[i], 0x7fff); 3291b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3292b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } else { 3293b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (i = 0; i < srcWidth * components; i++) { 3294b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstTexel[i] = (GLshort)CLAMP((GLint) src[i], -0x8000, 0x7fff); 3295b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3296abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3297abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3298abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3299abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3300abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3301abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3302abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3303abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3304abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3305abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3306abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3307abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3308abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, signed int32 */ 3309abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3310abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_int32(TEXSTORE_PARAMS) 3311abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3312abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3313abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3314abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 331538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_INT32 || 331638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_INT32 || 331738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_INT32 || 331838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_INT32 || 331938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_INT32 || 332038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_INT32 || 332138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_INT32 || 332238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT32); 3323abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3324abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3325f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RG || 3326f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RED || 3327abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3328abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3329abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3330abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 333144c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLint)); 3332abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3333bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3334bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3335bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3336bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3337abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3338abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_INT) { 3339abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3340abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3341d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 33425253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3343abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3344abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3345abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3346abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3347abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 33485f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt const GLuint *tempImage = make_temp_uint_image(ctx, dims, 33495f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt baseInternalFormat, 33505f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt baseFormat, 33515f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcWidth, srcHeight, srcDepth, 33525f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcFormat, srcType, 33535f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcAddr, 33545f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt srcPacking); 33555f65598cc79eccd38bf7f95ab167ed62e575daf2Eric Anholt const GLuint *src = tempImage; 3356abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3357b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3358abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3359abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3360abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3361d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3362abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3363abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint *dstTexel = (GLint *) dstRow; 3364abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3365b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen if (is_unsigned) { 3366b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (i = 0; i < srcWidth * components; i++) { 3367b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstTexel[i] = (GLint) MIN2(src[i], 0x7fffffff); 3368b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3369b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } else { 3370b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (i = 0; i < srcWidth * components; i++) { 3371b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstTexel[i] = (GLint) src[i]; 3372b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3373abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3374abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3375abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3376abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3377abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3378abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3379abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3380abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3381abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3382abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3383abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3384abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3385abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int8 */ 3386abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3387abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS) 3388abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3389abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3390abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3391abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 339238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_UINT8 || 339338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_UINT8 || 339438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_UINT8 || 339538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_UINT8 || 339638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_UINT8 || 339738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_UINT8 || 339838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_UINT8 || 339938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT8); 3400abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3401abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3402f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RG || 3403f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RED || 3404abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3405abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3406abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3407abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 340844c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLubyte)); 3409abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3410bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3411bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3412bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3413bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3414abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3415abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_BYTE) { 3416abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3417abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3418d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 34195253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3420abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3421abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3422abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3423abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3424abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3425dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *tempImage = 3426dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3427dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, srcDepth, 3428dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, srcAddr, srcPacking); 3429dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *src = tempImage; 3430abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3431b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3432abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3433abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3434abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3435d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3436abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3437abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLubyte *dstTexel = (GLubyte *) dstRow; 3438abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3439b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen if (is_unsigned) { 3440b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (i = 0; i < srcWidth * components; i++) { 3441b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstTexel[i] = (GLubyte) MIN2(src[i], 0xff); 3442b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3443b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } else { 3444b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (i = 0; i < srcWidth * components; i++) { 3445b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstTexel[i] = (GLubyte) CLAMP((GLint) src[i], 0, 0xff); 3446b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3447abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3448abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3449abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3450abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3451abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3452abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3453abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3454abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3455abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3456abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3457abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3458abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3459abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int16 */ 3460abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3461abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS) 3462abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3463abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3464abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3465abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 346638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_UINT16 || 346738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_UINT16 || 346838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_UINT16 || 346938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_UINT16 || 347038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_UINT16 || 347138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_UINT16 || 347238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_UINT16 || 347338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT16); 3474abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3475abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3476f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RG || 3477f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RED || 3478abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3479abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3480abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3481abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 348244c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLushort)); 3483abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3484bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3485bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3486bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3487bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3488abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3489abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_SHORT) { 3490abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3491abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3492d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 34935253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3494abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3495abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3496abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3497abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3498abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3499dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *tempImage = 3500dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3501dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, srcDepth, 3502dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, srcAddr, srcPacking); 3503dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *src = tempImage; 3504abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3505b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3506abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3507abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3508abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3509d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3510abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3511abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLushort *dstTexel = (GLushort *) dstRow; 3512abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3513b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen if (is_unsigned) { 3514b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (i = 0; i < srcWidth * components; i++) { 3515b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstTexel[i] = (GLushort) MIN2(src[i], 0xffff); 3516b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3517b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } else { 3518b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (i = 0; i < srcWidth * components; i++) { 3519b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstTexel[i] = (GLushort) CLAMP((GLint) src[i], 0, 0xffff); 3520b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3521abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3522abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3523abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3524abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3525abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3526abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3527abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3528abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3529abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3530abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3531abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3532abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3533abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul/* non-normalized, unsigned int32 */ 3534abd5627a6a034885b0b01b995c73870da1361bb0Brian Paulstatic GLboolean 3535abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS) 3536abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul{ 3537abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3538abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul const GLint components = _mesa_components_in_format(baseFormat); 3539abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 354038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie ASSERT(dstFormat == MESA_FORMAT_R_UINT32 || 354138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RG_UINT32 || 354238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGB_UINT32 || 354338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_RGBA_UINT32 || 354438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_ALPHA_UINT32 || 354538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_INTENSITY_UINT32 || 354638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_UINT32 || 354738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT32); 3548abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 3549abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_RGB || 3550f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RG || 3551f767e96131ba69cf61aa9f848d5f24e4396ac920Dave Airlie baseInternalFormat == GL_RED || 3552abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_ALPHA || 3553abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE || 3554abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 3555abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == GL_INTENSITY); 355644c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLuint)); 3557abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3558bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3559bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul * to integer formats. 3560bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul */ 3561bdba4608dff7fc1666e97476c2f94f9343d9eecdBrian Paul if (!srcPacking->SwapBytes && 3562abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul baseInternalFormat == srcFormat && 3563abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcType == GL_UNSIGNED_INT) { 3564abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* simple memcpy path */ 3565abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul memcpy_texture(ctx, dims, 3566d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 35675253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3568abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3569abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul srcAddr, srcPacking); 3570abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3571abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul else { 3572abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul /* general path */ 3573dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *tempImage = 3574dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3575dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcWidth, srcHeight, srcDepth, 3576dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul srcFormat, srcType, srcAddr, srcPacking); 3577dd28b4c1fc56106e5ac2f13767f41b9f721dbb36Brian Paul const GLuint *src = tempImage; 3578b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3579abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint img, row; 3580abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (!tempImage) 3581abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_FALSE; 3582abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (img = 0; img < srcDepth; img++) { 3583d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3584abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul for (row = 0; row < srcHeight; row++) { 3585abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLuint *dstTexel = (GLuint *) dstRow; 3586abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul GLint i; 3587b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen if (is_unsigned) { 3588b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (i = 0; i < srcWidth * components; i++) { 3589b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstTexel[i] = src[i]; 3590b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3591b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } else { 3592b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (i = 0; i < srcWidth * components; i++) { 3593b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstTexel[i] = MAX2((GLint) src[i], 0); 3594b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3595abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3596abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul dstRow += dstRowStride; 3597abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul src += srcWidth * components; 3598abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3599abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3600abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3601abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul free((void *) tempImage); 3602abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3603abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_TRUE; 3604abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul} 3605abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3606abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3607abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 3608abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 36098d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#if FEATURE_EXT_texture_sRGB 361049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 36118d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgb8(TEXSTORE_PARAMS) 36128d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 36131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 361446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 361546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 36161f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SRGB8); 361746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 361846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal rgb texstore code */ 36191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_RGB888; 362046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 36210f91e4461fb3a7410c948acde270d97caa851ed6Brian Paul k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat, 36225253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 36235253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 362439de9251c4770fdcce3395643003aa626178446dBrian Paul srcWidth, srcHeight, srcDepth, 362539de9251c4770fdcce3395643003aa626178446dBrian Paul srcFormat, srcType, 362639de9251c4770fdcce3395643003aa626178446dBrian Paul srcAddr, srcPacking); 362746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 36288d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 36298d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 363054e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 363149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 36328d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgba8(TEXSTORE_PARAMS) 36338d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 36341f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 363546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 363646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 36371f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SRGBA8); 363846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 363946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal rgba texstore code */ 36401f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_RGBA8888; 364146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat, 36425253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 36435253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 364446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcWidth, srcHeight, srcDepth, 364546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcFormat, srcType, 364646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcAddr, srcPacking); 364746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 36488d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 36498d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 365054e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 365149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 36525bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger_mesa_texstore_sargb8(TEXSTORE_PARAMS) 36535bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{ 36541f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 36555bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger GLboolean k; 36565bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 36571f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SARGB8); 36585bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 36595bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger /* reuse normal rgba texstore code */ 36601f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_ARGB8888; 36615bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 36625bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat, 36635253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 36645253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 36655bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcWidth, srcHeight, srcDepth, 36665bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcFormat, srcType, 36675bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcAddr, srcPacking); 36685bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger return k; 36695bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger} 36705bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 36715bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 367249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 36738d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sl8(TEXSTORE_PARAMS) 36748d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 36751f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 367646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 367746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 36781f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SL8); 367946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 36801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_L8; 368146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 368254e15d65858c1d1eeea7291059766686cf2e1671Brian Paul /* _mesa_textore_a8 handles luminance8 too */ 3683bb0910bfa6dcdbf6fd9b58ebc21a14e40e066633Marek Olšák k = _mesa_texstore_unorm8(ctx, dims, baseInternalFormat, 36845253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 36855253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 36865253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul srcWidth, srcHeight, srcDepth, 36875253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul srcFormat, srcType, 36885253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul srcAddr, srcPacking); 368946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 36908d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 36918d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 369254e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 369349263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 36948d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sla8(TEXSTORE_PARAMS) 36958d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 36961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 369746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 369846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 36991f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SLA8); 370046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 370146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal luminance/alpha texstore code */ 37021f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_AL88; 370346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 37045d1387b2da3626326410804026f8b92f1a121fdcIan Romanick k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat, 37055253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul newDstFormat, 37065253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 37075d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcWidth, srcHeight, srcDepth, 37085d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcFormat, srcType, 37095d1387b2da3626326410804026f8b92f1a121fdcIan Romanick srcAddr, srcPacking); 371046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 37118d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 37128d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 37139927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#else 37149927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu 37159927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu/* these are used only in texstore_funcs[] below */ 37169927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgb8 NULL 37179927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgba8 NULL 37189927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sargb8 NULL 37199927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sl8 NULL 37209927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sla8 NULL 37219927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu 37228d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#endif /* FEATURE_EXT_texture_sRGB */ 37238d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 37249d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšákstatic GLboolean 37259d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák_mesa_texstore_rgb9_e5(TEXSTORE_PARAMS) 37269d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák{ 37279d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 37289d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák 37299d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák ASSERT(dstFormat == MESA_FORMAT_RGB9_E5_FLOAT); 37309d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák ASSERT(baseInternalFormat == GL_RGB); 37319d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák 37329d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák if (!ctx->_ImageTransferState && 373307ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 373407ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul srcPacking->SwapBytes)) { 37359d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák /* simple memcpy path */ 37369d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák memcpy_texture(ctx, dims, 3737d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 37385253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 37399d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 37409d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcAddr, srcPacking); 37419d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 37429d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák else { 37439d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák /* general path */ 37449d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 37459d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák baseInternalFormat, 37469d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák baseFormat, 37479d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcWidth, srcHeight, srcDepth, 37489d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcFormat, srcType, srcAddr, 37499d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcPacking, 37509d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák ctx->_ImageTransferState); 37519d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák const GLfloat *srcRow = tempImage; 37529d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLint img, row, col; 37539d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák if (!tempImage) 37549d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák return GL_FALSE; 37559d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (img = 0; img < srcDepth; img++) { 3756d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 37579d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (row = 0; row < srcHeight; row++) { 37589d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák GLuint *dstUI = (GLuint*)dstRow; 37599d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák for (col = 0; col < srcWidth; col++) { 37609d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák dstUI[col] = float3_to_rgb9e5(&srcRow[col * 3]); 37619d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 37629d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák dstRow += dstRowStride; 37639d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák srcRow += srcWidth * 3; 37649d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 37659d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 37669d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák 37679d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák free((void *) tempImage); 37689d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák } 37699d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák return GL_TRUE; 37709d7698c468f4ea7da8bb4ec00520c98f11cca0faMarek Olšák} 3771f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3772631d23daa91c569bf268a2191bd466df73a64263Marek Olšákstatic GLboolean 3773631d23daa91c569bf268a2191bd466df73a64263Marek Olšák_mesa_texstore_r11_g11_b10f(TEXSTORE_PARAMS) 3774631d23daa91c569bf268a2191bd466df73a64263Marek Olšák{ 3775631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3776631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 3777631d23daa91c569bf268a2191bd466df73a64263Marek Olšák ASSERT(dstFormat == MESA_FORMAT_R11_G11_B10_FLOAT); 3778631d23daa91c569bf268a2191bd466df73a64263Marek Olšák ASSERT(baseInternalFormat == GL_RGB); 3779631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 3780631d23daa91c569bf268a2191bd466df73a64263Marek Olšák if (!ctx->_ImageTransferState && 378107ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 378207ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul srcPacking->SwapBytes)) { 3783631d23daa91c569bf268a2191bd466df73a64263Marek Olšák /* simple memcpy path */ 3784631d23daa91c569bf268a2191bd466df73a64263Marek Olšák memcpy_texture(ctx, dims, 3785d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 37865253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3787631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3788631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcAddr, srcPacking); 3789631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3790631d23daa91c569bf268a2191bd466df73a64263Marek Olšák else { 3791631d23daa91c569bf268a2191bd466df73a64263Marek Olšák /* general path */ 3792631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3793631d23daa91c569bf268a2191bd466df73a64263Marek Olšák baseInternalFormat, 3794631d23daa91c569bf268a2191bd466df73a64263Marek Olšák baseFormat, 3795631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcWidth, srcHeight, srcDepth, 3796631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcFormat, srcType, srcAddr, 3797631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcPacking, 3798631d23daa91c569bf268a2191bd466df73a64263Marek Olšák ctx->_ImageTransferState); 3799631d23daa91c569bf268a2191bd466df73a64263Marek Olšák const GLfloat *srcRow = tempImage; 3800631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLint img, row, col; 3801631d23daa91c569bf268a2191bd466df73a64263Marek Olšák if (!tempImage) 3802631d23daa91c569bf268a2191bd466df73a64263Marek Olšák return GL_FALSE; 3803631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (img = 0; img < srcDepth; img++) { 3804d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3805631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (row = 0; row < srcHeight; row++) { 3806631d23daa91c569bf268a2191bd466df73a64263Marek Olšák GLuint *dstUI = (GLuint*)dstRow; 3807631d23daa91c569bf268a2191bd466df73a64263Marek Olšák for (col = 0; col < srcWidth; col++) { 3808631d23daa91c569bf268a2191bd466df73a64263Marek Olšák dstUI[col] = float3_to_r11g11b10f(&srcRow[col * 3]); 3809631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3810631d23daa91c569bf268a2191bd466df73a64263Marek Olšák dstRow += dstRowStride; 3811631d23daa91c569bf268a2191bd466df73a64263Marek Olšák srcRow += srcWidth * 3; 3812631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3813631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3814631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 3815631d23daa91c569bf268a2191bd466df73a64263Marek Olšák free((void *) tempImage); 3816631d23daa91c569bf268a2191bd466df73a64263Marek Olšák } 3817631d23daa91c569bf268a2191bd466df73a64263Marek Olšák return GL_TRUE; 3818631d23daa91c569bf268a2191bd466df73a64263Marek Olšák} 3819631d23daa91c569bf268a2191bd466df73a64263Marek Olšák 3820485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3821b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšákstatic GLboolean 3822b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák_mesa_texstore_z32f_x24s8(TEXSTORE_PARAMS) 3823b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák{ 3824b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ASSERT(dstFormat == MESA_FORMAT_Z32_FLOAT_X24S8); 3825b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ASSERT(srcFormat == GL_DEPTH_STENCIL || 3826b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat == GL_DEPTH_COMPONENT || 3827b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat == GL_STENCIL_INDEX); 3828b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ASSERT(srcFormat != GL_DEPTH_STENCIL || 3829b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 3830b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 3831b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák if (srcFormat == GL_DEPTH_STENCIL && 3832b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ctx->Pixel.DepthScale == 1.0f && 3833b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ctx->Pixel.DepthBias == 0.0f && 3834b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák !srcPacking->SwapBytes) { 3835b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák /* simple path */ 3836b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák memcpy_texture(ctx, dims, 3837d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 38385253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 3839b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3840b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcAddr, srcPacking); 3841b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 3842b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák else if (srcFormat == GL_DEPTH_COMPONENT || 3843b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat == GL_STENCIL_INDEX) { 3844b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák GLint img, row; 3845b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák const GLint srcRowStride 3846b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType) 3847b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák / sizeof(uint64_t); 3848b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 3849b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák /* In case we only upload depth we need to preserve the stencil */ 3850b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák for (img = 0; img < srcDepth; img++) { 3851d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul uint64_t *dstRow = (uint64_t *) dstSlices[img]; 3852b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák const uint64_t *src 3853b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák = (const uint64_t *) _mesa_image_address(dims, srcPacking, srcAddr, 3854b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcWidth, srcHeight, 3855b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcFormat, srcType, 3856b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák img, 0, 0); 3857b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák for (row = 0; row < srcHeight; row++) { 3858b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák /* The unpack functions with: 3859b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák * dstType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV 3860b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák * only write their own dword, so the other dword (stencil 3861b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák * or depth) is preserved. */ 3862b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák if (srcFormat != GL_STENCIL_INDEX) 3863b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák _mesa_unpack_depth_span(ctx, srcWidth, 3864b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */ 3865b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstRow, /* dst addr */ 3866a240c998ac649d79f423bb0c445993132cd56f97Brian Paul ~0U, srcType, src, srcPacking); 3867b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 3868b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák if (srcFormat != GL_DEPTH_COMPONENT) 3869b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák _mesa_unpack_stencil_span(ctx, srcWidth, 3870b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */ 3871b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstRow, /* dst addr */ 3872b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák srcType, src, srcPacking, 3873b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák ctx->_ImageTransferState); 3874b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 3875b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák src += srcRowStride; 3876b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák dstRow += dstRowStride / sizeof(uint64_t); 3877b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 3878b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 3879b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák } 3880b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák return GL_TRUE; 3881b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák} 3882b2f087cd87ab9b1651d221b5c7d7e543a4585d68Marek Olšák 3883920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wustatic GLboolean 3884f449be660e70aac2aefd2ce84581e137de25520bDave Airlie_mesa_texstore_argb2101010_uint(TEXSTORE_PARAMS) 3885f449be660e70aac2aefd2ce84581e137de25520bDave Airlie{ 3886f449be660e70aac2aefd2ce84581e137de25520bDave Airlie const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3887f449be660e70aac2aefd2ce84581e137de25520bDave Airlie 3888f449be660e70aac2aefd2ce84581e137de25520bDave Airlie ASSERT(dstFormat == MESA_FORMAT_ARGB2101010_UINT); 388944c089bd485a00462aeac361736035dc56895441Vinson Lee ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 3890f449be660e70aac2aefd2ce84581e137de25520bDave Airlie 389107ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul if (baseInternalFormat == GL_RGBA && 389207ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 389307ff5adc323dc0ea038094d6f78ee0db18521a7dBrian Paul srcPacking->SwapBytes)) { 3894f449be660e70aac2aefd2ce84581e137de25520bDave Airlie /* simple memcpy path */ 3895f449be660e70aac2aefd2ce84581e137de25520bDave Airlie memcpy_texture(ctx, dims, 3896d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 3897f449be660e70aac2aefd2ce84581e137de25520bDave Airlie dstRowStride, dstSlices, 3898f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3899f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcAddr, srcPacking); 3900f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 3901f449be660e70aac2aefd2ce84581e137de25520bDave Airlie else { 3902f449be660e70aac2aefd2ce84581e137de25520bDave Airlie /* general path */ 3903f449be660e70aac2aefd2ce84581e137de25520bDave Airlie const GLuint *tempImage = make_temp_uint_image(ctx, dims, 3904f449be660e70aac2aefd2ce84581e137de25520bDave Airlie baseInternalFormat, 3905f449be660e70aac2aefd2ce84581e137de25520bDave Airlie baseFormat, 3906f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcWidth, srcHeight, 3907f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcDepth, srcFormat, 3908f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcType, srcAddr, 3909f449be660e70aac2aefd2ce84581e137de25520bDave Airlie srcPacking); 3910f449be660e70aac2aefd2ce84581e137de25520bDave Airlie const GLuint *src = tempImage; 3911f449be660e70aac2aefd2ce84581e137de25520bDave Airlie GLint img, row, col; 3912b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3913f449be660e70aac2aefd2ce84581e137de25520bDave Airlie if (!tempImage) 3914f449be660e70aac2aefd2ce84581e137de25520bDave Airlie return GL_FALSE; 3915f449be660e70aac2aefd2ce84581e137de25520bDave Airlie for (img = 0; img < srcDepth; img++) { 3916d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul GLubyte *dstRow = dstSlices[img]; 3917f449be660e70aac2aefd2ce84581e137de25520bDave Airlie 3918f449be660e70aac2aefd2ce84581e137de25520bDave Airlie for (row = 0; row < srcHeight; row++) { 3919f449be660e70aac2aefd2ce84581e137de25520bDave Airlie GLuint *dstUI = (GLuint *) dstRow; 3920b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen if (is_unsigned) { 3921b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (col = 0; col < srcWidth; col++) { 3922b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen GLushort a,r,g,b; 3923b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen r = MIN2(src[RCOMP], 0x3ff); 3924b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen g = MIN2(src[GCOMP], 0x3ff); 3925b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen b = MIN2(src[BCOMP], 0x3ff); 3926b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen a = MIN2(src[ACOMP], 0x003); 3927b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b); 3928b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen src += 4; 3929b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3930b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } else { 3931b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen for (col = 0; col < srcWidth; col++) { 3932b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen GLushort a,r,g,b; 3933b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen r = CLAMP((GLint) src[RCOMP], 0, 0x3ff); 3934b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen g = CLAMP((GLint) src[GCOMP], 0, 0x3ff); 3935b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen b = CLAMP((GLint) src[BCOMP], 0, 0x3ff); 3936b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen a = CLAMP((GLint) src[ACOMP], 0, 0x003); 3937b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b); 3938b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen src += 4; 3939b3dd048cbb310b2c3ea40f09f9d89944851b2048Jordan Justen } 3940f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 3941f449be660e70aac2aefd2ce84581e137de25520bDave Airlie dstRow += dstRowStride; 3942f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 3943f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 3944f449be660e70aac2aefd2ce84581e137de25520bDave Airlie free((void *) tempImage); 3945f449be660e70aac2aefd2ce84581e137de25520bDave Airlie } 3946f449be660e70aac2aefd2ce84581e137de25520bDave Airlie return GL_TRUE; 3947f449be660e70aac2aefd2ce84581e137de25520bDave Airlie} 3948f449be660e70aac2aefd2ce84581e137de25520bDave Airlie 3949f449be660e70aac2aefd2ce84581e137de25520bDave Airliestatic GLboolean 3950749c9060aca85277c388377d15fd6323ba20b78eJordan Justen_mesa_texstore_abgr2101010_uint(TEXSTORE_PARAMS) 3951749c9060aca85277c388377d15fd6323ba20b78eJordan Justen{ 3952749c9060aca85277c388377d15fd6323ba20b78eJordan Justen const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3953749c9060aca85277c388377d15fd6323ba20b78eJordan Justen 3954749c9060aca85277c388377d15fd6323ba20b78eJordan Justen ASSERT(dstFormat == MESA_FORMAT_ABGR2101010_UINT); 3955749c9060aca85277c388377d15fd6323ba20b78eJordan Justen ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 3956749c9060aca85277c388377d15fd6323ba20b78eJordan Justen 3957749c9060aca85277c388377d15fd6323ba20b78eJordan Justen if (baseInternalFormat == GL_RGBA && 3958749c9060aca85277c388377d15fd6323ba20b78eJordan Justen _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 3959749c9060aca85277c388377d15fd6323ba20b78eJordan Justen srcPacking->SwapBytes)) { 3960749c9060aca85277c388377d15fd6323ba20b78eJordan Justen /* simple memcpy path */ 3961749c9060aca85277c388377d15fd6323ba20b78eJordan Justen memcpy_texture(ctx, dims, 3962749c9060aca85277c388377d15fd6323ba20b78eJordan Justen dstFormat, 3963749c9060aca85277c388377d15fd6323ba20b78eJordan Justen dstRowStride, dstSlices, 3964749c9060aca85277c388377d15fd6323ba20b78eJordan Justen srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3965749c9060aca85277c388377d15fd6323ba20b78eJordan Justen srcAddr, srcPacking); 3966749c9060aca85277c388377d15fd6323ba20b78eJordan Justen } 3967749c9060aca85277c388377d15fd6323ba20b78eJordan Justen else { 3968749c9060aca85277c388377d15fd6323ba20b78eJordan Justen /* general path */ 3969749c9060aca85277c388377d15fd6323ba20b78eJordan Justen const GLuint *tempImage = make_temp_uint_image(ctx, dims, 3970749c9060aca85277c388377d15fd6323ba20b78eJordan Justen baseInternalFormat, 3971749c9060aca85277c388377d15fd6323ba20b78eJordan Justen baseFormat, 3972749c9060aca85277c388377d15fd6323ba20b78eJordan Justen srcWidth, srcHeight, 3973749c9060aca85277c388377d15fd6323ba20b78eJordan Justen srcDepth, srcFormat, 3974749c9060aca85277c388377d15fd6323ba20b78eJordan Justen srcType, srcAddr, 3975749c9060aca85277c388377d15fd6323ba20b78eJordan Justen srcPacking); 3976749c9060aca85277c388377d15fd6323ba20b78eJordan Justen const GLuint *src = tempImage; 3977749c9060aca85277c388377d15fd6323ba20b78eJordan Justen GLint img, row, col; 3978749c9060aca85277c388377d15fd6323ba20b78eJordan Justen GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3979749c9060aca85277c388377d15fd6323ba20b78eJordan Justen if (!tempImage) 3980749c9060aca85277c388377d15fd6323ba20b78eJordan Justen return GL_FALSE; 3981749c9060aca85277c388377d15fd6323ba20b78eJordan Justen for (img = 0; img < srcDepth; img++) { 3982749c9060aca85277c388377d15fd6323ba20b78eJordan Justen GLubyte *dstRow = dstSlices[img]; 3983749c9060aca85277c388377d15fd6323ba20b78eJordan Justen 3984749c9060aca85277c388377d15fd6323ba20b78eJordan Justen for (row = 0; row < srcHeight; row++) { 3985749c9060aca85277c388377d15fd6323ba20b78eJordan Justen GLuint *dstUI = (GLuint *) dstRow; 3986749c9060aca85277c388377d15fd6323ba20b78eJordan Justen if (is_unsigned) { 3987749c9060aca85277c388377d15fd6323ba20b78eJordan Justen for (col = 0; col < srcWidth; col++) { 3988749c9060aca85277c388377d15fd6323ba20b78eJordan Justen GLushort a,r,g,b; 3989749c9060aca85277c388377d15fd6323ba20b78eJordan Justen r = MIN2(src[RCOMP], 0x3ff); 3990749c9060aca85277c388377d15fd6323ba20b78eJordan Justen g = MIN2(src[GCOMP], 0x3ff); 3991749c9060aca85277c388377d15fd6323ba20b78eJordan Justen b = MIN2(src[BCOMP], 0x3ff); 3992749c9060aca85277c388377d15fd6323ba20b78eJordan Justen a = MIN2(src[ACOMP], 0x003); 3993749c9060aca85277c388377d15fd6323ba20b78eJordan Justen dstUI[col] = (a << 30) | (b << 20) | (g << 10) | (r); 3994749c9060aca85277c388377d15fd6323ba20b78eJordan Justen src += 4; 3995749c9060aca85277c388377d15fd6323ba20b78eJordan Justen } 3996749c9060aca85277c388377d15fd6323ba20b78eJordan Justen } else { 3997749c9060aca85277c388377d15fd6323ba20b78eJordan Justen for (col = 0; col < srcWidth; col++) { 3998749c9060aca85277c388377d15fd6323ba20b78eJordan Justen GLushort a,r,g,b; 3999749c9060aca85277c388377d15fd6323ba20b78eJordan Justen r = CLAMP((GLint) src[RCOMP], 0, 0x3ff); 4000749c9060aca85277c388377d15fd6323ba20b78eJordan Justen g = CLAMP((GLint) src[GCOMP], 0, 0x3ff); 4001749c9060aca85277c388377d15fd6323ba20b78eJordan Justen b = CLAMP((GLint) src[BCOMP], 0, 0x3ff); 4002749c9060aca85277c388377d15fd6323ba20b78eJordan Justen a = CLAMP((GLint) src[ACOMP], 0, 0x003); 4003749c9060aca85277c388377d15fd6323ba20b78eJordan Justen dstUI[col] = (a << 30) | (b << 20) | (g << 10) | (r); 4004749c9060aca85277c388377d15fd6323ba20b78eJordan Justen src += 4; 4005749c9060aca85277c388377d15fd6323ba20b78eJordan Justen } 4006749c9060aca85277c388377d15fd6323ba20b78eJordan Justen } 4007749c9060aca85277c388377d15fd6323ba20b78eJordan Justen dstRow += dstRowStride; 4008749c9060aca85277c388377d15fd6323ba20b78eJordan Justen } 4009749c9060aca85277c388377d15fd6323ba20b78eJordan Justen } 4010749c9060aca85277c388377d15fd6323ba20b78eJordan Justen free((void *) tempImage); 4011749c9060aca85277c388377d15fd6323ba20b78eJordan Justen } 4012749c9060aca85277c388377d15fd6323ba20b78eJordan Justen return GL_TRUE; 4013749c9060aca85277c388377d15fd6323ba20b78eJordan Justen} 4014749c9060aca85277c388377d15fd6323ba20b78eJordan Justen 4015749c9060aca85277c388377d15fd6323ba20b78eJordan Justenstatic GLboolean 4016920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu_mesa_texstore_null(TEXSTORE_PARAMS) 4017920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu{ 4018920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) ctx; (void) dims; 4019920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) baseInternalFormat; 4020920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstFormat; 40215253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul (void) dstRowStride; (void) dstSlices, 4022920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcWidth; (void) srcHeight; (void) srcDepth; 4023920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcFormat; (void) srcType; 4024920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcAddr; 4025920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcPacking; 4026920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 4027920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu /* should never happen */ 4028920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu _mesa_problem(NULL, "_mesa_texstore_null() is called"); 4029920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu return GL_FALSE; 4030920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu} 4031920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 4032920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 4033485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/** 4034485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Return the StoreTexImageFunc pointer to store an image in the given format. 4035485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */ 4036e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paulstatic StoreTexImageFunc 4037485105ed182e2e997b084f047e72d5a2c3460057Brian Paul_mesa_get_texstore_func(gl_format format) 4038485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{ 40396e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie static StoreTexImageFunc table[MESA_FORMAT_COUNT]; 40406e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie static GLboolean initialized = GL_FALSE; 40416e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie 40426e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie if (!initialized) { 40436e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_NONE] = _mesa_texstore_null; 40446e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie 40456e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA8888] = _mesa_texstore_rgba8888; 40466e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA8888_REV] = _mesa_texstore_rgba8888; 40476e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB8888] = _mesa_texstore_argb8888; 40486e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB8888_REV] = _mesa_texstore_argb8888; 4049d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu table[MESA_FORMAT_RGBX8888] = _mesa_texstore_rgba8888; 4050d4fcf67a3ac78c29448000486dadc2b4b1b2a56dChia-I Wu table[MESA_FORMAT_RGBX8888_REV] = _mesa_texstore_rgba8888; 40516e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_XRGB8888] = _mesa_texstore_argb8888; 40526e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_XRGB8888_REV] = _mesa_texstore_argb8888; 40536e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB888] = _mesa_texstore_rgb888; 40546e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_BGR888] = _mesa_texstore_bgr888; 40556e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB565] = _mesa_texstore_rgb565; 40566e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB565_REV] = _mesa_texstore_rgb565; 40576e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB4444] = _mesa_texstore_argb4444; 40586e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB4444_REV] = _mesa_texstore_argb4444; 40596e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA5551] = _mesa_texstore_rgba5551; 40606e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB1555] = _mesa_texstore_argb1555; 40616e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB1555_REV] = _mesa_texstore_argb1555; 40626e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL44] = _mesa_texstore_unorm44; 40636e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL88] = _mesa_texstore_unorm88; 40646e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL88_REV] = _mesa_texstore_unorm88; 40656e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL1616] = _mesa_texstore_unorm1616; 40666e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_AL1616_REV] = _mesa_texstore_unorm1616; 40676e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB332] = _mesa_texstore_rgb332; 40686e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_A8] = _mesa_texstore_unorm8; 40696e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_A16] = _mesa_texstore_unorm16; 40706e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_L8] = _mesa_texstore_unorm8; 40716e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_L16] = _mesa_texstore_unorm16; 40726e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_I8] = _mesa_texstore_unorm8; 40736e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_I16] = _mesa_texstore_unorm16; 40746e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_YCBCR] = _mesa_texstore_ycbcr; 40756e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_YCBCR_REV] = _mesa_texstore_ycbcr; 40766e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R8] = _mesa_texstore_unorm8; 40770a3c895f341ae458b09dcdc9cbd674600366a925Brian Paul table[MESA_FORMAT_GR88] = _mesa_texstore_unorm88; 4078b4aecc4e1861e60e40e14868719219084967e46dBrian Paul table[MESA_FORMAT_RG88] = _mesa_texstore_unorm88; 40796e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R16] = _mesa_texstore_unorm16; 40806e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG1616] = _mesa_texstore_unorm1616; 40816e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG1616_REV] = _mesa_texstore_unorm1616; 40826e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ARGB2101010] = _mesa_texstore_argb2101010; 40836e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z24_S8] = _mesa_texstore_z24_s8; 40846e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_S8_Z24] = _mesa_texstore_s8_z24; 40856e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z16] = _mesa_texstore_z16; 40866e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_X8_Z24] = _mesa_texstore_x8_z24; 40876e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z24_X8] = _mesa_texstore_z24_x8; 40886e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z32] = _mesa_texstore_z32; 40896e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_S8] = _mesa_texstore_s8; 40906e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGB8] = _mesa_texstore_srgb8; 40916e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGBA8] = _mesa_texstore_srgba8; 40926e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SARGB8] = _mesa_texstore_sargb8; 40936e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SL8] = _mesa_texstore_sl8; 40946e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SLA8] = _mesa_texstore_sla8; 40956e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGB_DXT1] = _mesa_texstore_rgb_dxt1; 40966e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGBA_DXT1] = _mesa_texstore_rgba_dxt1; 40976e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGBA_DXT3] = _mesa_texstore_rgba_dxt3; 40986e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SRGBA_DXT5] = _mesa_texstore_rgba_dxt5; 40996e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB_FXT1] = _mesa_texstore_rgb_fxt1; 41006e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_FXT1] = _mesa_texstore_rgba_fxt1; 41016e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB_DXT1] = _mesa_texstore_rgb_dxt1; 41026e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_DXT1] = _mesa_texstore_rgba_dxt1; 41036e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_DXT3] = _mesa_texstore_rgba_dxt3; 41046e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_DXT5] = _mesa_texstore_rgba_dxt5; 41056e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_FLOAT32] = _mesa_texstore_rgba_float32; 41066e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_FLOAT16] = _mesa_texstore_rgba_float16; 41076e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB_FLOAT32] = _mesa_texstore_rgba_float32; 41086e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB_FLOAT16] = _mesa_texstore_rgba_float16; 41096e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32; 41106e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16; 41116e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LUMINANCE_FLOAT32] = _mesa_texstore_rgba_float32; 41126e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LUMINANCE_FLOAT16] = _mesa_texstore_rgba_float16; 41136e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32; 41146e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16; 41156e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_INTENSITY_FLOAT32] = _mesa_texstore_rgba_float32; 41166e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_INTENSITY_FLOAT16] = _mesa_texstore_rgba_float16; 41176e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R_FLOAT32] = _mesa_texstore_rgba_float32; 41186e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R_FLOAT16] = _mesa_texstore_rgba_float16; 41196e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG_FLOAT32] = _mesa_texstore_rgba_float32; 41206e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG_FLOAT16] = _mesa_texstore_rgba_float16; 41216e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_DUDV8] = _mesa_texstore_dudv8; 41226e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_R8] = _mesa_texstore_snorm8; 41236e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RG88_REV] = _mesa_texstore_snorm88; 41246e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGBX8888] = _mesa_texstore_signed_rgbx8888; 41256e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGBA8888] = _mesa_texstore_signed_rgba8888; 41266e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGBA8888_REV] = _mesa_texstore_signed_rgba8888; 41276e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_R16] = _mesa_texstore_snorm16; 41286e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_GR1616] = _mesa_texstore_snorm1616; 41296e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGB_16] = _mesa_texstore_signed_rgba_16; 41306e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RGBA_16] = _mesa_texstore_signed_rgba_16; 41316e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGBA_16] = _mesa_texstore_rgba_16; 41326e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RED_RGTC1] = _mesa_texstore_red_rgtc1; 41336e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RED_RGTC1] = _mesa_texstore_signed_red_rgtc1; 41346e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RG_RGTC2] = _mesa_texstore_rg_rgtc2; 41356e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_RG_RGTC2] = _mesa_texstore_signed_rg_rgtc2; 41366e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_L_LATC1] = _mesa_texstore_red_rgtc1; 41376e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_L_LATC1] = _mesa_texstore_signed_red_rgtc1; 41386e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_LA_LATC2] = _mesa_texstore_rg_rgtc2; 41396e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_LA_LATC2] = _mesa_texstore_signed_rg_rgtc2; 4140d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu table[MESA_FORMAT_ETC1_RGB8] = _mesa_texstore_etc1_rgb8; 41416e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_A8] = _mesa_texstore_snorm8; 41426e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_L8] = _mesa_texstore_snorm8; 41436e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_AL88] = _mesa_texstore_snorm88; 41446e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_I8] = _mesa_texstore_snorm8; 41456e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_A16] = _mesa_texstore_snorm16; 41466e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_L16] = _mesa_texstore_snorm16; 41476e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_AL1616] = _mesa_texstore_snorm1616; 41486e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_SIGNED_I16] = _mesa_texstore_snorm16; 41496e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_RGB9_E5_FLOAT] = _mesa_texstore_rgb9_e5; 41506e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_R11_G11_B10_FLOAT] = _mesa_texstore_r11_g11_b10f; 41516e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z32_FLOAT] = _mesa_texstore_z32; 41526e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie table[MESA_FORMAT_Z32_FLOAT_X24S8] = _mesa_texstore_z32f_x24s8; 415338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 415438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_UINT8] = _mesa_texstore_rgba_uint8; 415538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_UINT16] = _mesa_texstore_rgba_uint16; 415638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_UINT32] = _mesa_texstore_rgba_uint32; 415738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_INT8] = _mesa_texstore_rgba_int8; 415838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_INT16] = _mesa_texstore_rgba_int16; 415938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_ALPHA_INT32] = _mesa_texstore_rgba_int32; 416038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 416138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_UINT8] = _mesa_texstore_rgba_uint8; 416238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_UINT16] = _mesa_texstore_rgba_uint16; 416338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_UINT32] = _mesa_texstore_rgba_uint32; 416438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_INT8] = _mesa_texstore_rgba_int8; 416538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_INT16] = _mesa_texstore_rgba_int16; 416638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_INTENSITY_INT32] = _mesa_texstore_rgba_int32; 416738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 416838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_UINT8] = _mesa_texstore_rgba_uint8; 416938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_UINT16] = _mesa_texstore_rgba_uint16; 417038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_UINT32] = _mesa_texstore_rgba_uint32; 417138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_INT8] = _mesa_texstore_rgba_int8; 417238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_INT16] = _mesa_texstore_rgba_int16; 417338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_INT32] = _mesa_texstore_rgba_int32; 417438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 417538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = _mesa_texstore_rgba_uint8; 417638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = _mesa_texstore_rgba_uint16; 417738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = _mesa_texstore_rgba_uint32; 417838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_INT8] = _mesa_texstore_rgba_int8; 417938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_INT16] = _mesa_texstore_rgba_int16; 418038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_LUMINANCE_ALPHA_INT32] = _mesa_texstore_rgba_int32; 418138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 418238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_INT8] = _mesa_texstore_rgba_int8; 418338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_INT8] = _mesa_texstore_rgba_int8; 418438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_INT8] = _mesa_texstore_rgba_int8; 418538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_INT8] = _mesa_texstore_rgba_int8; 418638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_INT16] = _mesa_texstore_rgba_int16; 418738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_INT16] = _mesa_texstore_rgba_int16; 418838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_INT16] = _mesa_texstore_rgba_int16; 418938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_INT16] = _mesa_texstore_rgba_int16; 419038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_INT32] = _mesa_texstore_rgba_int32; 419138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_INT32] = _mesa_texstore_rgba_int32; 419238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_INT32] = _mesa_texstore_rgba_int32; 419338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_INT32] = _mesa_texstore_rgba_int32; 419438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 419538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_UINT8] = _mesa_texstore_rgba_uint8; 419638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_UINT8] = _mesa_texstore_rgba_uint8; 419738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_UINT8] = _mesa_texstore_rgba_uint8; 419838db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_UINT8] = _mesa_texstore_rgba_uint8; 419938db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_UINT16] = _mesa_texstore_rgba_uint16; 420038db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_UINT16] = _mesa_texstore_rgba_uint16; 420138db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_UINT16] = _mesa_texstore_rgba_uint16; 420238db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_UINT16] = _mesa_texstore_rgba_uint16; 420338db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_R_UINT32] = _mesa_texstore_rgba_uint32; 420438db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RG_UINT32] = _mesa_texstore_rgba_uint32; 420538db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGB_UINT32] = _mesa_texstore_rgba_uint32; 420638db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie table[MESA_FORMAT_RGBA_UINT32] = _mesa_texstore_rgba_uint32; 420738db7ae7fa3b5c05244ebcc5c04228e6aa794262Dave Airlie 4208f449be660e70aac2aefd2ce84581e137de25520bDave Airlie table[MESA_FORMAT_ARGB2101010_UINT] = _mesa_texstore_argb2101010_uint; 4209749c9060aca85277c388377d15fd6323ba20b78eJordan Justen table[MESA_FORMAT_ABGR2101010_UINT] = _mesa_texstore_abgr2101010_uint; 42106e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie initialized = GL_TRUE; 4211485105ed182e2e997b084f047e72d5a2c3460057Brian Paul } 4212920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 42136e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie ASSERT(table[format]); 42146e1681a2c90690b05bf55c5831ab5f83cb487876Dave Airlie return table[format]; 4215485105ed182e2e997b084f047e72d5a2c3460057Brian Paul} 4216485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 4217485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 4218660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul/** 4219660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Store user data into texture memory. 4220660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Called via glTex[Sub]Image1/2/3D() 4221660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul */ 4222660ca9c5a23240abca084089a626d4a94ef0799fBrian PaulGLboolean 4223660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul_mesa_texstore(TEXSTORE_PARAMS) 4224660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul{ 4225660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul StoreTexImageFunc storeImage; 4226660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul GLboolean success; 4227660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 42281f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul storeImage = _mesa_get_texstore_func(dstFormat); 4229660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 4230660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul success = storeImage(ctx, dims, baseInternalFormat, 4231d69d287068e0a6b5e2f3c13b1f55335a9b6ce03bBrian Paul dstFormat, 42325253cf98057dad54e25b4b8c36f8cf24f559314cBrian Paul dstRowStride, dstSlices, 4233660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul srcWidth, srcHeight, srcDepth, 4234660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul srcFormat, srcType, srcAddr, srcPacking); 4235660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul return success; 4236660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul} 4237660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 4238485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 423981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul/** 424081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * Normally, we'll only _write_ texel data to a texture when we map it. 424181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * But if the user is providing depth or stencil values and the texture 424281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * image is a combined depth/stencil format, we'll actually read from 424381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * the texture buffer too (in order to insert the depth or stencil values. 424481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param userFormat the user-provided image format 424581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul * \param texFormat the destination texture format 424681430ab54f57590c99883eadf622d2ecfae19c49Brian Paul */ 424781430ab54f57590c99883eadf622d2ecfae19c49Brian Paulstatic GLbitfield 424881430ab54f57590c99883eadf622d2ecfae19c49Brian Paulget_read_write_mode(GLenum userFormat, gl_format texFormat) 42495999c5b620236fb6a996cf56759aec31f01c126bBrian Paul{ 425081430ab54f57590c99883eadf622d2ecfae19c49Brian Paul if ((userFormat == GL_STENCIL_INDEX || userFormat == GL_DEPTH_COMPONENT) 425181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul && _mesa_get_format_base_format(texFormat) == GL_DEPTH_STENCIL) 425281430ab54f57590c99883eadf622d2ecfae19c49Brian Paul return GL_MAP_READ_BIT | GL_MAP_WRITE_BIT; 425381430ab54f57590c99883eadf622d2ecfae19c49Brian Paul else 425464fdfefb9d1136c5f98f3e3b2ba716c224a4d792Brian Paul return GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT; 42555999c5b620236fb6a996cf56759aec31f01c126bBrian Paul} 42565999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 42575c818c6277247468ccf69abda00f5bc220b59644Brian Paul 4258ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul/** 42595c818c6277247468ccf69abda00f5bc220b59644Brian Paul * Helper function for storing 1D, 2D, 3D whole and subimages into texture 42605c818c6277247468ccf69abda00f5bc220b59644Brian Paul * memory. 42615c818c6277247468ccf69abda00f5bc220b59644Brian Paul * The source of the image data may be user memory or a PBO. In the later 42625c818c6277247468ccf69abda00f5bc220b59644Brian Paul * case, we'll map the PBO, copy from it, then unmap it. 42635c818c6277247468ccf69abda00f5bc220b59644Brian Paul */ 42645c818c6277247468ccf69abda00f5bc220b59644Brian Paulstatic void 42655c818c6277247468ccf69abda00f5bc220b59644Brian Paulstore_texsubimage(struct gl_context *ctx, 42665c818c6277247468ccf69abda00f5bc220b59644Brian Paul struct gl_texture_image *texImage, 42675c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 42685c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLint width, GLint height, GLint depth, 42695c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 42705c818c6277247468ccf69abda00f5bc220b59644Brian Paul const struct gl_pixelstore_attrib *packing, 42715c818c6277247468ccf69abda00f5bc220b59644Brian Paul const char *caller) 42725c818c6277247468ccf69abda00f5bc220b59644Brian Paul 42735c818c6277247468ccf69abda00f5bc220b59644Brian Paul{ 42745c818c6277247468ccf69abda00f5bc220b59644Brian Paul const GLbitfield mapMode = get_read_write_mode(format, texImage->TexFormat); 42755c818c6277247468ccf69abda00f5bc220b59644Brian Paul const GLenum target = texImage->TexObject->Target; 42765c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLboolean success = GL_FALSE; 42775c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLuint dims, slice, numSlices = 1, sliceOffset = 0; 42785c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLint srcImageStride = 0; 42795c818c6277247468ccf69abda00f5bc220b59644Brian Paul const GLubyte *src; 42805c818c6277247468ccf69abda00f5bc220b59644Brian Paul 42815c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(xoffset + width <= texImage->Width); 42825c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(yoffset + height <= texImage->Height); 42835c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(zoffset + depth <= texImage->Depth); 42845c818c6277247468ccf69abda00f5bc220b59644Brian Paul 42855c818c6277247468ccf69abda00f5bc220b59644Brian Paul switch (target) { 42865c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_1D: 42875c818c6277247468ccf69abda00f5bc220b59644Brian Paul dims = 1; 42885c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 42895c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_2D_ARRAY: 42905c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_3D: 42915c818c6277247468ccf69abda00f5bc220b59644Brian Paul dims = 3; 42925c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 42935c818c6277247468ccf69abda00f5bc220b59644Brian Paul default: 42945c818c6277247468ccf69abda00f5bc220b59644Brian Paul dims = 2; 42955c818c6277247468ccf69abda00f5bc220b59644Brian Paul } 42965c818c6277247468ccf69abda00f5bc220b59644Brian Paul 42975c818c6277247468ccf69abda00f5bc220b59644Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 42985c818c6277247468ccf69abda00f5bc220b59644Brian Paul src = (const GLubyte *) 42995c818c6277247468ccf69abda00f5bc220b59644Brian Paul _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, 43005c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type, pixels, packing, caller); 43015c818c6277247468ccf69abda00f5bc220b59644Brian Paul if (!src) 43025c818c6277247468ccf69abda00f5bc220b59644Brian Paul return; 43035c818c6277247468ccf69abda00f5bc220b59644Brian Paul 43045c818c6277247468ccf69abda00f5bc220b59644Brian Paul /* compute slice info (and do some sanity checks) */ 43055c818c6277247468ccf69abda00f5bc220b59644Brian Paul switch (target) { 43065c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_2D: 43075c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_RECTANGLE: 43085c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_CUBE_MAP: 43095c818c6277247468ccf69abda00f5bc220b59644Brian Paul /* one image slice, nothing special needs to be done */ 43105c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 43115c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_1D: 43125c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(height == 1); 43135c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(depth == 1); 43145c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(yoffset == 0); 43155c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(zoffset == 0); 43165c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 43175c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_1D_ARRAY: 43185c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(depth == 1); 43195c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(zoffset == 0); 43205c818c6277247468ccf69abda00f5bc220b59644Brian Paul numSlices = height; 43215c818c6277247468ccf69abda00f5bc220b59644Brian Paul sliceOffset = yoffset; 43225c818c6277247468ccf69abda00f5bc220b59644Brian Paul height = 1; 43235c818c6277247468ccf69abda00f5bc220b59644Brian Paul yoffset = 0; 43245c818c6277247468ccf69abda00f5bc220b59644Brian Paul srcImageStride = _mesa_image_row_stride(packing, width, format, type); 43255c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 43265c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_2D_ARRAY: 43275c818c6277247468ccf69abda00f5bc220b59644Brian Paul numSlices = depth; 43285c818c6277247468ccf69abda00f5bc220b59644Brian Paul sliceOffset = zoffset; 43295c818c6277247468ccf69abda00f5bc220b59644Brian Paul depth = 1; 43305c818c6277247468ccf69abda00f5bc220b59644Brian Paul zoffset = 0; 43315c818c6277247468ccf69abda00f5bc220b59644Brian Paul srcImageStride = _mesa_image_image_stride(packing, width, height, 43325c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type); 43335c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 43345c818c6277247468ccf69abda00f5bc220b59644Brian Paul case GL_TEXTURE_3D: 43355c818c6277247468ccf69abda00f5bc220b59644Brian Paul /* we'll store 3D images as a series of slices */ 43365c818c6277247468ccf69abda00f5bc220b59644Brian Paul numSlices = depth; 43375c818c6277247468ccf69abda00f5bc220b59644Brian Paul sliceOffset = zoffset; 43385c818c6277247468ccf69abda00f5bc220b59644Brian Paul srcImageStride = _mesa_image_image_stride(packing, width, height, 43395c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type); 43405c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 43415c818c6277247468ccf69abda00f5bc220b59644Brian Paul default: 43425c818c6277247468ccf69abda00f5bc220b59644Brian Paul _mesa_warning(ctx, "Unexpected target 0x%x in store_texsubimage()", target); 43435c818c6277247468ccf69abda00f5bc220b59644Brian Paul return; 43445c818c6277247468ccf69abda00f5bc220b59644Brian Paul } 43455c818c6277247468ccf69abda00f5bc220b59644Brian Paul 43465c818c6277247468ccf69abda00f5bc220b59644Brian Paul assert(numSlices == 1 || srcImageStride != 0); 43475c818c6277247468ccf69abda00f5bc220b59644Brian Paul 43485c818c6277247468ccf69abda00f5bc220b59644Brian Paul for (slice = 0; slice < numSlices; slice++) { 43495c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLubyte *dstMap; 43505c818c6277247468ccf69abda00f5bc220b59644Brian Paul GLint dstRowStride; 43515c818c6277247468ccf69abda00f5bc220b59644Brian Paul 43525c818c6277247468ccf69abda00f5bc220b59644Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, 43535c818c6277247468ccf69abda00f5bc220b59644Brian Paul slice + sliceOffset, 43545c818c6277247468ccf69abda00f5bc220b59644Brian Paul xoffset, yoffset, width, height, 43555c818c6277247468ccf69abda00f5bc220b59644Brian Paul mapMode, &dstMap, &dstRowStride); 43565c818c6277247468ccf69abda00f5bc220b59644Brian Paul if (dstMap) { 43575c818c6277247468ccf69abda00f5bc220b59644Brian Paul /* Note: we're only storing a 2D (or 1D) slice at a time but we need 43585c818c6277247468ccf69abda00f5bc220b59644Brian Paul * to pass the right 'dims' value so that GL_UNPACK_SKIP_IMAGES is 43595c818c6277247468ccf69abda00f5bc220b59644Brian Paul * used for 3D images. 43605c818c6277247468ccf69abda00f5bc220b59644Brian Paul */ 43615c818c6277247468ccf69abda00f5bc220b59644Brian Paul success = _mesa_texstore(ctx, dims, texImage->_BaseFormat, 43625c818c6277247468ccf69abda00f5bc220b59644Brian Paul texImage->TexFormat, 43635c818c6277247468ccf69abda00f5bc220b59644Brian Paul dstRowStride, 43645c818c6277247468ccf69abda00f5bc220b59644Brian Paul &dstMap, 43655c818c6277247468ccf69abda00f5bc220b59644Brian Paul width, height, 1, /* w, h, d */ 43665c818c6277247468ccf69abda00f5bc220b59644Brian Paul format, type, src, packing); 43675c818c6277247468ccf69abda00f5bc220b59644Brian Paul 43685c818c6277247468ccf69abda00f5bc220b59644Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, slice + sliceOffset); 43695c818c6277247468ccf69abda00f5bc220b59644Brian Paul } 43705c818c6277247468ccf69abda00f5bc220b59644Brian Paul 43715c818c6277247468ccf69abda00f5bc220b59644Brian Paul src += srcImageStride; 43725c818c6277247468ccf69abda00f5bc220b59644Brian Paul 43735c818c6277247468ccf69abda00f5bc220b59644Brian Paul if (!success) 43745c818c6277247468ccf69abda00f5bc220b59644Brian Paul break; 43755c818c6277247468ccf69abda00f5bc220b59644Brian Paul } 43765c818c6277247468ccf69abda00f5bc220b59644Brian Paul 43775c818c6277247468ccf69abda00f5bc220b59644Brian Paul if (!success) 43785c818c6277247468ccf69abda00f5bc220b59644Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller); 43795c818c6277247468ccf69abda00f5bc220b59644Brian Paul 43805c818c6277247468ccf69abda00f5bc220b59644Brian Paul _mesa_unmap_teximage_pbo(ctx, packing); 43815c818c6277247468ccf69abda00f5bc220b59644Brian Paul} 43825c818c6277247468ccf69abda00f5bc220b59644Brian Paul 43835c818c6277247468ccf69abda00f5bc220b59644Brian Paul 43845c818c6277247468ccf69abda00f5bc220b59644Brian Paul 43855c818c6277247468ccf69abda00f5bc220b59644Brian Paul/** 43868f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul * Fallback code for ctx->Driver.TexImage(). 43878f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul * Basically, allocate storage for the texture image, then copy the 43888f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul * user's image into it. 43898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 43908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 43918f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul_mesa_store_teximage(struct gl_context *ctx, 43928f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul GLuint dims, 43938f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul struct gl_texture_image *texImage, 43948f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 43958f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul const struct gl_pixelstore_attrib *packing) 43968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 43978f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul assert(dims == 1 || dims == 2 || dims == 3); 4398b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt 4399c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen if (texImage->Width == 0 || texImage->Height == 0 || texImage->Depth == 0) 4400b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt return; 4401b31104e318ec1a49447d3f301bcfe46b22d508dbEric Anholt 440278026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 4403c9a7dfcf92e6adb4b85338c2c8dbbfbaf39fbfe7Pauli Nieminen if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) { 44048f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims); 44057d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 44067d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 44078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 44085c818c6277247468ccf69abda00f5bc220b59644Brian Paul store_texsubimage(ctx, texImage, 4409c5af8891805fc4f590c1371c098cdbc704c44e00Pauli Nieminen 0, 0, 0, texImage->Width, texImage->Height, texImage->Depth, 44108f5fffe75d2f8ae7c7ee706b53379a25bc673ae4Brian Paul format, type, pixels, packing, "glTexImage"); 44118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 44128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 44138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 44148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 4415e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul * Fallback for Driver.TexSubImage(). 44168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 44178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4418e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul_mesa_store_texsubimage(struct gl_context *ctx, GLuint dims, 4419e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul struct gl_texture_image *texImage, 4420e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 4421e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul GLint width, GLint height, GLint depth, 4422e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul GLenum format, GLenum type, const void *pixels, 4423e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul const struct gl_pixelstore_attrib *packing) 44248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 44255c818c6277247468ccf69abda00f5bc220b59644Brian Paul store_texsubimage(ctx, texImage, 44265c818c6277247468ccf69abda00f5bc220b59644Brian Paul xoffset, yoffset, zoffset, width, height, depth, 4427e42d00b3f4503a0840575c8e5f4517a66c8af613Brian Paul format, type, pixels, packing, "glTexSubImage"); 44288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 44298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 44308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 4431b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul/** 4432e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul * Fallback for Driver.CompressedTexImage() 44338e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 44348e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 4435e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul_mesa_store_compressed_teximage(struct gl_context *ctx, GLuint dims, 4436e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul struct gl_texture_image *texImage, 4437e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul GLsizei imageSize, const GLvoid *data) 44388e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 4439e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul /* only 2D compressed images are supported at this time */ 4440e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul if (dims != 2) { 4441e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul _mesa_problem(ctx, "Unexpected glCompressedTexImage1D/3D call"); 4442e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul return; 4443e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul } 4444e8fdd0e0d5286f4a9c763ffde44decec51124ebcBrian Paul 4445bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt /* This is pretty simple, because unlike the general texstore path we don't 4446bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt * have to worry about the usual image unpacking or image transfer 4447bda361e0d47a670f318664abcdf0a065bef22883Eric Anholt * operations. 44488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 444989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage); 445089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Width > 0); 445189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Height > 0); 445289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Depth == 1); 445389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 445478026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul /* allocate storage for texture data */ 4455c9a7dfcf92e6adb4b85338c2c8dbbfbaf39fbfe7Pauli Nieminen if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) { 445678026b8acef9d6eea4f37d9c5435447944d1befdBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D"); 445789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 445889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 445989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 4460ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul _mesa_store_compressed_texsubimage(ctx, dims, texImage, 4461ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul 0, 0, 0, 44625606bd574e264c4beda8eb1d10b48d17e9b8b497Pauli Nieminen texImage->Width, texImage->Height, texImage->Depth, 4463ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul texImage->TexFormat, 4464ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul imageSize, data); 44658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 44668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 44678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 446889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 4469ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul * Fallback for Driver.CompressedTexSubImage() 4470e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul */ 4471e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paulvoid 4472ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul_mesa_store_compressed_texsubimage(struct gl_context *ctx, GLuint dims, 4473ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul struct gl_texture_image *texImage, 4474ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 4475ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul GLsizei width, GLsizei height, GLsizei depth, 4476ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul GLenum format, 4477ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul GLsizei imageSize, const GLvoid *data) 447889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 447981430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLint bytesPerRow, dstRowStride, srcRowStride; 448089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint i, rows; 448181430ab54f57590c99883eadf622d2ecfae19c49Brian Paul GLubyte *dstMap; 448289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul const GLubyte *src; 44831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const gl_format texFormat = texImage->TexFormat; 4484d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul GLuint bw, bh; 44855999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 4486ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul if (dims != 2) { 4487ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul _mesa_problem(ctx, "Unexpected 1D/3D compressed texsubimage call"); 4488ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul return; 4489ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul } 4490ec19bdd16c3d4070af69fd865042babe0a627595Brian Paul 4491d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul _mesa_get_format_block_size(texFormat, &bw, &bh); 44925999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 4493b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 4494e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data, 4495e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul &ctx->Unpack, 4496e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul "glCompressedTexSubImage2D"); 44977a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!data) 44987a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 44997a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 45002594168e9f3cdc4ac53c925486491167837cda30Brian Paul srcRowStride = _mesa_format_row_stride(texFormat, width); 450189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul src = (const GLubyte *) data; 450289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 450306913497d6b17f454bf4c5b8601d391980eb8265Brian Paul /* Map dest texture buffer */ 450481430ab54f57590c99883eadf622d2ecfae19c49Brian Paul ctx->Driver.MapTextureImage(ctx, texImage, 0, 450581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul xoffset, yoffset, width, height, 450664fdfefb9d1136c5f98f3e3b2ba716c224a4d792Brian Paul GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT, 450781430ab54f57590c99883eadf622d2ecfae19c49Brian Paul &dstMap, &dstRowStride); 450889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 45091ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul if (dstMap) { 45101ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul bytesPerRow = srcRowStride; /* bytes per row of blocks */ 45111e0b6a90d78ed78eb9e22c65abd5af314142a844Eric Anholt rows = (height + bh - 1) / bh; /* rows in blocks */ 451289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 45131ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul /* copy rows of blocks */ 45141ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul for (i = 0; i < rows; i++) { 45151ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul memcpy(dstMap, src, bytesPerRow); 45161ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul dstMap += dstRowStride; 45171ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul src += srcRowStride; 45181ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 45198f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul 45201ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 45211ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 45221ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul else { 45231ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D"); 45241ad88fb42dcd69c678ca849151a9aae77d946584Brian Paul } 452581430ab54f57590c99883eadf622d2ecfae19c49Brian Paul 452671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack); 452789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 4528