texstore.c revision f920d496e1b5b01a3ba9bcd7dcff5c19bc109da2
18e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 28e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Mesa 3-D graphics library 3a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul * Version: 7.5 48e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * 5501338d70e96e0388fd5198625d856c4ec07745fBrian Paul * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6a4bec69e7271eda0137874973aa8c7d44175fedfBrian Paul * Copyright (c) 2008-2009 VMware, Inc. 78e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * 88e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Permission is hereby granted, free of charge, to any person obtaining a 98e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * copy of this software and associated documentation files (the "Software"), 108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * to deal in the Software without restriction, including without limitation 118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * the rights to use, copy, modify, merge, publish, distribute, sublicense, 128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * and/or sell copies of the Software, and to permit persons to whom the 138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Software is furnished to do so, subject to the following conditions: 148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * 158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * The above copyright notice and this permission notice shall be included 168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * in all copies or substantial portions of the Software. 178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * 188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 238e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Authors: 288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Brian Paul 298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 31248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 3289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * The GL texture image functions in teximage.c basically just do 3389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * error checking and data structure allocation. They in turn call 3489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * device driver functions which actually copy/convert/store the user's 3589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * texture image data. 3689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * 3789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * However, most device drivers will be able to use the fallback functions 3889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * in this file. That is, most drivers will have the following bit of 3989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * code: 4089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * ctx->Driver.TexImage1D = _mesa_store_teximage1d; 4189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * ctx->Driver.TexImage2D = _mesa_store_teximage2d; 4289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * ctx->Driver.TexImage3D = _mesa_store_teximage3d; 4389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * etc... 4489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * 4589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Texture image processing is actually kind of complicated. We have to do: 4689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Format/type conversions 4789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * pixel unpacking 4889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * pixel transfer (scale, bais, lookup, convolution!, etc) 4989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * 5089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * These functions can handle most everything, including processing full 5189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * images and sub-images. 5289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 5389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 5489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 553c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "glheader.h" 567a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul#include "bufferobj.h" 57e75d2424e53d6023f4414e40694cd467e5392b96Brian Paul#include "colormac.h" 588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "context.h" 598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "convolve.h" 608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "image.h" 618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "macros.h" 6224edd9015951dd41898902b6c3973fe605e5871aBrian Paul#include "mipmap.h" 633c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 6489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul#include "texcompress.h" 65da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_fxt1.h" 66da5722bea6e2f613933d3e3da214da8cd0047d2eBrian Paul#include "texcompress_s3tc.h" 678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "teximage.h" 688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul#include "texstore.h" 692e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell#include "enums.h" 708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 71248200737398a7d6403a23930a6c9d93db06b942Brian Paul 72fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum { 73fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell ZERO = 4, 74fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell ONE = 5 75fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 7671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 77248200737398a7d6403a23930a6c9d93db06b942Brian Paul 78248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 79e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul * Texture image storage function. 80e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul */ 81e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paultypedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS); 82e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul 83e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul 84e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paul/** 85248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Return GL_TRUE if the given image format is one that be converted 86248200737398a7d6403a23930a6c9d93db06b942Brian Paul * to another format by swizzling. 87248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 88248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic GLboolean 89248200737398a7d6403a23930a6c9d93db06b942Brian Paulcan_swizzle(GLenum logicalBaseFormat) 9071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 9171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell switch (logicalBaseFormat) { 9271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_RGBA: 9371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_RGB: 9471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_LUMINANCE_ALPHA: 9571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_INTENSITY: 9671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_ALPHA: 9771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case GL_LUMINANCE: 983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_RED: 993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_GREEN: 1003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BLUE: 1013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGR: 1023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGRA: 1033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_ABGR_EXT: 10471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell return GL_TRUE; 10571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell default: 10671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell return GL_FALSE; 10771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 10871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell} 10971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 1103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 112fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwellenum { 113fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_LUMINANCE = 0, 114fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_ALPHA, 115fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_INTENSITY, 116fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_LUMINANCE_ALPHA, 117fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_RGB, 118fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell IDX_RGBA, 1193aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RED, 1203aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_GREEN, 1213aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BLUE, 1223aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGR, 1233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGRA, 1243aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ABGR, 125fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell MAX_IDX 126fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 127fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 1283aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP1(x) MAP4(x, ZERO, ZERO, ZERO) 1293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP2(x,y) MAP4(x, y, ZERO, ZERO) 1303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP3(x,y,z) MAP4(x, y, z, ZERO) 1313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE } 132fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 133fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 1342e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwellstatic const struct { 1353aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte format_idx; 1363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte to_rgba[6]; 1373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte from_rgba[6]; 1383aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell} mappings[MAX_IDX] = 139fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{ 140fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_LUMINANCE, 1423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,0,0,ONE), 1433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0) 144fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 145fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 146fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ALPHA, 1483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, ZERO, ZERO, 0), 1493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(3) 150fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 151fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 152fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_INTENSITY, 1543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0, 0, 0, 0), 1553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0), 156fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 157fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 158fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1593aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_LUMINANCE_ALPHA, 1603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,0,0,1), 1613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP2(0,3) 162fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 163fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 164fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RGB, 1663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,ONE), 1673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP3(0,1,2) 168fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell }, 169fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 170fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell { 1713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RGBA, 1723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,3), 1733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0,1,2,3), 1743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_RED, 1793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(0, ZERO, ZERO, ONE), 1803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(0), 1813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_GREEN, 1853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, 0, ZERO, ONE), 1863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(1), 1873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BLUE, 1913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(ZERO, ZERO, 0, ONE), 1923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP1(2), 1933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 1943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 1953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 1963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGR, 1973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,ONE), 1983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP3(2,1,0) 1993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 2023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_BGRA, 2033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,3), 2043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(2,1,0,3) 2053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 2063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell { 2083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell IDX_ABGR, 2093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(3,2,1,0), 2103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell MAP4(3,2,1,0) 2113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell }, 212fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell}; 213fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 214fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 215fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 216248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 217248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Convert a GL image format enum to an IDX_* value (see above). 218248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 219248200737398a7d6403a23930a6c9d93db06b942Brian Paulstatic int 220248200737398a7d6403a23930a6c9d93db06b942Brian Paulget_map_idx(GLenum value) 221fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell{ 222fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell switch (value) { 223fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_LUMINANCE: return IDX_LUMINANCE; 224fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_ALPHA: return IDX_ALPHA; 225fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_INTENSITY: return IDX_INTENSITY; 226fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA; 227fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_RGB: return IDX_RGB; 228fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell case GL_RGBA: return IDX_RGBA; 2293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_RED: return IDX_RED; 2303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_GREEN: return IDX_GREEN; 2313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BLUE: return IDX_BLUE; 2323aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGR: return IDX_BGR; 2333aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_BGRA: return IDX_BGRA; 2343aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case GL_ABGR_EXT: return IDX_ABGR; 235fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell default: 236fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell _mesa_problem(NULL, "Unexpected inFormat"); 237fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell return 0; 238fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell } 239fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell} 240fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell 241f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 242f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 243f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * When promoting texture formats (see below) we need to compute the 244f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * mapping of dest components back to source components. 245f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * This function does that. 246fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param inFormat the incoming format of the texture 247fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \param outFormat the final texture format 248fce0d13b4fff04de50fd91a8f4dfdc248b6262e0Keith Whitwell * \return map[6] a full 6-component map 249f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 2503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellstatic void 2513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwellcompute_component_mapping(GLenum inFormat, GLenum outFormat, 2523aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte *map) 253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 254248200737398a7d6403a23930a6c9d93db06b942Brian Paul const int inFmt = get_map_idx(inFormat); 255248200737398a7d6403a23930a6c9d93db06b942Brian Paul const int outFmt = get_map_idx(outFormat); 256248200737398a7d6403a23930a6c9d93db06b942Brian Paul const GLubyte *in2rgba = mappings[inFmt].to_rgba; 257248200737398a7d6403a23930a6c9d93db06b942Brian Paul const GLubyte *rgba2out = mappings[outFmt].from_rgba; 2583aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell int i; 2592e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell 2603aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell for (i = 0; i < 4; i++) 2613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[i] = in2rgba[rgba2out[i]]; 2623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[ZERO] = ZERO; 2643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[ONE] = ONE; 2653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 2663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell/* 2673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n", 2683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell inFormat, _mesa_lookup_enum_by_nr(inFormat), 2693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell outFormat, _mesa_lookup_enum_by_nr(outFormat), 2703aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[0], 2713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[1], 2723aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[2], 2733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[3], 2743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[4], 2753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell map[5]); 2763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell*/ 277f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 278f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 279f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 280f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 281f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLfloat components. 282f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations. 283f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters. 284f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format 285f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * but the graphics hardware doesn't support luminance textures. So, might 286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead. 287f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do. 288f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 289f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx the rendering context 290f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims image dimensions: 1, 2 or 3 291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat basic texture derived from the user's 292f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * internal texture format value 293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat the actual basic format of the texture 294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth source image width 295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight source image height 296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth source image depth 297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat source image format 298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType source image type 299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr source image address 300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking source image pixel packing 301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLfloat. 302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulstatic GLfloat * 304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paulmake_temp_float_image(GLcontext *ctx, GLuint dims, 305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLenum logicalBaseFormat, 306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLenum textureBaseFormat, 307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLenum srcFormat, GLenum srcType, 309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLvoid *srcAddr, 310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const struct gl_pixelstore_attrib *srcPacking) 311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLuint transferOps = ctx->_ImageTransferState; 313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *tempImage; 314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(dims >= 1 && dims <= 3); 316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 317f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(logicalBaseFormat == GL_RGBA || 318f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_RGB || 319f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE_ALPHA || 320f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE || 321f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_ALPHA || 322f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_INTENSITY || 323f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_COLOR_INDEX || 324f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_DEPTH_COMPONENT); 325f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 326f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(textureBaseFormat == GL_RGBA || 327f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_RGB || 328f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA || 329f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE || 330f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_ALPHA || 331f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_INTENSITY || 332f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_COLOR_INDEX || 333f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_DEPTH_COMPONENT); 334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* conventional color image */ 336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if ((dims == 1 && ctx->Pixel.Convolution1DEnabled) || 338f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (dims >= 2 && ctx->Pixel.Convolution2DEnabled) || 339f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (dims >= 2 && ctx->Pixel.Separable2DEnabled)) { 340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* need image convolution */ 341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLuint preConvTransferOps 342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul = (transferOps & IMAGE_PRE_CONVOLUTION_BITS) | IMAGE_CLAMP_BIT; 343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLuint postConvTransferOps 344f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul = (transferOps & IMAGE_POST_CONVOLUTION_BITS) | IMAGE_CLAMP_BIT; 345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 3469927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu GLint convWidth = srcWidth, convHeight = srcHeight; 347f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *convImage; 348f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 349f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* pre-convolution image buffer (3D) */ 350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul tempImage = (GLfloat *) _mesa_malloc(srcWidth * srcHeight * srcDepth 351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 4 * sizeof(GLfloat)); 352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 355f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* post-convolution image buffer (2D) */ 356f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul convImage = (GLfloat *) _mesa_malloc(srcWidth * srcHeight 357f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 4 * sizeof(GLfloat)); 358f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!convImage) { 359f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_free(tempImage); 360f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 361f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 362f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 363f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* loop over 3D image slices */ 364f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 365f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *dst = tempImage + img * (srcWidth * srcHeight * 4); 366f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 367f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* unpack and do transfer ops up to convolution */ 368f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 36960909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 370f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, 371f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, img, row, 0); 372f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_unpack_color_span_float(ctx, srcWidth, GL_RGBA, dst, 373f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, src, 374f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking, 375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul preConvTransferOps); 376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst += srcWidth * 4; 377f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 378f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3796f1abb9c215583d11980294f7469da41ec14b7daBrian Paul /* size after optional convolution */ 3806f1abb9c215583d11980294f7469da41ec14b7daBrian Paul convWidth = srcWidth; 3816f1abb9c215583d11980294f7469da41ec14b7daBrian Paul convHeight = srcHeight; 3826f1abb9c215583d11980294f7469da41ec14b7daBrian Paul 38340d1a40f294f1ed2dacfad6f5498322fc08cc2d1Brian Paul#if FEATURE_convolve 384f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* do convolution */ 385f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul { 386f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *src = tempImage + img * (srcWidth * srcHeight * 4); 387f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (dims == 1) { 388f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(ctx->Pixel.Convolution1DEnabled); 389f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_convolve_1d_image(ctx, &convWidth, src, convImage); 390f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 391f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 392f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (ctx->Pixel.Convolution2DEnabled) { 393f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_convolve_2d_image(ctx, &convWidth, &convHeight, 394f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src, convImage); 395f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 396f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 397f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(ctx->Pixel.Separable2DEnabled); 398f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_convolve_sep_image(ctx, &convWidth, &convHeight, 399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src, convImage); 400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 402f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 40340d1a40f294f1ed2dacfad6f5498322fc08cc2d1Brian Paul#endif 404f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* do post-convolution transfer and pack into tempImage */ 405f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul { 4062b012578ee519561365640e23272b71898378c45Brian Paul const GLint logComponents 4072b012578ee519561365640e23272b71898378c45Brian Paul = _mesa_components_in_format(logicalBaseFormat); 408f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLfloat *src = convImage; 409f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *dst = tempImage + img * (convWidth * convHeight * 4); 410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < convHeight; row++) { 411f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_pack_rgba_span_float(ctx, convWidth, 412176501dfff14b5bec78af2b3487207d42c26d37aBrian Paul (GLfloat (*)[4]) src, 413f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat, GL_FLOAT, 414f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst, &ctx->DefaultPacking, 415c7eb423c49ef3e0e071deaab04dad55254f2fa30Brian Paul postConvTransferOps); 416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += convWidth * 4; 4172b012578ee519561365640e23272b71898378c45Brian Paul dst += convWidth * logComponents; 418f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 419f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } /* loop over 3D image slices */ 421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_free(convImage); 423f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 424f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* might need these below */ 425f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth = convWidth; 426f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcHeight = convHeight; 427f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 428f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 429f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* no convolution */ 430f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint components = _mesa_components_in_format(logicalBaseFormat); 4318c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcStride = 4328c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 433f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *dst; 434f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 435f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 436f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul tempImage = (GLfloat *) _mesa_malloc(srcWidth * srcHeight * srcDepth 437f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * components * sizeof(GLfloat)); 438f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 439f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 440f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 441f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst = tempImage; 442f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 443f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLubyte *src 44460909388ab136d849d99eab49e782a53772a618fBrian Paul = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 445f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, 446f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, 447f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul img, 0, 0); 448f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 449f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat, 450f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst, srcFormat, srcType, src, 451f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking, transferOps); 452f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst += srcWidth * components; 453f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcStride; 454f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 455f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 456f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 457f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 458f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (logicalBaseFormat != textureBaseFormat) { 459f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* more work */ 460f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint texComponents = _mesa_components_in_format(textureBaseFormat); 461f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 462f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *newImage; 463f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i, n; 4643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[6]; 465f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 46613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 46713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 46813ad04719e292a2bee7e1b3155da74a97921c035Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA); 469f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 470f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* The actual texture format should have at least as many components 471f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * as the logical texture format. 472f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 473f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(texComponents >= logComponents); 474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 475f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage = (GLfloat *) _mesa_malloc(srcWidth * srcHeight * srcDepth 476f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * texComponents * sizeof(GLfloat)); 477f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!newImage) { 478f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_free(tempImage); 479f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 480f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 481f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 4823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 483f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 484f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul n = srcWidth * srcHeight * srcDepth; 485f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < n; i++) { 486f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint k; 487f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (k = 0; k < texComponents; k++) { 488f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint j = map[k]; 489f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (j == ZERO) 490f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 0.0F; 491f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (j == ONE) 492f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 1.0F; 493f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else 494f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 495f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 496f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 497f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 498f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_free(tempImage); 499f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul tempImage = newImage; 500f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 501f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 502f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return tempImage; 503f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 504f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 505f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 506f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 507f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Make a temporary (color) texture image with GLchan components. 508f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Apply all needed pixel unpacking and pixel transfer operations. 509f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Note that there are both logicalBaseFormat and textureBaseFormat parameters. 510f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Suppose the user specifies GL_LUMINANCE as the internal texture format 511f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * but the graphics hardware doesn't support luminance textures. So, might 512f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * use an RGB hardware format instead. 513f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * If logicalBaseFormat != textureBaseFormat we have some extra work to do. 514f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * 515f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param ctx the rendering context 516f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param dims image dimensions: 1, 2 or 3 517f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param logicalBaseFormat basic texture derived from the user's 518f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * internal texture format value 519f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param textureBaseFormat the actual basic format of the texture 520f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcWidth source image width 521f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcHeight source image height 522f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcDepth source image depth 523f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcFormat source image format 524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcType source image type 525f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcAddr source image address 526f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \param srcPacking source image pixel packing 527f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * \return resulting image with format = textureBaseFormat and type = GLchan. 528f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 5298f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian PaulGLchan * 5308f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul_mesa_make_temp_chan_image(GLcontext *ctx, GLuint dims, 5318f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul GLenum logicalBaseFormat, 5328f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul GLenum textureBaseFormat, 5338f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 5348f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul GLenum srcFormat, GLenum srcType, 5358f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLvoid *srcAddr, 5368f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const struct gl_pixelstore_attrib *srcPacking) 537f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 538f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLuint transferOps = ctx->_ImageTransferState; 539f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint components = _mesa_components_in_format(logicalBaseFormat); 540f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLboolean freeSrcImage = GL_FALSE; 541f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 542f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLchan *tempImage, *dst; 543f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 544f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(dims >= 1 && dims <= 3); 545f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 546f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(logicalBaseFormat == GL_RGBA || 547f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_RGB || 548f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE_ALPHA || 549f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_LUMINANCE || 550f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_ALPHA || 551f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat == GL_INTENSITY); 552f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 553f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(textureBaseFormat == GL_RGBA || 554f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_RGB || 555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA || 556f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_LUMINANCE || 557f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_ALPHA || 558f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul textureBaseFormat == GL_INTENSITY); 559f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 56040d1a40f294f1ed2dacfad6f5498322fc08cc2d1Brian Paul#if FEATURE_convolve 561f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if ((dims == 1 && ctx->Pixel.Convolution1DEnabled) || 562f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (dims >= 2 && ctx->Pixel.Convolution2DEnabled) || 563f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (dims >= 2 && ctx->Pixel.Separable2DEnabled)) { 564f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* get convolved image */ 565f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLfloat *convImage = make_temp_float_image(ctx, dims, 566f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat, 567f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul logicalBaseFormat, 568f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 569f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, 570f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 571f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!convImage) 572f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 573f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* the convolved image is our new source image */ 574f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr = convImage; 575f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat = logicalBaseFormat; 576f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType = GL_FLOAT; 577f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking = &ctx->DefaultPacking; 578f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 579f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul transferOps = 0; 580f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul freeSrcImage = GL_TRUE; 581f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 58240d1a40f294f1ed2dacfad6f5498322fc08cc2d1Brian Paul#endif 583f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 584f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* unpack and transfer the source image */ 585f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul tempImage = (GLchan *) _mesa_malloc(srcWidth * srcHeight * srcDepth 586f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * components * sizeof(GLchan)); 58796128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee if (!tempImage) { 58896128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee if (freeSrcImage) { 58996128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee _mesa_free((void *) srcAddr); 59096128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee } 591f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 59296128fdf2f959e2b59eca8f234dc6f3adf7a553fVinson Lee } 593f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 594f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst = tempImage; 595f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 5968c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcStride = 5978c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 5988c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLubyte *src = 5998c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 6008c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcWidth, srcHeight, 6018c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcFormat, srcType, 6028c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul img, 0, 0); 603f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 6049c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul _mesa_unpack_color_span_chan(ctx, srcWidth, logicalBaseFormat, dst, 6059c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul srcFormat, srcType, src, srcPacking, 6069c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul transferOps); 607f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dst += srcWidth * components; 608f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcStride; 609f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 610f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 611f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 612f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* If we made a temporary image for convolution, free it here */ 613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (freeSrcImage) { 614f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_free((void *) srcAddr); 615f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 616f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (logicalBaseFormat != textureBaseFormat) { 618f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* one more conversion step */ 619f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint texComponents = _mesa_components_in_format(textureBaseFormat); 620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 621f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLchan *newImage; 622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i, n; 6233aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[6]; 624f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 62513ad04719e292a2bee7e1b3155da74a97921c035Brian Paul /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 62613ad04719e292a2bee7e1b3155da74a97921c035Brian Paul ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 62713ad04719e292a2bee7e1b3155da74a97921c035Brian Paul textureBaseFormat == GL_LUMINANCE_ALPHA); 628f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 629f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* The actual texture format should have at least as many components 630f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * as the logical texture format. 631f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 632f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(texComponents >= logComponents); 633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 634f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage = (GLchan *) _mesa_malloc(srcWidth * srcHeight * srcDepth 6352dbffb30f05fcf67658c64b8101e9efaf07ca388Brian Paul * texComponents * sizeof(GLchan)); 636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!newImage) { 637f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_free(tempImage); 638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return NULL; 639f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 640f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 6413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 642f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 643f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul n = srcWidth * srcHeight * srcDepth; 644f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < n; i++) { 645f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint k; 646f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (k = 0; k < texComponents; k++) { 647f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint j = map[k]; 648f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (j == ZERO) 649f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = 0; 650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (j == ONE) 651f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = CHAN_MAX; 652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else 653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 654f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 655f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_free(tempImage); 658f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul tempImage = newImage; 659f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 661f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return tempImage; 662f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 663f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 664f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 665c039af165d5919008c6df599795951f85dea164dBrian Paul/** 666c039af165d5919008c6df599795951f85dea164dBrian Paul * Copy GLubyte pixels from <src> to <dst> with swizzling. 667c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dst destination pixels 668c039af165d5919008c6df599795951f85dea164dBrian Paul * \param dstComponents number of color components in destination pixels 669c039af165d5919008c6df599795951f85dea164dBrian Paul * \param src source pixels 670c039af165d5919008c6df599795951f85dea164dBrian Paul * \param srcComponents number of color components in source pixels 671248200737398a7d6403a23930a6c9d93db06b942Brian Paul * \param map the swizzle mapping. map[X] says where to find the X component 672248200737398a7d6403a23930a6c9d93db06b942Brian Paul * in the source image's pixels. For example, if the source image 673248200737398a7d6403a23930a6c9d93db06b942Brian Paul * is GL_BGRA and X = red, map[0] yields 2. 674c039af165d5919008c6df599795951f85dea164dBrian Paul * \param count number of pixels to copy/swizzle. 675c039af165d5919008c6df599795951f85dea164dBrian Paul */ 676c039af165d5919008c6df599795951f85dea164dBrian Paulstatic void 677c039af165d5919008c6df599795951f85dea164dBrian Paulswizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src, 678c039af165d5919008c6df599795951f85dea164dBrian Paul GLuint srcComponents, const GLubyte *map, GLuint count) 67971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 680501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#define SWZ_CPY(dst, src, count, dstComps, srcComps) \ 681501338d70e96e0388fd5198625d856c4ec07745fBrian Paul do { \ 682501338d70e96e0388fd5198625d856c4ec07745fBrian Paul GLuint i; \ 683501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (i = 0; i < count; i++) { \ 684501338d70e96e0388fd5198625d856c4ec07745fBrian Paul GLuint j; \ 685501338d70e96e0388fd5198625d856c4ec07745fBrian Paul if (srcComps == 4) { \ 686501338d70e96e0388fd5198625d856c4ec07745fBrian Paul COPY_4UBV(tmp, src); \ 687501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 688501338d70e96e0388fd5198625d856c4ec07745fBrian Paul else { \ 689501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (j = 0; j < srcComps; j++) { \ 690501338d70e96e0388fd5198625d856c4ec07745fBrian Paul tmp[j] = src[j]; \ 691501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 692501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 693501338d70e96e0388fd5198625d856c4ec07745fBrian Paul src += srcComps; \ 694501338d70e96e0388fd5198625d856c4ec07745fBrian Paul for (j = 0; j < dstComps; j++) { \ 695501338d70e96e0388fd5198625d856c4ec07745fBrian Paul dst[j] = tmp[map[j]]; \ 696501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 697501338d70e96e0388fd5198625d856c4ec07745fBrian Paul dst += dstComps; \ 698501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } \ 699501338d70e96e0388fd5198625d856c4ec07745fBrian Paul } while (0) 700501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 701248200737398a7d6403a23930a6c9d93db06b942Brian Paul GLubyte tmp[6]; 70271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 70371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell tmp[ZERO] = 0x0; 70471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell tmp[ONE] = 0xff; 70571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 706501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ASSERT(srcComponents <= 4); 707501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ASSERT(dstComponents <= 4); 708501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 70971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell switch (dstComponents) { 71071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 4: 711501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 712501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 713501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 4); 714501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 715501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 716501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 3); 717501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 718501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 719501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 2); 720501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 721501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 722501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 4, 1); 723501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 724501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 725501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 72671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 72771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 72871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 3: 729501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 730501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 731501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 4); 732501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 733501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 734501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 3); 735501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 736501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 737501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 2); 738501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 739501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 740501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 3, 1); 741501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 742501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 743501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 74471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 74571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 74671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell case 2: 747501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 748501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 749501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 4); 750501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 751501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 752501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 3); 753501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 754501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 755501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 2); 756501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 757501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 758501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 2, 1); 759501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 760501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 761501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 76271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 76371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell break; 7643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell case 1: 765501338d70e96e0388fd5198625d856c4ec07745fBrian Paul switch (srcComponents) { 766501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 4: 767501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 4); 768501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 769501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 3: 770501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 3); 771501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 772501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 2: 773501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 2); 774501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 775501338d70e96e0388fd5198625d856c4ec07745fBrian Paul case 1: 776501338d70e96e0388fd5198625d856c4ec07745fBrian Paul SWZ_CPY(dst, src, count, 1, 1); 777501338d70e96e0388fd5198625d856c4ec07745fBrian Paul break; 778501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 779501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 7803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 7813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell break; 782501338d70e96e0388fd5198625d856c4ec07745fBrian Paul default: 783501338d70e96e0388fd5198625d856c4ec07745fBrian Paul ; 78471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 785501338d70e96e0388fd5198625d856c4ec07745fBrian Paul#undef SWZ_CPY 78671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell} 78771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 78846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 789501338d70e96e0388fd5198625d856c4ec07745fBrian Paul 790bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE }; 791bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellstatic const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE }; 79246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 793bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell/* Deal with the _REV input types: 794bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell */ 79546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte * 796bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwelltype_mapping( GLenum srcType ) 79746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{ 79846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell switch (srcType) { 799c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger case GL_BYTE: 80046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_BYTE: 80146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_identity; 802bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8: 803df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer return _mesa_little_endian() ? map_3210 : map_identity; 804bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8_REV: 805df8632ebd87219c809810d993f56fef1e6853a25Michel Dänzer return _mesa_little_endian() ? map_identity : map_3210; 80646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell default: 80746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return NULL; 80846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 80946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell} 81046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 811bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell/* Mapping required if input type is 81246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell */ 81346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwellstatic const GLubyte * 814bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwellbyteswap_mapping( GLboolean swapBytes, 815bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell GLenum srcType ) 81646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell{ 817bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell if (!swapBytes) 818bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell return map_identity; 819bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell 82046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell switch (srcType) { 821c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger case GL_BYTE: 82246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_BYTE: 82346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_identity; 82446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8: 82546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell case GL_UNSIGNED_INT_8_8_8_8_REV: 82646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return map_3210; 82746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell default: 82846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell return NULL; 82946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 83046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell} 83146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 83246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 83346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 834c039af165d5919008c6df599795951f85dea164dBrian Paul/** 835c039af165d5919008c6df599795951f85dea164dBrian Paul * Transfer a GLubyte texture image with component swizzling. 836c039af165d5919008c6df599795951f85dea164dBrian Paul */ 83771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellstatic void 83871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell_mesa_swizzle_ubyte_image(GLcontext *ctx, 83971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLuint dimensions, 84071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLenum srcFormat, 84146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell GLenum srcType, 84246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 8430c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell GLenum baseInternalFormat, 8440c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell 84546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell const GLubyte *rgba2dst, 8460c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell GLuint dstComponents, 84771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 84871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLvoid *dstAddr, 84971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint dstXoffset, GLint dstYoffset, GLint dstZoffset, 850b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint dstRowStride, 851b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLuint *dstImageOffsets, 85271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 85371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint srcWidth, GLint srcHeight, GLint srcDepth, 85471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const GLvoid *srcAddr, 85571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const struct gl_pixelstore_attrib *srcPacking ) 85671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell{ 85771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint srcComponents = _mesa_components_in_format(srcFormat); 858bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell const GLubyte *srctype2ubyte, *swap; 8593aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte map[4], src2base[6], base2rgba[6]; 86071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint i; 861c039af165d5919008c6df599795951f85dea164dBrian Paul const GLint srcRowStride = 862c039af165d5919008c6df599795951f85dea164dBrian Paul _mesa_image_row_stride(srcPacking, srcWidth, 863c039af165d5919008c6df599795951f85dea164dBrian Paul srcFormat, GL_UNSIGNED_BYTE); 864c039af165d5919008c6df599795951f85dea164dBrian Paul const GLint srcImageStride 865c039af165d5919008c6df599795951f85dea164dBrian Paul = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat, 866c039af165d5919008c6df599795951f85dea164dBrian Paul GL_UNSIGNED_BYTE); 867c039af165d5919008c6df599795951f85dea164dBrian Paul const GLubyte *srcImage 868c039af165d5919008c6df599795951f85dea164dBrian Paul = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr, 869c039af165d5919008c6df599795951f85dea164dBrian Paul srcWidth, srcHeight, srcFormat, 870c039af165d5919008c6df599795951f85dea164dBrian Paul GL_UNSIGNED_BYTE, 0, 0, 0); 87171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 872edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul (void) ctx; 873edc16a5f7a89584490be0824a1d96e2f3426998bBrian Paul 8740c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell /* Translate from src->baseInternal->GL_RGBA->dst. This will 8750c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell * correctly deal with RGBA->RGB->RGBA conversions where the final 8760c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell * A value must be 0xff regardless of the incoming alpha values. 8770c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell */ 8783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(srcFormat, baseInternalFormat, src2base); 8793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba); 880bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell swap = byteswap_mapping(srcPacking->SwapBytes, srcType); 881bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell srctype2ubyte = type_mapping(srcType); 88246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 88371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 88471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (i = 0; i < 4; i++) 885bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]]; 88671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 8872e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell/* _mesa_printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]); */ 8882e5c686c2b6f356895f33b2815e41386946ab55aKeith Whitwell 889b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul if (srcComponents == dstComponents && 890b623fa9e2d6f97f9febc978c158d790b26e175a7Brian Paul srcRowStride == dstRowStride && 8919c09259b8bef8f120cc6f4bb1a44f0eae37d71b3Michel Dänzer srcRowStride == srcWidth * srcComponents && 892b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dimensions < 3) { 893b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* 1 and 2D images only */ 894b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstImage = (GLubyte *) dstAddr 895b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 896b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstXoffset * dstComponents; 89771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map, 898b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcWidth * srcHeight); 89971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 90071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else { 90171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLint img, row; 90271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (img = 0; img < srcDepth; img++) { 90371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const GLubyte *srcRow = srcImage; 904b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 905b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstImageOffsets[dstZoffset + img] * dstComponents 906b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 907b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstXoffset * dstComponents; 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 92517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwellmemcpy_texture(GLcontext *ctx, 92617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell GLuint dimensions, 9271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format dstFormat, 928f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLvoid *dstAddr, 929f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint dstXoffset, GLint dstYoffset, GLint dstZoffset, 930b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint dstRowStride, 931b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLuint *dstImageOffsets, 932f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint srcWidth, GLint srcHeight, GLint srcDepth, 933f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLenum srcFormat, GLenum srcType, 934f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLvoid *srcAddr, 935f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const struct gl_pixelstore_attrib *srcPacking) 936f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 937f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, 938f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType); 939f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint srcImageStride = _mesa_image_image_stride(srcPacking, 940f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcFormat, srcType); 94160909388ab136d849d99eab49e782a53772a618fBrian Paul const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions, 94260909388ab136d849d99eab49e782a53772a618fBrian Paul srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); 9431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 94422108bb571808542b89677752d62d3901698265fBrian Paul const GLint bytesPerRow = srcWidth * texelBytes; 945b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul 946b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul#if 0 947b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* XXX update/re-enable for dstImageOffsets array */ 948f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint bytesPerImage = srcHeight * bytesPerRow; 949f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLint bytesPerTexture = srcDepth * bytesPerImage; 950f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLubyte *dstImage = (GLubyte *) dstAddr 951f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul + dstZoffset * dstImageStride 952f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul + dstYoffset * dstRowStride 95322108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 954f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 955f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (dstRowStride == srcRowStride && 956f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRowStride == bytesPerRow && 957f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ((dstImageStride == srcImageStride && 958f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstImageStride == bytesPerImage) || 959f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcDepth == 1))) { 960f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* one big memcpy */ 96117bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell ctx->Driver.TextureMemCpy(dstImage, srcImage, bytesPerTexture); 962f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 963b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul else 964b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul { 965f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 966f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 967f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLubyte *srcRow = srcImage; 968f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLubyte *dstRow = dstImage; 969f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 97017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow); 971f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 972f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcRow += srcRowStride; 973f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 974f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcImage += srcImageStride; 975f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstImage += dstImageStride; 976f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 977f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 978b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul#endif 979b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul 980b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row; 981b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul for (img = 0; img < srcDepth; img++) { 982b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLubyte *srcRow = srcImage; 983b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 98422108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 985b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 98622108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 987b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul for (row = 0; row < srcHeight; row++) { 988b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul ctx->Driver.TextureMemCpy(dstRow, srcRow, bytesPerRow); 989b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 990b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcRow += srcRowStride; 991b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul } 992b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcImage += srcImageStride; 993b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul } 994f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 995f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 996f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 997f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 998f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 999a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul * Store a 32-bit integer depth component texture image. 1000f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 100149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1002b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z32(TEXSTORE_PARAMS) 1003f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 100425cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian const GLuint depthScale = 0xffffffff; 10051f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 1006a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 10071f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_Z32); 100822108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == sizeof(GLuint)); 1009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1010966e199e409a1b52eef88e48997442250997f45eBrian Paul if (ctx->Pixel.DepthScale == 1.0f && 1011966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 1012f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1013a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_DEPTH_COMPONENT && 1014a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_DEPTH_COMPONENT && 1015a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul srcType == GL_UNSIGNED_INT) { 1016f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 101717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 101860909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1019b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1020b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1021f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1022f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1023f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1024f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1025f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1026f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 1027f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1028b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 102922108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1030b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 103122108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1032f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 103360909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 1034f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 10351ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 1036a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul GL_UNSIGNED_INT, (GLuint *) dstRow, 1037a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul depthScale, srcType, src, srcPacking); 1038f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1039f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1040f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1041f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1042f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1043f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1044f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1045f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1046f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1047e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul * Store a 24-bit integer depth component texture image. 1048f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 1049e4c700dbbf2a802f32bf62256c801105998c3729Brian Paulstatic GLboolean 1050e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul_mesa_texstore_x8_z24(TEXSTORE_PARAMS) 1051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1052e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul const GLuint depthScale = 0xffffff; 1053e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul const GLuint texelBytes = 4; 1054e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul 1055a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 1056e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul ASSERT(dstFormat == MESA_FORMAT_X8_Z24); 1057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1058e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul { 1059f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1060f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 1061f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1062b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 1063e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1064b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 1065e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul + dstXoffset * texelBytes; 1066f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 106760909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 1068f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 10691ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 1070a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul GL_UNSIGNED_INT, (GLuint *) dstRow, 1071a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul depthScale, srcType, src, srcPacking); 1072f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1073f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1074f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1075f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1076f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1077f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1078f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1079e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul 1080f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1081c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca * Store a 24-bit integer depth component texture image. 1082c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca */ 1083c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonsecastatic GLboolean 1084c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca_mesa_texstore_z24_x8(TEXSTORE_PARAMS) 1085c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca{ 1086c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLuint depthScale = 0xffffff; 1087c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLuint texelBytes = 4; 1088c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1089c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca (void) dims; 1090c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca ASSERT(dstFormat == MESA_FORMAT_Z24_X8); 1091c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1092c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca { 1093c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca /* general path */ 1094c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLint img, row; 1095c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (img = 0; img < srcDepth; img++) { 1096c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLubyte *dstRow = (GLubyte *) dstAddr 1097c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca + dstImageOffsets[dstZoffset + img] * texelBytes 1098c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca + dstYoffset * dstRowStride 1099c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca + dstXoffset * texelBytes; 1100c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (row = 0; row < srcHeight; row++) { 1101c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca const GLvoid *src = _mesa_image_address(dims, srcPacking, 1102c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 1103c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLuint *dst = (GLuint *) dstRow; 1104c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GLint i; 1105c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca _mesa_unpack_depth_span(ctx, srcWidth, 1106c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca GL_UNSIGNED_INT, dst, 1107c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca depthScale, srcType, src, srcPacking); 1108c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca for (i = 0; i < srcWidth; i++) 1109c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca dst[i] <<= 8; 1110c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca dstRow += dstRowStride; 1111c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1112c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1113c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca } 1114c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca return GL_TRUE; 1115c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca} 1116c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1117c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca 1118c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca/** 1119a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul * Store a 16-bit integer depth component texture image. 1120f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 112149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1122b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z16(TEXSTORE_PARAMS) 1123f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 112425cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian const GLuint depthScale = 0xffff; 11251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 1126a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; 11271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_Z16); 112822108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == sizeof(GLushort)); 1129f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1130966e199e409a1b52eef88e48997442250997f45eBrian Paul if (ctx->Pixel.DepthScale == 1.0f && 1131966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 1132f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1133f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_DEPTH_COMPONENT && 1134f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_DEPTH_COMPONENT && 1135a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_SHORT) { 1136f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 113717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 113860909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1139b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1140b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1141f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1142f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1144f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1145f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 11461ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul GLint img, row; 1147f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1148b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 114922108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1150b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 115122108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1152f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 115360909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 1154f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 1155a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dst16 = (GLushort *) dstRow; 11561ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 1157a9bcf751030895494fc098f8d0ff56b2496bd993Brian Paul GL_UNSIGNED_SHORT, dst16, depthScale, 1158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType, src, srcPacking); 1159f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1160f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1161f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1162f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1163f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1164f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1165f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1166f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1167f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 1168defb035b6cf03c555318d9dd48864242ed036f39Brian Paul * Store an rgb565 or rgb565_rev texture image. 1169f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 117049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1171b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb565(TEXSTORE_PARAMS) 1172f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 11731f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 11741f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 117522108bb571808542b89677752d62d3901698265fBrian Paul 11761f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB565 || 11771f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB565_REV); 117822108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1179f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1180f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1181f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 11821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB565 && 1183a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1184a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGB && 1185a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_SHORT_5_6_5) { 1186f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 118717bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 118860909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1189b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1190b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1191f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1192f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1193f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1194a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else if (!ctx->_ImageTransferState && 1195a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1196a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1197a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGB && 1198a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE && 1199a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dims == 2) { 1200a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* do optimized tex store */ 12018c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 12028c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1203a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLubyte *src = (const GLubyte *) 120460909388ab136d849d99eab49e782a53772a618fBrian Paul _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight, 1205a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, 0, 0, 0); 1206a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLubyte *dst = (GLubyte *) dstAddr 1207a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul + dstYoffset * dstRowStride 120822108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1209a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLint row, col; 1210a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1211a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLubyte *srcUB = (const GLubyte *) src; 1212a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dstUS = (GLushort *) dst; 1213defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* check for byteswapped format */ 12141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_RGB565) { 1215f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1216f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] ); 1217f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul srcUB += 3; 1218f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1219f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1220f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1221f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1222f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] ); 1223f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul srcUB += 3; 1224f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1225defb035b6cf03c555318d9dd48864242ed036f39Brian Paul } 1226a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dst += dstRowStride; 1227a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul src += srcRowStride; 1228a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1229a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1230f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1231f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 1232a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1233a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat, 123422108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1235a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, 1236a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, srcAddr, 1237a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcPacking); 1238a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLchan *src = tempImage; 1239f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1240a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!tempImage) 1241a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_FALSE; 1242a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 1243f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1244b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 124522108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1246b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 124722108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1249a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLushort *dstUS = (GLushort *) dstRow; 1250defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* check for byteswapped format */ 12511f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_RGB565) { 1252f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1253f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565( CHAN_TO_UBYTE(src[RCOMP]), 1254f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1255f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1256f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 3; 1257f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1258f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1259f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1260f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1261f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_565_REV( CHAN_TO_UBYTE(src[RCOMP]), 1262f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1263f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1264f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 3; 1265f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1267f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1268f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1269f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1270f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_free((void *) tempImage); 1271f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1272f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1273f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1274f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1275f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1276248200737398a7d6403a23930a6c9d93db06b942Brian Paul/** 1277248200737398a7d6403a23930a6c9d93db06b942Brian Paul * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV. 1278248200737398a7d6403a23930a6c9d93db06b942Brian Paul */ 127949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1280b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba8888(TEXSTORE_PARAMS) 1281f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1282184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 12831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 12841f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 128571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 12861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA8888 || 12871f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGBA8888_REV); 128822108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 4); 1289f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1290f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 12921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGBA8888 && 1293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1294defb035b6cf03c555318d9dd48864242ed036f39Brian Paul ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8) || 12952e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && !littleEndian) || 12962e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) || 12972e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && littleEndian))) { 12982e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger /* simple memcpy path */ 12992e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger memcpy_texture(ctx, dims, 13002e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 13012e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger dstRowStride, 13022e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger dstImageOffsets, 13032e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 13042e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger srcAddr, srcPacking); 13052e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger } 13062e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger else if (!ctx->_ImageTransferState && 13072e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger !srcPacking->SwapBytes && 13081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGBA8888_REV && 13092e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger baseInternalFormat == GL_RGBA && 13102e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger ((srcFormat == GL_RGBA && srcType == GL_UNSIGNED_INT_8_8_8_8_REV) || 13112e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_RGBA && srcType == GL_UNSIGNED_BYTE && littleEndian) || 13122e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_INT_8_8_8_8) || 13132e2a9813355993ba79eeb8070391e45aabb84f94Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_UNSIGNED_BYTE && !littleEndian))) { 1314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 131517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 131660909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1317b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1318b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1319f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1320f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1321f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 132271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 132346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell (srcType == GL_UNSIGNED_BYTE || 132446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8 || 132546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8_REV) && 1326528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger can_swizzle(baseInternalFormat) && 132771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell can_swizzle(srcFormat)) { 132846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 132971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte dstmap[4]; 133071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 1331528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger /* dstmap - how to swizzle from RGBA to dst format: 133271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell */ 13331f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if ((littleEndian && dstFormat == MESA_FORMAT_RGBA8888) || 13341f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_RGBA8888_REV)) { 133546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 0; 133646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 1; 133746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 2; 133846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 3; 133946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 134046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell else { 134146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 3; 134246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 2; 134346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 1; 134446c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 0; 134546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 134671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 134771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 134871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat, 134946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType, 1350528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger baseInternalFormat, 135171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstmap, 4, 135271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 1353528de982f88bfc025425ce1188781a34f4d84f1fRoland Scheidegger dstRowStride, dstImageOffsets, 135471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 135571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcPacking); 135671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 1357f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1358f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 13598f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1360f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 136122108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1362f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1363f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1364f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1365f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLchan *src = tempImage; 1366f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1367f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1368f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1369f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 1370f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1371b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 137222108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1373b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 137422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1376f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLuint *dstUI = (GLuint *) dstRow; 13771f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_RGBA8888) { 1378f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1379f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[RCOMP]), 1380f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1381f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]), 1382f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[ACOMP]) ); 1383f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1384f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1385f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1386f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1387f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1388f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[RCOMP]), 1389f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1390f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]), 1391f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[ACOMP]) ); 1392f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1393f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1394a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1395a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1396a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1397a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1398a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul _mesa_free((void *) tempImage); 1399a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1400a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1401a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1402a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1403a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 140449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1405b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb8888(TEXSTORE_PARAMS) 1406f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1407184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 14081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 1409f920d496e1b5b01a3ba9bcd7dcff5c19bc109da2Brian Paul const GLenum baseFormat = GL_RGBA; 1410f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 14111f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB8888 || 141274d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_ARGB8888_REV || 141374d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_XRGB8888); 141422108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 4); 1415f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1416f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1417f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 141874d61d03b54d72217d463c248468cdcd09320efcBrian Paul (dstFormat == MESA_FORMAT_ARGB8888 || 141974d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_XRGB8888) && 1420f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1421f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGRA && 1422f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ((srcType == GL_UNSIGNED_BYTE && littleEndian) || 1423defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8_REV)) { 1424defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* simple memcpy path (little endian) */ 142517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 142660909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1427b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1428b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1429f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1430f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1431f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1432defb035b6cf03c555318d9dd48864242ed036f39Brian Paul else if (!ctx->_ImageTransferState && 1433a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 14341f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB8888_REV && 1435a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGBA && 1436a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_BGRA && 1437a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul ((srcType == GL_UNSIGNED_BYTE && !littleEndian) || 1438defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_INT_8_8_8_8)) { 1439defb035b6cf03c555318d9dd48864242ed036f39Brian Paul /* simple memcpy path (big endian) */ 144017bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 144160909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1442b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1443b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1444a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1445a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcAddr, srcPacking); 1446a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 144771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 144871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell !srcPacking->SwapBytes && 144974d61d03b54d72217d463c248468cdcd09320efcBrian Paul (dstFormat == MESA_FORMAT_ARGB8888 || 145074d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstFormat == MESA_FORMAT_XRGB8888) && 145171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat == GL_RGB && 14520c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell (baseInternalFormat == GL_RGBA || 14530c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat == GL_RGB) && 145471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcType == GL_UNSIGNED_BYTE) { 145571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell int img, row, col; 145671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (img = 0; img < srcDepth; img++) { 14578c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 14588c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 145971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 146071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1461b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 146222108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1463b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 146422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 146571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (row = 0; row < srcHeight; row++) { 1466259eacfa94a1086e4c99db83516989cc27832ef4Brian GLuint *d4 = (GLuint *) dstRow; 146771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell for (col = 0; col < srcWidth; col++) { 146824748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul d4[col] = PACK_COLOR_8888(0xff, 146924748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + RCOMP], 147024748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + GCOMP], 147124748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 3 + BCOMP]); 147271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 147371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 147471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 147571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 147671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 147771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 147871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 147971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell !srcPacking->SwapBytes && 14801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB8888 && 148171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat == GL_RGBA && 14820c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat == GL_RGBA && 148324748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcType == GL_UNSIGNED_BYTE) { 1484259eacfa94a1086e4c99db83516989cc27832ef4Brian /* same as above case, but src data has alpha too */ 1485b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row, col; 1486ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* For some reason, streaming copies to write-combined regions 1487ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * are extremely sensitive to the characteristics of how the 1488ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * source data is retrieved. By reordering the source reads to 1489ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * be in-order, the speed of this operation increases by half. 1490ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul * Strangely the same isn't required for the RGB path, above. 1491ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul */ 1492ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (img = 0; img < srcDepth; img++) { 14938c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 14948c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1495ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 1496ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1497b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 149822108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1499b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 150022108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1501ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (row = 0; row < srcHeight; row++) { 1502259eacfa94a1086e4c99db83516989cc27832ef4Brian GLuint *d4 = (GLuint *) dstRow; 1503ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul for (col = 0; col < srcWidth; col++) { 150424748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP], 150524748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + RCOMP], 150624748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + GCOMP], 150724748268a3ac7bedc2c9ae5bf76c4c741d539f80Brian Paul srcRow[col * 4 + BCOMP]); 150871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 150971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstRow += dstRowStride; 151071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcRow += srcRowStride; 151171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 151271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 151371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 151471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell else if (!ctx->_ImageTransferState && 151546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell (srcType == GL_UNSIGNED_BYTE || 151646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8 || 151746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType == GL_UNSIGNED_INT_8_8_8_8_REV) && 15180c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell can_swizzle(baseInternalFormat) && 151971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell can_swizzle(srcFormat)) { 152071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 152171699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLubyte dstmap[4]; 152271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 15230c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 152471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell */ 15251f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 152674d61d03b54d72217d463c248468cdcd09320efcBrian Paul (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) || 15271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV)) { 152846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 3; /* alpha */ 152946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 0; /* red */ 153046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 1; /* green */ 153146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 2; /* blue */ 153246c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 153346c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell else { 15341f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) || 153574d61d03b54d72217d463c248468cdcd09320efcBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 153674d61d03b54d72217d463c248468cdcd09320efcBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888)); 153746c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[3] = 2; 153846c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[2] = 1; 153946c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[1] = 0; 154046c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell dstmap[0] = 3; 154146c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell } 154271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell 154371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 154471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcFormat, 154546c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell srcType, 154646c3bd29be4970a8b0c1c358aae0f1d7c05bc9f4Keith Whitwell 15470c9259f3b95615ceda134bd7074d871cd0186c89Keith Whitwell baseInternalFormat, 154871699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstmap, 4, 154971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 1550b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1551b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 155271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 155371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell srcPacking); 155471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell } 1555a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else { 1556a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* general path */ 1557a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1558a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat, 155922108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1560a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, 1561a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, srcAddr, 1562a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcPacking); 1563a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLchan *src = tempImage; 1564a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLint img, row, col; 1565a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!tempImage) 1566a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_FALSE; 1567a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 1568a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 1569b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 157022108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1571b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 157222108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1573a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1574a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLuint *dstUI = (GLuint *) dstRow; 15751f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_ARGB8888) { 1576f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1577f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUI[col] = PACK_COLOR_8888( CHAN_TO_UBYTE(src[ACOMP]), 1578f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 1579f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1580f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1581f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1582f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1583a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 158474d61d03b54d72217d463c248468cdcd09320efcBrian Paul else if (dstFormat == MESA_FORMAT_XRGB8888) { 158574d61d03b54d72217d463c248468cdcd09320efcBrian Paul for (col = 0; col < srcWidth; col++) { 158674d61d03b54d72217d463c248468cdcd09320efcBrian Paul dstUI[col] = PACK_COLOR_8888( 0xff, 158774d61d03b54d72217d463c248468cdcd09320efcBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 158874d61d03b54d72217d463c248468cdcd09320efcBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 158974d61d03b54d72217d463c248468cdcd09320efcBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 159074d61d03b54d72217d463c248468cdcd09320efcBrian Paul src += 4; 159174d61d03b54d72217d463c248468cdcd09320efcBrian Paul } 159274d61d03b54d72217d463c248468cdcd09320efcBrian Paul } 1593f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1594f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1595f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUI[col] = PACK_COLOR_8888_REV( CHAN_TO_UBYTE(src[ACOMP]), 1596f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 1597f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1598f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1599f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1600f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1601defb035b6cf03c555318d9dd48864242ed036f39Brian Paul } 1602a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1603a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1604a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1605a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul _mesa_free((void *) tempImage); 1606a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1607a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1608a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1609a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1610f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 161149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1612b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb888(TEXSTORE_PARAMS) 1613f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 1614184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 16151f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 16161f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1617f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 16181f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB888); 161922108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 3); 1620f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1621f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1622f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1623f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB && 1624f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGR && 1625f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE && 1626f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul littleEndian) { 1627f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 162817bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 162960909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1630b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1631b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1632f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1633f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1634f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1635f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else if (!ctx->_ImageTransferState && 1636f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 1637f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_RGBA && 1638f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 1639a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* extract RGB from RGBA */ 1640b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint img, row, col; 1641f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 16428c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 16438c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 164460909388ab136d849d99eab49e782a53772a618fBrian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 164560909388ab136d849d99eab49e782a53772a618fBrian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1646b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 164722108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1648b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 164922108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1650f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1651f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1652f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP]; 1653f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1654f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP]; 1655f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1656f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1657f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcRow += srcRowStride; 1658f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1659f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1660f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 16613aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 16623aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 16633aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 16643aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 16653aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 16663aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 16673aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 16683aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 16693aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 1670167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[0] = 2; 16713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 1; 1672167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[2] = 0; 16733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 16743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 16753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 16763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 16773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 16783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 16793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 3, 16803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 16813aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstRowStride, dstImageOffsets, 16823aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 16833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 16843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1685f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1686f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 16878f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1688f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 168922108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1690f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1691f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1692f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 16937c544d36850c6e3627adbbd66df9b12bbe0f185bBrian Paul const GLchan *src = (const GLchan *) tempImage; 1694f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1695f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1696f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1697f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 1698f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1699b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 170022108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1701b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 170222108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1703f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1704f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#if 0 1705f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (littleEndian) { 1706f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1707f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[RCOMP]); 1708f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]); 1709f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[BCOMP]); 1710f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcUB += 3; 1711f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1712f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1713f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1714f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1715f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = srcUB[BCOMP]; 1716f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = srcUB[GCOMP]; 1717f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = srcUB[RCOMP]; 1718f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcUB += 3; 1719f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1720f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1721f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#else 1722f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 1723f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[BCOMP]); 1724f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]); 1725f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[RCOMP]); 1726f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += 3; 1727f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1728f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul#endif 1729f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 1730f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1731f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1732f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_free((void *) tempImage); 1733f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1734f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 1735f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 1736f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1737f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 173849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1739b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_bgr888(TEXSTORE_PARAMS) 1740a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul{ 1741184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 17421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 17431f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1744a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 17451f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_BGR888); 174622108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 3); 1747a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1748a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!ctx->_ImageTransferState && 1749a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1750a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat == GL_RGB && 1751a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGB && 1752a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE && 1753a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul littleEndian) { 1754a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* simple memcpy path */ 175517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 175660909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1757b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1758b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1759a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1760a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcAddr, srcPacking); 1761a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1762a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else if (!ctx->_ImageTransferState && 1763a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul !srcPacking->SwapBytes && 1764a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat == GL_RGBA && 1765a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcType == GL_UNSIGNED_BYTE) { 1766a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* extract BGR from RGBA */ 1767a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul int img, row, col; 1768a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 17698c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcRowStride = 17708c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 177160909388ab136d849d99eab49e782a53772a618fBrian Paul GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 177260909388ab136d849d99eab49e782a53772a618fBrian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1773b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 177422108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1775b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 177622108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1777a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1778a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (col = 0; col < srcWidth; col++) { 1779a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP]; 1780a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1781a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP]; 1782a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1783a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1784a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcRow += srcRowStride; 1785a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1786a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1787a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 17883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 17893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 17903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 17913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 17923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 17933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 17943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 17953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 17963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 1797167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[0] = 0; 17983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 1; 1799167ca59fe893a62e23e799f51608d18847dd590aKeith Whitwell dstmap[2] = 2; 18003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 18013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 18023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 18033aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 18043aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 18053aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 18063aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 3, 18073aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 18083aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstRowStride, dstImageOffsets, 18093aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 18103aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 18113aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 1812a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul else { 1813a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* general path */ 1814a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1815a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul baseInternalFormat, 181622108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1817a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcWidth, srcHeight, srcDepth, 1818a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcFormat, srcType, srcAddr, 1819a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul srcPacking); 18207c544d36850c6e3627adbbd66df9b12bbe0f185bBrian Paul const GLchan *src = (const GLchan *) tempImage; 1821a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul GLint img, row, col; 1822a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul if (!tempImage) 1823a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_FALSE; 1824a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 1825a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (img = 0; img < srcDepth; img++) { 1826b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 182722108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1828b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 182922108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1830a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (row = 0; row < srcHeight; row++) { 1831a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul for (col = 0; col < srcWidth; col++) { 1832a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 0] = CHAN_TO_UBYTE(src[RCOMP]); 1833a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 1] = CHAN_TO_UBYTE(src[GCOMP]); 1834a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow[col * 3 + 2] = CHAN_TO_UBYTE(src[BCOMP]); 1835a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul src += 3; 1836a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1837a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1838a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1839a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1840a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul _mesa_free((void *) tempImage); 1841a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1842a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1843a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1844a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1845a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 184649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1847b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb4444(TEXSTORE_PARAMS) 1848f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 18491f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 18501f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 185122108bb571808542b89677752d62d3901698265fBrian Paul 18521f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB4444 || 18531f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB4444_REV); 185422108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1855f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1856f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1857f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 18581f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB4444 && 1859f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1860f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGRA && 1861defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_SHORT_4_4_4_4_REV) { 1862f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 186317bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 186460909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1865b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1866b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1867f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1868f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1869f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1870f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1871f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 18728f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1873f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 187422108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1875f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 1876f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 1877f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 1878f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLchan *src = tempImage; 1879f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 1880f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 1881f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 1882f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 1883f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 1884b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 188522108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1886b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 188722108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1888f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 1889f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 18901f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_ARGB4444) { 1891f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1892f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_4444( CHAN_TO_UBYTE(src[ACOMP]), 1893f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 1894f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1895f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1896f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1897f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1898f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1899f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 1900f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 1901f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_4444_REV( CHAN_TO_UBYTE(src[ACOMP]), 1902f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 1903f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 1904f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 1905f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 1906f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 1907a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1908a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 1909a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1910a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1911a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul _mesa_free((void *) tempImage); 1912a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 1913a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 1914a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 1915a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 191649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1917dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom_mesa_texstore_rgba5551(TEXSTORE_PARAMS) 1918dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom{ 19191f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 19201f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 192122108bb571808542b89677752d62d3901698265fBrian Paul 19221f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA5551); 192322108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1924a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 1925dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom if (!ctx->_ImageTransferState && 1926dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom !srcPacking->SwapBytes && 19271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGBA5551 && 1928dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom baseInternalFormat == GL_RGBA && 1929dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcFormat == GL_RGBA && 1930dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcType == GL_UNSIGNED_SHORT_5_5_5_1) { 1931dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom /* simple memcpy path */ 1932dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom memcpy_texture(ctx, dims, 1933dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1934dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstRowStride, 1935dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstImageOffsets, 1936dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1937dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcAddr, srcPacking); 1938dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1939dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom else { 1940dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom /* general path */ 1941dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 1942dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom baseInternalFormat, 194322108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 1944dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcWidth, srcHeight, srcDepth, 1945dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcFormat, srcType, srcAddr, 1946dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom srcPacking); 1947dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom const GLchan *src =tempImage; 1948dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom GLint img, row, col; 1949dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom if (!tempImage) 1950dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom return GL_FALSE; 1951dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 1952dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom for (img = 0; img < srcDepth; img++) { 1953dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom GLubyte *dstRow = (GLubyte *) dstAddr 195422108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 1955dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom + dstYoffset * dstRowStride 195622108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 1957dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom for (row = 0; row < srcHeight; row++) { 1958dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom GLushort *dstUS = (GLushort *) dstRow; 1959dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom for (col = 0; col < srcWidth; col++) { 1960dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstUS[col] = PACK_COLOR_5551( CHAN_TO_UBYTE(src[RCOMP]), 1961dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom CHAN_TO_UBYTE(src[GCOMP]), 1962dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom CHAN_TO_UBYTE(src[BCOMP]), 1963dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom CHAN_TO_UBYTE(src[ACOMP]) ); 1964dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom src += 4; 1965dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1966dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom dstRow += dstRowStride; 1967dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1968dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1969dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom _mesa_free((void *) tempImage); 1970dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom } 1971dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom return GL_TRUE; 1972dbda49a9e65f684ca46c7af84cc52d63b0622978Thomas Hellstrom} 1973defb035b6cf03c555318d9dd48864242ed036f39Brian Paul 197449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 1975b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_argb1555(TEXSTORE_PARAMS) 1976f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 19771f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 19781f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 197922108bb571808542b89677752d62d3901698265fBrian Paul 19801f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_ARGB1555 || 19811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB1555_REV); 198222108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 1983f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 1984f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 1985f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 19861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ARGB1555 && 1987f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGBA && 1988f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_BGRA && 1989defb035b6cf03c555318d9dd48864242ed036f39Brian Paul srcType == GL_UNSIGNED_SHORT_1_5_5_5_REV) { 1990f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 199117bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 199260909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 1993b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 1994b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 1995f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1996f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 1997f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 1998f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 1999f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 20008f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 2001f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 200222108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2003f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2004f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2005f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2006f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLchan *src =tempImage; 2007f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2008f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2009f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2010f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 2011f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2012b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 201322108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2014b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 201522108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2016f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2017f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 20181f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_ARGB1555) { 2019f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 2020f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_1555( CHAN_TO_UBYTE(src[ACOMP]), 2021f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 2022f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 2023f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 2024f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 2025f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 2026f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2027f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 2028f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 2029f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_1555_REV( CHAN_TO_UBYTE(src[ACOMP]), 2030f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[RCOMP]), 2031f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[GCOMP]), 2032f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 2033f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 4; 2034f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 2035a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2036a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 2037a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2038a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2039a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul _mesa_free((void *) tempImage); 2040a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2041a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 2042a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 2043a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 2044f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 204549263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2046b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_al88(TEXSTORE_PARAMS) 2047f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 2048184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 20491f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 20501f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2051f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 20521f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_AL88 || 20531f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_AL88_REV); 205422108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 2055f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2056f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2057f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 20581f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_AL88 && 2059f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA && 2060f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_LUMINANCE_ALPHA && 2061f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE && 2062f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul littleEndian) { 2063f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 206417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 206560909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2066b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2067b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2068f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2069f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2070f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 20713aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 2072bad5cf056ac653e97d96114d42b874f15a3c2ec8Keith Whitwell littleEndian && 20733aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 20743aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 20753aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 20763aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 20773aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 20783aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 20793aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 20803aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 20811f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if ((littleEndian && dstFormat == MESA_FORMAT_AL88) || 20821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) { 20833aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 0; 20843aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 3; 20853aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 20863aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else { 20873aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 3; 20883aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = 0; 20893aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 20903aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[2] = ZERO; /* ? */ 20913aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 20923aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 20933aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 20943aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 20953aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 20963aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 20973aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 2, 20983aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 20993aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstRowStride, dstImageOffsets, 21003aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 21013aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 21023aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 2103f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2104f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 21058f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 2106f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 210722108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2108f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2109f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2110f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2111f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLchan *src = tempImage; 2112f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2113f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2114f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2115f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 2116f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2117b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 211822108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2119b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 212022108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2121f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2122f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLushort *dstUS = (GLushort *) dstRow; 21231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_AL88) { 2124f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 2125f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul /* src[0] is luminance, src[1] is alpha */ 2126f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_88( CHAN_TO_UBYTE(src[1]), 2127f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[0]) ); 2128f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 2; 2129f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 2130f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2131f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul else { 2132f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul for (col = 0; col < srcWidth; col++) { 2133f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul /* src[0] is luminance, src[1] is alpha */ 2134f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul dstUS[col] = PACK_COLOR_88_REV( CHAN_TO_UBYTE(src[1]), 2135f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul CHAN_TO_UBYTE(src[0]) ); 2136f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul src += 2; 2137f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul } 2138a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2139a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul dstRow += dstRowStride; 2140a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2141a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2142a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul _mesa_free((void *) tempImage); 2143a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul } 2144a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul return GL_TRUE; 2145a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul} 2146a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 2147a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul 214849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2149b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgb332(TEXSTORE_PARAMS) 2150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 21511f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 21521f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 215322108bb571808542b89677752d62d3901698265fBrian Paul 21541f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGB332); 215522108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 1); 2156f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2157f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2158f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2159f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB && 2160f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_RGB && srcType == GL_UNSIGNED_BYTE_3_3_2) { 2161f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 216217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 216360909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2164b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2165b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2166f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2167f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2168f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2169f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2170f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 21718f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 2172f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 217322108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2174f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2176f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2177f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLchan *src = tempImage; 2178f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2179f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2180f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2181f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 2182f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2183b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 218422108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2185b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 218622108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2187f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2188f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 2189f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col] = PACK_COLOR_332( CHAN_TO_UBYTE(src[RCOMP]), 2190f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul CHAN_TO_UBYTE(src[GCOMP]), 2191f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul CHAN_TO_UBYTE(src[BCOMP]) ); 2192f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += 3; 2193f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2194f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 2195f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2196f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2197f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_free((void *) tempImage); 2198f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2199f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2200f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2201f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2202f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2203f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 2204f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8. 2205f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 220649263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2207b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_a8(TEXSTORE_PARAMS) 2208f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 22091f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 22101f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 221122108bb571808542b89677752d62d3901698265fBrian Paul 22121f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_A8 || 22131f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_L8 || 22141f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_I8); 221522108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 1); 2216f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2217f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2218f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2219f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 2220f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 2221f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 222217bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 222360909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2224b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2225b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2227f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2228f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 22293aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else if (!ctx->_ImageTransferState && 22303aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType == GL_UNSIGNED_BYTE && 22313aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(baseInternalFormat) && 22323aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell can_swizzle(srcFormat)) { 22333aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 22343aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell GLubyte dstmap[4]; 22353aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 22363aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell /* dstmap - how to swizzle from RGBA to dst format: 22373aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell */ 22381f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_A8) { 22393aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 3; 22403aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 22413aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell else { 22423aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[0] = 0; 22433aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 22443aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[1] = ZERO; /* ? */ 22453aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[2] = ZERO; /* ? */ 22463aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap[3] = ONE; /* ? */ 22473aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell 22483aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell _mesa_swizzle_ubyte_image(ctx, dims, 22493aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcFormat, 22503aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcType, 22513aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell baseInternalFormat, 22523aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstmap, 1, 22533aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstAddr, dstXoffset, dstYoffset, dstZoffset, 22543aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell dstRowStride, dstImageOffsets, 22553aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcWidth, srcHeight, srcDepth, srcAddr, 22563aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell srcPacking); 22573aea82b396387bf3835f91bcc9121e02274c4c04Keith Whitwell } 2258f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 22608f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul const GLchan *tempImage = _mesa_make_temp_chan_image(ctx, dims, 2261f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 226222108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2263f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2264f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2265f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2266f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLchan *src = tempImage; 2267f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row, col; 2268f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2269f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2270f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 2271f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2272b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 227322108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2274b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 227522108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2276f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2277f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (col = 0; col < srcWidth; col++) { 2278f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow[col] = CHAN_TO_UBYTE(src[col]); 2279f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2280f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 2281f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcWidth; 2282f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2283f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2284f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_free((void *) tempImage); 2285f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2287f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2288f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2289f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2290f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 229149263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2292b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ci8(TEXSTORE_PARAMS) 2293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 22941f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 229522108bb571808542b89677752d62d3901698265fBrian Paul 2296a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) dims; (void) baseInternalFormat; 22971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_CI8); 229822108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 1); 2299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_COLOR_INDEX); 2300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2302f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat == GL_COLOR_INDEX && 2304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_UNSIGNED_BYTE) { 2305f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 230617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 230760909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2308b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2309b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2310f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 2315f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 2316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2317b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 231822108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2319b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 232022108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2321f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 232260909388ab136d849d99eab49e782a53772a618fBrian Paul const GLvoid *src = _mesa_image_address(dims, srcPacking, 2323f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 2324f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_unpack_index_span(ctx, srcWidth, GL_UNSIGNED_BYTE, dstRow, 2325f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType, src, srcPacking, 2326f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ctx->_ImageTransferState); 2327f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 2328f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2329f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2330f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2331f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2332f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2333f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 23361f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV. 2337f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 233849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2339b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_ycbcr(TEXSTORE_PARAMS) 2340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 2341184b5d89380e18008d64adfe1756dca9736426f2Brian Paul const GLboolean littleEndian = _mesa_little_endian(); 23421f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 234322108bb571808542b89677752d62d3901698265fBrian Paul 2344a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; (void) dims; (void) baseInternalFormat; 2345f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 23461f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT((dstFormat == MESA_FORMAT_YCBCR) || 23471f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (dstFormat == MESA_FORMAT_YCBCR_REV)); 234822108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 2349f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(ctx->Extensions.MESA_ycbcr_texture); 2350f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(srcFormat == GL_YCBCR_MESA); 2351f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) || 2352f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA)); 2353f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_YCBCR_MESA); 2354f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2355f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* always just memcpy since no pixel transfer ops apply */ 235617bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 235760909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2358b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2359b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2360f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2361f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2362f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2363f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* Check if we need byte swapping */ 2364f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* XXX the logic here _might_ be wrong */ 2365f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (srcPacking->SwapBytes ^ 2366f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^ 23671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (dstFormat == MESA_FORMAT_YCBCR_REV) ^ 2368f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !littleEndian) { 2369f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 2370f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2371b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 237222108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2373b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 237422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2375f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2376b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul _mesa_swap2((GLushort *) dstRow, srcWidth); 2377b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 2378f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2379f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2380f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2381f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2382f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2383f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 238449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2385114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger_mesa_texstore_dudv8(TEXSTORE_PARAMS) 2386114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger{ 2387114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const GLboolean littleEndian = _mesa_little_endian(); 23881f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2389114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 23901f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_DUDV8); 239122108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 2); 2392114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT(ctx->Extensions.ATI_envmap_bumpmap); 2393114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT((srcFormat == GL_DU8DV8_ATI) || 2394114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger (srcFormat == GL_DUDV_ATI)); 2395114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ASSERT(baseInternalFormat == GL_DUDV_ATI); 2396114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2397114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!srcPacking->SwapBytes && srcType == GL_BYTE && 2398114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger littleEndian) { 2399114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* simple memcpy path */ 2400114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger memcpy_texture(ctx, dims, 2401114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2402114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstRowStride, 2403114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstImageOffsets, 2404114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2405114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcAddr, srcPacking); 2406114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2407114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else if (srcType == GL_BYTE) { 2408114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2409114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLubyte dstmap[4]; 2410114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2411114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* dstmap - how to swizzle from RGBA to dst format: 2412114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger */ 2413114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (littleEndian) { 2414114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[0] = 0; 2415114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[1] = 3; 2416114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2417114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 2418114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[0] = 3; 2419114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[1] = 0; 2420114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2421114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[2] = ZERO; /* ? */ 2422114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap[3] = ONE; /* ? */ 2423114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2424114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_swizzle_ubyte_image(ctx, dims, 2425114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_LUMINANCE_ALPHA, /* hack */ 2426114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_UNSIGNED_BYTE, /* hack */ 2427114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GL_LUMINANCE_ALPHA, /* hack */ 2428114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstmap, 2, 2429114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstAddr, dstXoffset, dstYoffset, dstZoffset, 2430114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dstRowStride, dstImageOffsets, 2431114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, srcDepth, srcAddr, 2432114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcPacking); 2433114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2434114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger else { 2435114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger /* general path - note this is defined for 2d textures only */ 2436114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger const GLint components = _mesa_components_in_format(baseInternalFormat); 24378c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth, 24388c92a531fb7e0d2de2a06610b2dff98eeb19c985Brian Paul srcFormat, srcType); 2439114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLbyte *tempImage, *dst, *src; 2440114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger GLint row; 2441114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2442114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger tempImage = (GLbyte *) _mesa_malloc(srcWidth * srcHeight * srcDepth 2443114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger * components * sizeof(GLbyte)); 2444114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (!tempImage) 2445114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_FALSE; 2446114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2447114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2448114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcWidth, srcHeight, 2449114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcFormat, srcType, 2450114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 0, 0, 0); 2451114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2452114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst = tempImage; 2453114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (row = 0; row < srcHeight; row++) { 2454114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat, 2455114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst, srcFormat, srcType, src, 2456114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger srcPacking, 0); 2457114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst += srcWidth * components; 2458114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src += srcStride; 2459114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2460114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2461114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger src = tempImage; 2462114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst = (GLbyte *) dstAddr 2463114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger + dstYoffset * dstRowStride 246422108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2465114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger for (row = 0; row < srcHeight; row++) { 246622108bb571808542b89677752d62d3901698265fBrian Paul memcpy(dst, src, srcWidth * texelBytes); 2467114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger dst += dstRowStride; 246822108bb571808542b89677752d62d3901698265fBrian Paul src += srcWidth * texelBytes; 2469114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2470114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger _mesa_free((void *) tempImage); 2471114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 2472114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_TRUE; 2473114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger} 2474f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2475c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger/** 2476bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or MESA_FORMAT_SIGNED_RGBA8888_REV 2477c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */ 247849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2479c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS) 2480c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger{ 2481c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger const GLboolean littleEndian = _mesa_little_endian(); 24821f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 24831f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2484c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 24851f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 || 24861f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV); 248722108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == 4); 2488c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 2489c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger if (!ctx->_ImageTransferState && 2490c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger !srcPacking->SwapBytes && 24911f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888 && 2492c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat == GL_RGBA && 2493c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger ((srcFormat == GL_RGBA && srcType == GL_BYTE && !littleEndian) || 2494c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && littleEndian))) { 2495c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* simple memcpy path */ 2496c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger memcpy_texture(ctx, dims, 2497c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2498c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstRowStride, 2499c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstImageOffsets, 2500c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2501c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcAddr, srcPacking); 2502c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2503c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger else if (!ctx->_ImageTransferState && 2504bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger !srcPacking->SwapBytes && 25051f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV && 2506bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger baseInternalFormat == GL_RGBA && 2507bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger ((srcFormat == GL_RGBA && srcType == GL_BYTE && littleEndian) || 2508bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger (srcFormat == GL_ABGR_EXT && srcType == GL_BYTE && !littleEndian))) { 2509bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger /* simple memcpy path */ 2510bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger memcpy_texture(ctx, dims, 2511bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2512bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger dstRowStride, 2513bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger dstImageOffsets, 2514bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2515bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcAddr, srcPacking); 2516bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 2517bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger else if (!ctx->_ImageTransferState && 2518c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger (srcType == GL_BYTE) && 2519c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger can_swizzle(baseInternalFormat) && 2520c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger can_swizzle(srcFormat)) { 2521c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 2522c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger GLubyte dstmap[4]; 2523c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 2524c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* dstmap - how to swizzle from RGBA to dst format: 2525c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger */ 25261f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if ((littleEndian && dstFormat == MESA_FORMAT_SIGNED_RGBA8888) || 25271f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul (!littleEndian && dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV)) { 2528c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[3] = 0; 2529c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[2] = 1; 2530c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[1] = 2; 2531c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[0] = 3; 2532c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2533c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger else { 2534c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[3] = 3; 2535c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[2] = 2; 2536c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[1] = 1; 2537c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap[0] = 0; 2538c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2539c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger 2540c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger _mesa_swizzle_ubyte_image(ctx, dims, 2541c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcFormat, 2542c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcType, 2543c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat, 2544c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstmap, 4, 2545c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstAddr, dstXoffset, dstYoffset, dstZoffset, 2546c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstRowStride, dstImageOffsets, 2547c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, srcAddr, 2548c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcPacking); 2549c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2550c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger else { 2551c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger /* general path */ 2552c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger const GLfloat *tempImage = make_temp_float_image(ctx, dims, 2553c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger baseInternalFormat, 255422108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2555c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcWidth, srcHeight, srcDepth, 2556c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcFormat, srcType, srcAddr, 2557c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcPacking); 2558c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger const GLfloat *srcRow = tempImage; 2559c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger GLint img, row, col; 2560c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger if (!tempImage) 2561c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger return GL_FALSE; 2562c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 2563c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (img = 0; img < srcDepth; img++) { 2564c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger GLubyte *dstRow = (GLubyte *) dstAddr 256522108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2566c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger + dstYoffset * dstRowStride 256722108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2568c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (row = 0; row < srcHeight; row++) { 2569c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger GLuint *dstUI = (GLuint *) dstRow; 25701f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) { 2571c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger for (col = 0; col < srcWidth; col++) { 2572c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstUI[col] = PACK_COLOR_8888( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]), 2573c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger FLOAT_TO_BYTE_TEX(srcRow[GCOMP]), 2574c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger FLOAT_TO_BYTE_TEX(srcRow[BCOMP]), 2575c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger FLOAT_TO_BYTE_TEX(srcRow[ACOMP]) ); 2576c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger srcRow += 4; 2577c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2578c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2579bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger else { 2580bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger for (col = 0; col < srcWidth; col++) { 2581bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger dstUI[col] = PACK_COLOR_8888_REV( FLOAT_TO_BYTE_TEX(srcRow[RCOMP]), 2582bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger FLOAT_TO_BYTE_TEX(srcRow[GCOMP]), 2583bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger FLOAT_TO_BYTE_TEX(srcRow[BCOMP]), 2584bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger FLOAT_TO_BYTE_TEX(srcRow[ACOMP]) ); 2585bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger srcRow += 4; 2586bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 2587bb386a1ecae6d7f805af44df463b0e4d661eef85Roland Scheidegger } 2588c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger dstRow += dstRowStride; 2589c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2590c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2591c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger _mesa_free((void *) tempImage); 2592c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 2593c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger return GL_TRUE; 2594c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger} 2595f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2596184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul/** 2597184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul * Store a combined depth/stencil texture image. 2598184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul */ 259949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2600b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_z24_s8(TEXSTORE_PARAMS) 2601184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul{ 260230640695400b9b27656893753ae6b62f2082ce9bBrian Paul const GLfloat depthScale = (GLfloat) 0xffffff; 2603c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz const GLint srcRowStride 2604c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType) 2605c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz / sizeof(GLuint); 2606c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz GLint img, row; 260725cfb68f0b3baf0e74d1f6a37afab46370f6711bBrian 26081f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_Z24_S8); 2609c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || srcFormat == GL_DEPTH_COMPONENT); 2610c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT); 2611184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 2612c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz /* In case we only upload depth we need to preserve the stencil */ 2613c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz if (srcFormat == GL_DEPTH_COMPONENT) { 2614c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz for (img = 0; img < srcDepth; img++) { 2615c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz GLuint *dstRow = (GLuint *) dstAddr 2616c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz + dstImageOffsets[dstZoffset + img] 2617c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz + dstYoffset * dstRowStride / sizeof(GLuint) 2618c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz + dstXoffset; 2619c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz const GLuint *src 2620c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr, 2621c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz srcWidth, srcHeight, 2622c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz srcFormat, srcType, 2623c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz img, 0, 0); 2624c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz for (row = 0; row < srcHeight; row++) { 2625c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz GLuint depth[MAX_WIDTH]; 2626c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz GLint i; 2627c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz _mesa_unpack_depth_span(ctx, srcWidth, 2628c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz GL_UNSIGNED_INT, /* dst type */ 2629c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz depth, /* dst addr */ 2630c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz depthScale, 2631c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz srcType, src, srcPacking); 2632c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz 2633c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz for (i = 0; i < srcWidth; i++) 2634c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF); 2635c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz 2636c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz src += srcRowStride; 2637c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz dstRow += dstRowStride / sizeof(GLuint); 2638c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz } 2639c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz } 2640c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz } 2641c6de08fff483911953692693c501bc200c235dceJakob Bornecrantz else if (ctx->Pixel.DepthScale == 1.0f && 2642966e199e409a1b52eef88e48997442250997f45eBrian Paul ctx->Pixel.DepthBias == 0.0f && 2643184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul !srcPacking->SwapBytes) { 2644ef8653a83800bc4b8e116e03ad52604097224378Brian Paul /* simple path */ 2645184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul memcpy_texture(ctx, dims, 2646184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2647b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2648b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2649184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2650184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul srcAddr, srcPacking); 2651184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul } 2652184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul else { 2653ef8653a83800bc4b8e116e03ad52604097224378Brian Paul /* general path */ 2654ef8653a83800bc4b8e116e03ad52604097224378Brian Paul const GLint srcRowStride 2655ef8653a83800bc4b8e116e03ad52604097224378Brian Paul = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType) 2656ef8653a83800bc4b8e116e03ad52604097224378Brian Paul / sizeof(GLuint); 2657ef8653a83800bc4b8e116e03ad52604097224378Brian Paul GLint img, row; 2658ef8653a83800bc4b8e116e03ad52604097224378Brian Paul 2659ef8653a83800bc4b8e116e03ad52604097224378Brian Paul for (img = 0; img < srcDepth; img++) { 2660b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLuint *dstRow = (GLuint *) dstAddr 2661b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstImageOffsets[dstZoffset + img] 2662b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride / sizeof(GLuint) 2663b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstXoffset; 2664ef8653a83800bc4b8e116e03ad52604097224378Brian Paul const GLuint *src 2665ef8653a83800bc4b8e116e03ad52604097224378Brian Paul = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr, 2666ef8653a83800bc4b8e116e03ad52604097224378Brian Paul srcWidth, srcHeight, 2667ef8653a83800bc4b8e116e03ad52604097224378Brian Paul srcFormat, srcType, 2668ef8653a83800bc4b8e116e03ad52604097224378Brian Paul img, 0, 0); 2669ef8653a83800bc4b8e116e03ad52604097224378Brian Paul for (row = 0; row < srcHeight; row++) { 2670ef8653a83800bc4b8e116e03ad52604097224378Brian Paul GLubyte stencil[MAX_WIDTH]; 2671ef8653a83800bc4b8e116e03ad52604097224378Brian Paul GLint i; 2672ef8653a83800bc4b8e116e03ad52604097224378Brian Paul /* the 24 depth bits will be in the high position: */ 2673ef8653a83800bc4b8e116e03ad52604097224378Brian Paul _mesa_unpack_depth_span(ctx, srcWidth, 267430640695400b9b27656893753ae6b62f2082ce9bBrian Paul GL_UNSIGNED_INT_24_8_EXT, /* dst type */ 2675b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow, /* dst addr */ 2676090e212c0c5e54156c3c33f7eecdfe01398a7222Michal Krol (GLuint) depthScale, 2677ef8653a83800bc4b8e116e03ad52604097224378Brian Paul srcType, src, srcPacking); 2678ef8653a83800bc4b8e116e03ad52604097224378Brian Paul /* get the 8-bit stencil values */ 2679ef8653a83800bc4b8e116e03ad52604097224378Brian Paul _mesa_unpack_stencil_span(ctx, srcWidth, 2680ef8653a83800bc4b8e116e03ad52604097224378Brian Paul GL_UNSIGNED_BYTE, /* dst type */ 2681ef8653a83800bc4b8e116e03ad52604097224378Brian Paul stencil, /* dst addr */ 2682ef8653a83800bc4b8e116e03ad52604097224378Brian Paul srcType, src, srcPacking, 2683ef8653a83800bc4b8e116e03ad52604097224378Brian Paul ctx->_ImageTransferState); 2684ef8653a83800bc4b8e116e03ad52604097224378Brian Paul /* merge stencil values into depth values */ 2685ef8653a83800bc4b8e116e03ad52604097224378Brian Paul for (i = 0; i < srcWidth; i++) 2686b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow[i] |= stencil[i]; 2687ef8653a83800bc4b8e116e03ad52604097224378Brian Paul 2688ef8653a83800bc4b8e116e03ad52604097224378Brian Paul src += srcRowStride; 2689b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride / sizeof(GLuint); 2690ef8653a83800bc4b8e116e03ad52604097224378Brian Paul } 2691ef8653a83800bc4b8e116e03ad52604097224378Brian Paul } 2692184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul } 2693184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul return GL_TRUE; 2694184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul} 2695184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 2696184a9707227ab024d65d352fe7c09b3e287348e9Brian Paul 2697a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz/** 2698a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz * Store a combined depth/stencil texture image. 2699a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz */ 270049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2701a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz_mesa_texstore_s8_z24(TEXSTORE_PARAMS) 2702a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz{ 2703a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz const GLuint depthScale = 0xffffff; 2704a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz const GLint srcRowStride 2705a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType) 2706a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz / sizeof(GLuint); 2707a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz GLint img, row; 2708a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz 27091f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_S8_Z24); 2710c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || srcFormat == GL_DEPTH_COMPONENT); 2711c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT); 2712c47248bdf8d55f985b199fc6e15b0177305cb6fdJosé Fonseca 2713966e199e409a1b52eef88e48997442250997f45eBrian Paul /* In case we only upload depth we need to preserve the stencil */ 2714666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz if (srcFormat == GL_DEPTH_COMPONENT) { 2715666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz for (img = 0; img < srcDepth; img++) { 2716666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz GLuint *dstRow = (GLuint *) dstAddr 2717666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz + dstImageOffsets[dstZoffset + img] 2718666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz + dstYoffset * dstRowStride / sizeof(GLuint) 2719666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz + dstXoffset; 2720666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz const GLuint *src 2721666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr, 2722666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz srcWidth, srcHeight, 2723666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz srcFormat, srcType, 2724666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz img, 0, 0); 2725666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz for (row = 0; row < srcHeight; row++) { 2726666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz GLuint depth[MAX_WIDTH]; 2727666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz GLint i; 2728666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz _mesa_unpack_depth_span(ctx, srcWidth, 2729666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz GL_UNSIGNED_INT, /* dst type */ 2730666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz depth, /* dst addr */ 2731666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz depthScale, 2732666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz srcType, src, srcPacking); 2733a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz 2734666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz for (i = 0; i < srcWidth; i++) 2735666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000); 2736666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz 2737666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz src += srcRowStride; 2738666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz dstRow += dstRowStride / sizeof(GLuint); 2739666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz } 2740666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz } 27418122ab2dfd0e158a4982e1bfeb1f7a6f185b69eeBrian Paul } 27428122ab2dfd0e158a4982e1bfeb1f7a6f185b69eeBrian Paul else { 2743666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz for (img = 0; img < srcDepth; img++) { 2744666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz GLuint *dstRow = (GLuint *) dstAddr 2745666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz + dstImageOffsets[dstZoffset + img] 2746666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz + dstYoffset * dstRowStride / sizeof(GLuint) 2747666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz + dstXoffset; 2748666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz const GLuint *src 2749666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz = (const GLuint *) _mesa_image_address(dims, srcPacking, srcAddr, 2750666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz srcWidth, srcHeight, 2751666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz srcFormat, srcType, 2752666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz img, 0, 0); 2753666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz for (row = 0; row < srcHeight; row++) { 2754666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz GLubyte stencil[MAX_WIDTH]; 2755666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz GLint i; 2756218df7f9c53db90abf3a6590f77c8e9e49aeedf5Xiang, Haihao /* the 24 depth bits will be in the low position: */ 2757666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz _mesa_unpack_depth_span(ctx, srcWidth, 2758666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz GL_UNSIGNED_INT, /* dst type */ 2759666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz dstRow, /* dst addr */ 2760666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz depthScale, 2761666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz srcType, src, srcPacking); 2762666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz /* get the 8-bit stencil values */ 2763666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz _mesa_unpack_stencil_span(ctx, srcWidth, 2764666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz GL_UNSIGNED_BYTE, /* dst type */ 2765666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz stencil, /* dst addr */ 2766666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz srcType, src, srcPacking, 2767666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz ctx->_ImageTransferState); 2768666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz /* merge stencil values into depth values */ 2769666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz for (i = 0; i < srcWidth; i++) 2770218df7f9c53db90abf3a6590f77c8e9e49aeedf5Xiang, Haihao dstRow[i] |= stencil[i] << 24; 2771666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz 2772666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz src += srcRowStride; 2773666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz dstRow += dstRowStride / sizeof(GLuint); 2774666b771e512a7c91fa43544afec61bda63edc240Jakob Bornecrantz } 2775a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz } 2776a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz } 2777a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz return GL_TRUE; 2778a1524162bf838920ad965cd44ead97da29408e50Jakob Bornecrantz} 2779f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2780f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 2781f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * Store an image in any of the formats: 2782f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_rgba_float32 2783f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_rgb_float32 2784f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_alpha_float32 2785f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_luminance_float32 2786f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_luminance_alpha_float32 2787f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * _mesa_texformat_intensity_float32 2788f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 278949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2790b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float32(TEXSTORE_PARAMS) 2791f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 27921f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 27931f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 279422108bb571808542b89677752d62d3901698265fBrian Paul const GLint components = _mesa_components_in_format(baseFormat); 2795f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 27961f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 || 27971f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB_FLOAT32 || 27981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ALPHA_FLOAT32 || 27991f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 || 28001f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 || 28011f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_INTENSITY_FLOAT32); 2802f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 2803f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB || 2804f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_ALPHA || 2805f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE || 2806f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 2807f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_INTENSITY); 280822108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == components * sizeof(GLfloat)); 2809f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2810f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2811f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2812f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 2813f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_FLOAT) { 2814f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 281517bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 281660909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2817b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2818b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2819f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2820f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2821f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2822f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2823f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 2824f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 2825f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 282622108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2827f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2828f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2829f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2830b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLfloat *srcRow = tempImage; 28319c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul GLint bytesPerRow; 2832f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 2833f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2834f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2835f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 28369c1b13ff6a2fb873cada61271f382a912ad99631Brian Paul bytesPerRow = srcWidth * components * sizeof(GLfloat); 2837f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2838b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 283922108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2840b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 284122108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2842f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2843b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul _mesa_memcpy(dstRow, srcRow, bytesPerRow); 2844b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRow += dstRowStride; 2845b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul srcRow += srcWidth * components; 2846f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2847f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2848f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2849f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_free((void *) tempImage); 2850f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2851f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2852f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2853f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2854f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2855f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 2856f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * As above, but store 16-bit floats. 2857f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul */ 285849263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 2859b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul_mesa_texstore_rgba_float16(TEXSTORE_PARAMS) 2860f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul{ 28611f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 28621f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 286322108bb571808542b89677752d62d3901698265fBrian Paul const GLint components = _mesa_components_in_format(baseFormat); 2864f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 28651f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 || 28661f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_RGB_FLOAT16 || 28671f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_ALPHA_FLOAT16 || 28681f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 || 28691f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 || 28701f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul dstFormat == MESA_FORMAT_INTENSITY_FLOAT16); 2871f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ASSERT(baseInternalFormat == GL_RGBA || 2872f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_RGB || 2873f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_ALPHA || 2874f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE || 2875f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_LUMINANCE_ALPHA || 2876f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == GL_INTENSITY); 287722108bb571808542b89677752d62d3901698265fBrian Paul ASSERT(texelBytes == components * sizeof(GLhalfARB)); 2878f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2879f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!ctx->_ImageTransferState && 2880f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul !srcPacking->SwapBytes && 2881f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat == srcFormat && 2882f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcType == GL_HALF_FLOAT_ARB) { 2883f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* simple memcpy path */ 288417bcf9f816db3098db42acd7f0672f64554dd6a0Keith Whitwell memcpy_texture(ctx, dims, 288560909388ab136d849d99eab49e782a53772a618fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 2886b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstRowStride, 2887b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul dstImageOffsets, 2888f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2889f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcAddr, srcPacking); 2890f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2891f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul else { 2892f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* general path */ 2893f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLfloat *tempImage = make_temp_float_image(ctx, dims, 2894f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul baseInternalFormat, 289522108bb571808542b89677752d62d3901698265fBrian Paul baseFormat, 2896f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcWidth, srcHeight, srcDepth, 2897f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcFormat, srcType, srcAddr, 2898f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul srcPacking); 2899f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul const GLfloat *src = tempImage; 2900f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint img, row; 2901f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!tempImage) 2902f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_FALSE; 2903f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_adjust_image_for_convolution(ctx, dims, &srcWidth, &srcHeight); 2904f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (img = 0; img < srcDepth; img++) { 2905b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLubyte *dstRow = (GLubyte *) dstAddr 290622108bb571808542b89677752d62d3901698265fBrian Paul + dstImageOffsets[dstZoffset + img] * texelBytes 2907b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul + dstYoffset * dstRowStride 290822108bb571808542b89677752d62d3901698265fBrian Paul + dstXoffset * texelBytes; 2909f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (row = 0; row < srcHeight; row++) { 2910f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLhalfARB *dstTexel = (GLhalfARB *) dstRow; 2911f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul GLint i; 2912f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul for (i = 0; i < srcWidth * components; i++) { 2913f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstTexel[i] = _mesa_float_to_half(src[i]); 2914f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2915f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul dstRow += dstRowStride; 2916f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul src += srcWidth * components; 2917f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2918f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2919f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2920f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_free((void *) tempImage); 2921f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2922f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_TRUE; 2923f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul} 2924f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2925f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 29268d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#if FEATURE_EXT_texture_sRGB 292749263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 29288d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgb8(TEXSTORE_PARAMS) 29298d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 29301f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 293146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 293246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 29331f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SRGB8); 293446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 293546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal rgb texstore code */ 29361f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_RGB888; 293746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 29380f91e4461fb3a7410c948acde270d97caa851ed6Brian Paul k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat, 293946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul newDstFormat, dstAddr, 294046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul dstXoffset, dstYoffset, dstZoffset, 294146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul dstRowStride, dstImageOffsets, 294246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcWidth, srcHeight, srcDepth, 294346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcFormat, srcType, 294446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcAddr, srcPacking); 294546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 29468d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 29478d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 294854e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 294949263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 29508d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_srgba8(TEXSTORE_PARAMS) 29518d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 29521f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 295346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 295446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 29551f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SRGBA8); 295646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 295746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal rgba texstore code */ 29581f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_RGBA8888; 295946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat, 296046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul newDstFormat, dstAddr, 296146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul dstXoffset, dstYoffset, dstZoffset, 296246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul dstRowStride, dstImageOffsets, 296346f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcWidth, srcHeight, srcDepth, 296446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcFormat, srcType, 296546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcAddr, srcPacking); 296646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 29678d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 29688d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 296954e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 297049263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 29715bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger_mesa_texstore_sargb8(TEXSTORE_PARAMS) 29725bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger{ 29731f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 29745bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger GLboolean k; 29755bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 29761f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SARGB8); 29775bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 29785bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger /* reuse normal rgba texstore code */ 29791f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_ARGB8888; 29805bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 29815bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat, 29825bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger newDstFormat, dstAddr, 29835bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger dstXoffset, dstYoffset, dstZoffset, 29845bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger dstRowStride, dstImageOffsets, 29855bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcWidth, srcHeight, srcDepth, 29865bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcFormat, srcType, 29875bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger srcAddr, srcPacking); 29885bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger return k; 29895bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger} 29905bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 29915bd093bd7b3711f88e1fd0fc9cdb37a18d7d24b9Roland Scheidegger 299249263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 29938d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sl8(TEXSTORE_PARAMS) 29948d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 29951f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 299646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 299746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 29981f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SL8); 299946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 30001f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_L8; 300146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 300254e15d65858c1d1eeea7291059766686cf2e1671Brian Paul /* _mesa_textore_a8 handles luminance8 too */ 300354e15d65858c1d1eeea7291059766686cf2e1671Brian Paul k = _mesa_texstore_a8(ctx, dims, baseInternalFormat, 300454e15d65858c1d1eeea7291059766686cf2e1671Brian Paul newDstFormat, dstAddr, 300554e15d65858c1d1eeea7291059766686cf2e1671Brian Paul dstXoffset, dstYoffset, dstZoffset, 300654e15d65858c1d1eeea7291059766686cf2e1671Brian Paul dstRowStride, dstImageOffsets, 300754e15d65858c1d1eeea7291059766686cf2e1671Brian Paul srcWidth, srcHeight, srcDepth, 300854e15d65858c1d1eeea7291059766686cf2e1671Brian Paul srcFormat, srcType, 300954e15d65858c1d1eeea7291059766686cf2e1671Brian Paul srcAddr, srcPacking); 301046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 30118d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 30128d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 301354e15d65858c1d1eeea7291059766686cf2e1671Brian Paul 301449263e08561e3380115f9e09056190f67fcb1890Brian Paulstatic GLboolean 30158d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul_mesa_texstore_sla8(TEXSTORE_PARAMS) 30168d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul{ 30171f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul gl_format newDstFormat; 301846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul GLboolean k; 301946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 30201f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul ASSERT(dstFormat == MESA_FORMAT_SLA8); 302146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 302246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul /* reuse normal luminance/alpha texstore code */ 30231f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul newDstFormat = MESA_FORMAT_AL88; 302446f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul 302546f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul k = _mesa_texstore_al88(ctx, dims, baseInternalFormat, 302646f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul newDstFormat, dstAddr, 302746f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul dstXoffset, dstYoffset, dstZoffset, 302846f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul dstRowStride, dstImageOffsets, 302946f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcWidth, srcHeight, srcDepth, 303046f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcFormat, srcType, 303146f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul srcAddr, srcPacking); 303246f20579a28ac97dd6fd9cc505301b0764eb011aBrian Paul return k; 30338d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul} 30348d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 30359927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#else 30369927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu 30379927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu/* these are used only in texstore_funcs[] below */ 30389927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgb8 NULL 30399927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_srgba8 NULL 30409927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sargb8 NULL 30419927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sl8 NULL 30429927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu#define _mesa_texstore_sla8 NULL 30439927d7f31c5c46c7b061cf8e13324ac4a837c4b7Chia-I Wu 30448d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul#endif /* FEATURE_EXT_texture_sRGB */ 30458d214bc8044e5027e3fa9302b259d0c557270b00Brian Paul 3046f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3047485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3048485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3049485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/** 3050485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Table mapping MESA_FORMAT_8 to _mesa_texstore_*() 3051485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * XXX this is somewhat temporary. 3052485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */ 3053c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonsecaconst static struct { 3054485105ed182e2e997b084f047e72d5a2c3460057Brian Paul gl_format Name; 3055485105ed182e2e997b084f047e72d5a2c3460057Brian Paul StoreTexImageFunc Store; 3056485105ed182e2e997b084f047e72d5a2c3460057Brian Paul} 3057485105ed182e2e997b084f047e72d5a2c3460057Brian Paultexstore_funcs[MESA_FORMAT_COUNT] = 3058485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{ 3059bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_NONE, NULL }, 3060485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGBA8888, _mesa_texstore_rgba8888 }, 3061485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGBA8888_REV, _mesa_texstore_rgba8888 }, 3062485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB8888, _mesa_texstore_argb8888 }, 3063485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB8888_REV, _mesa_texstore_argb8888 }, 306474d61d03b54d72217d463c248468cdcd09320efcBrian Paul { MESA_FORMAT_XRGB8888, _mesa_texstore_argb8888 }, 3065485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGB888, _mesa_texstore_rgb888 }, 3066485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_BGR888, _mesa_texstore_bgr888 }, 3067485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGB565, _mesa_texstore_rgb565 }, 3068485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGB565_REV, _mesa_texstore_rgb565 }, 3069485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB4444, _mesa_texstore_argb4444 }, 3070485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB4444_REV, _mesa_texstore_argb4444 }, 3071485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGBA5551, _mesa_texstore_rgba5551 }, 3072485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB1555, _mesa_texstore_argb1555 }, 3073485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_ARGB1555_REV, _mesa_texstore_argb1555 }, 3074485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_AL88, _mesa_texstore_al88 }, 3075485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_AL88_REV, _mesa_texstore_al88 }, 3076485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_RGB332, _mesa_texstore_rgb332 }, 3077485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_A8, _mesa_texstore_a8 }, 3078485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_L8, _mesa_texstore_a8 }, 3079485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_I8, _mesa_texstore_a8 }, 3080485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_CI8, _mesa_texstore_ci8 }, 3081485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_YCBCR, _mesa_texstore_ycbcr }, 3082485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_YCBCR_REV, _mesa_texstore_ycbcr }, 3083485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_Z24_S8, _mesa_texstore_z24_s8 }, 3084485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_S8_Z24, _mesa_texstore_s8_z24 }, 3085485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_Z16, _mesa_texstore_z16 }, 3086e4c700dbbf2a802f32bf62256c801105998c3729Brian Paul { MESA_FORMAT_X8_Z24, _mesa_texstore_x8_z24 }, 3087c6164ff155189007c02aabb31549f5f4dc767d1bJosé Fonseca { MESA_FORMAT_Z24_X8, _mesa_texstore_z24_x8 }, 3088485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_Z32, _mesa_texstore_z32 }, 3089485105ed182e2e997b084f047e72d5a2c3460057Brian Paul { MESA_FORMAT_S8, NULL/*_mesa_texstore_s8*/ }, 3090bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGB8, _mesa_texstore_srgb8 }, 3091bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGBA8, _mesa_texstore_srgba8 }, 3092bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SARGB8, _mesa_texstore_sargb8 }, 3093bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SL8, _mesa_texstore_sl8 }, 3094bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SLA8, _mesa_texstore_sla8 }, 3095bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGB_DXT1, _mesa_texstore_rgb_dxt1 }, 3096bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGBA_DXT1, _mesa_texstore_rgba_dxt1 }, 3097bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGBA_DXT3, _mesa_texstore_rgba_dxt3 }, 3098bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SRGBA_DXT5, _mesa_texstore_rgba_dxt5 }, 3099bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGB_FXT1, _mesa_texstore_rgb_fxt1 }, 3100bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_FXT1, _mesa_texstore_rgba_fxt1 }, 3101bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGB_DXT1, _mesa_texstore_rgb_dxt1 }, 3102bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_DXT1, _mesa_texstore_rgba_dxt1 }, 3103bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_DXT3, _mesa_texstore_rgba_dxt3 }, 3104bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_DXT5, _mesa_texstore_rgba_dxt5 }, 3105bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_FLOAT32, _mesa_texstore_rgba_float32 }, 3106bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGBA_FLOAT16, _mesa_texstore_rgba_float16 }, 3107bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGB_FLOAT32, _mesa_texstore_rgba_float32 }, 3108bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_RGB_FLOAT16, _mesa_texstore_rgba_float16 }, 3109bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 }, 3110bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 }, 3111bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_LUMINANCE_FLOAT32, _mesa_texstore_rgba_float32 }, 3112bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_LUMINANCE_FLOAT16, _mesa_texstore_rgba_float16 }, 3113bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32, _mesa_texstore_rgba_float32 }, 3114bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16, _mesa_texstore_rgba_float16 }, 3115bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_INTENSITY_FLOAT32, _mesa_texstore_rgba_float32 }, 3116bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_INTENSITY_FLOAT16, _mesa_texstore_rgba_float16 }, 3117bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_DUDV8, _mesa_texstore_dudv8 }, 3118bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SIGNED_RGBA8888, _mesa_texstore_signed_rgba8888 }, 3119bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul { MESA_FORMAT_SIGNED_RGBA8888_REV, _mesa_texstore_signed_rgba8888 }, 3120c13b9a141d77845517bf7cab20cff6115c31e67dBrian Paul { MESA_FORMAT_SIGNED_RGBA_16, NULL }, 3121485105ed182e2e997b084f047e72d5a2c3460057Brian Paul}; 3122485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3123485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3124920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wustatic GLboolean 3125920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu_mesa_texstore_null(TEXSTORE_PARAMS) 3126920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu{ 3127920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) ctx; (void) dims; 3128920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) baseInternalFormat; 3129920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstFormat; 3130920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstAddr; 3131920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstXoffset; (void) dstYoffset; (void) dstZoffset; 3132920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) dstRowStride; (void) dstImageOffsets; 3133920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcWidth; (void) srcHeight; (void) srcDepth; 3134920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcFormat; (void) srcType; 3135920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcAddr; 3136920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu (void) srcPacking; 3137920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 3138920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu /* should never happen */ 3139920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu _mesa_problem(NULL, "_mesa_texstore_null() is called"); 3140920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu return GL_FALSE; 3141920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu} 3142920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 3143920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 3144485105ed182e2e997b084f047e72d5a2c3460057Brian Paul/** 3145485105ed182e2e997b084f047e72d5a2c3460057Brian Paul * Return the StoreTexImageFunc pointer to store an image in the given format. 3146485105ed182e2e997b084f047e72d5a2c3460057Brian Paul */ 3147e2e7bd6c1f979179e6840cf0e8db72fc72751650Brian Paulstatic StoreTexImageFunc 3148485105ed182e2e997b084f047e72d5a2c3460057Brian Paul_mesa_get_texstore_func(gl_format format) 3149485105ed182e2e997b084f047e72d5a2c3460057Brian Paul{ 3150bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul#ifdef DEBUG 31511f1bfe8cb5c74ee8708fb717a19d8389c9fadb80Brian Paul GLuint i; 3152485105ed182e2e997b084f047e72d5a2c3460057Brian Paul for (i = 0; i < MESA_FORMAT_COUNT; i++) { 3153bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul ASSERT(texstore_funcs[i].Name == i); 3154485105ed182e2e997b084f047e72d5a2c3460057Brian Paul } 3155bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul#endif 3156bd00a7fa4bb4bb71cd2eaf7ebb6749a709b5fdb9Brian Paul ASSERT(texstore_funcs[format].Name == format); 3157920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu 3158920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu if (texstore_funcs[format].Store) 3159920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu return texstore_funcs[format].Store; 3160920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu else 3161920f023e8b3a5c2af0877530dc1707d2e50c5d4bChia-I Wu return _mesa_texstore_null; 3162485105ed182e2e997b084f047e72d5a2c3460057Brian Paul} 3163485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3164485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 3165660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul/** 3166660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Store user data into texture memory. 3167660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul * Called via glTex[Sub]Image1/2/3D() 3168660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul */ 3169660ca9c5a23240abca084089a626d4a94ef0799fBrian PaulGLboolean 3170660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul_mesa_texstore(TEXSTORE_PARAMS) 3171660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul{ 3172660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul StoreTexImageFunc storeImage; 3173660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul GLboolean success; 3174660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 31751f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul storeImage = _mesa_get_texstore_func(dstFormat); 3176660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 3177660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul success = storeImage(ctx, dims, baseInternalFormat, 3178660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul dstFormat, dstAddr, dstXoffset, dstYoffset, dstZoffset, 3179660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul dstRowStride, dstImageOffsets, 3180660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul srcWidth, srcHeight, srcDepth, 3181660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul srcFormat, srcType, srcAddr, srcPacking); 3182660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul return success; 3183660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul} 3184660ca9c5a23240abca084089a626d4a94ef0799fBrian Paul 3185485105ed182e2e997b084f047e72d5a2c3460057Brian Paul 31867a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul/** 3187c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Check if an unpack PBO is active prior to fetching a texture image. 3188c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * If so, do bounds checking and map the buffer into main memory. 3189c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Any errors detected will be recorded. 319071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell * The caller _must_ call _mesa_unmap_teximage_pbo() too! 31917a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul */ 319271699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellconst GLvoid * 319371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell_mesa_validate_pbo_teximage(GLcontext *ctx, GLuint dimensions, 319471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLsizei width, GLsizei height, GLsizei depth, 319571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell GLenum format, GLenum type, const GLvoid *pixels, 319671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const struct gl_pixelstore_attrib *unpack, 319771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell const char *funcName) 31987a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul{ 3199c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul GLubyte *buf; 3200c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 3201434ec3ada841915a00ffc23f699401eb3e7b37eeBrian Paul if (!_mesa_is_bufferobj(unpack->BufferObj)) { 32027a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul /* no PBO */ 32037a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return pixels; 32047a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul } 320560909388ab136d849d99eab49e782a53772a618fBrian Paul if (!_mesa_validate_pbo_access(dimensions, unpack, width, height, depth, 320660909388ab136d849d99eab49e782a53772a618fBrian Paul format, type, pixels)) { 3207c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(invalid PBO access"); 3208c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul return NULL; 32097a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul } 3210c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 3211a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul buf = (GLubyte *) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, 3212a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul GL_READ_ONLY_ARB, unpack->BufferObj); 3213c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul if (!buf) { 3214c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(PBO is mapped"); 3215c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul return NULL; 3216c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul } 3217c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 3218c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul return ADD_POINTERS(buf, pixels); 32197a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul} 32207a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 32217a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 32227a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul/** 3223c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Check if an unpack PBO is active prior to fetching a compressed texture 3224c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * image. 3225c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * If so, do bounds checking and map the buffer into main memory. 3226c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * Any errors detected will be recorded. 322771699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell * The caller _must_ call _mesa_unmap_teximage_pbo() too! 32287a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul */ 322971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellconst GLvoid * 323071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell_mesa_validate_pbo_compressed_teximage(GLcontext *ctx, 3231c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul GLsizei imageSize, const GLvoid *pixels, 3232c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul const struct gl_pixelstore_attrib *packing, 3233c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul const char *funcName) 32347a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul{ 3235c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul GLubyte *buf; 3236c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 3237434ec3ada841915a00ffc23f699401eb3e7b37eeBrian Paul if (!_mesa_is_bufferobj(packing->BufferObj)) { 32387a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul /* not using a PBO - return pointer unchanged */ 32397a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return pixels; 32407a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul } 3241c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul if ((const GLubyte *) pixels + imageSize > 3242f285f0d8f60adafdfba5c1f0563b81c68bd398d3Brian Paul ((const GLubyte *) 0) + packing->BufferObj->Size) { 3243c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul /* out of bounds read! */ 3244c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(invalid PBO access"); 3245c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul return NULL; 3246c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul } 3247c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 3248a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul buf = (GLubyte*) ctx->Driver.MapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, 3249a760ccf6d8a1f94d505b4c211ff4c30bc1d325a8Brian Paul GL_READ_ONLY_ARB, packing->BufferObj); 3250c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul if (!buf) { 3251c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, funcName, "(PBO is mapped"); 3252c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul return NULL; 32537a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul } 3254c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 3255c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul return ADD_POINTERS(buf, pixels); 32567a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul} 32577a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 32587a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 3259c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul/** 3260c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * This function must be called after either of the validate_pbo_*_teximage() 3261c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul * functions. It unmaps the PBO buffer if it was mapped earlier. 3262c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul */ 326371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwellvoid 3264c039af165d5919008c6df599795951f85dea164dBrian Paul_mesa_unmap_teximage_pbo(GLcontext *ctx, 3265c039af165d5919008c6df599795951f85dea164dBrian Paul const struct gl_pixelstore_attrib *unpack) 3266c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul{ 3267434ec3ada841915a00ffc23f699401eb3e7b37eeBrian Paul if (_mesa_is_bufferobj(unpack->BufferObj)) { 3268c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul ctx->Driver.UnmapBuffer(ctx, GL_PIXEL_UNPACK_BUFFER_EXT, 3269c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul unpack->BufferObj); 3270c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul } 3271c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul} 3272c0ebc4931a003b7b14e92c3b537b6ba76259507cBrian Paul 327389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3274b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul/** Return texture size in bytes */ 3275b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paulstatic GLuint 3276b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paultexture_size(const struct gl_texture_image *texImage) 3277da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul{ 327832aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul GLuint sz = _mesa_format_image_size(texImage->TexFormat, texImage->Width, 327932aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul texImage->Height, texImage->Depth); 3280b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul return sz; 3281da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul} 3282da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul 3283da9f65268db5d0468f91860d9ef9f244587c7f48Brian Paul 3284b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul/** Return row stride in bytes */ 3285b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paulstatic GLuint 3286b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paultexture_row_stride(const struct gl_texture_image *texImage) 32875999c5b620236fb6a996cf56759aec31f01c126bBrian Paul{ 328882bcc1c5d27b825db7f002c3c183bd1dc7833438Brian Paul GLuint stride = _mesa_format_row_stride(texImage->TexFormat, 3289b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Width); 3290b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul return stride; 32915999c5b620236fb6a996cf56759aec31f01c126bBrian Paul} 32925999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 32935999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 32945999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 3295ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul/** 329689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexImage1D() 3297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul * and Driver.CopyTexImage1D(). 32986b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d() 3299ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul * Note that the width may not be the actual texture width since it may 3300ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul * be changed by convolution w/ GL_REDUCE. The texImage->Width field will 3301ea6ddcbe0e4a0049ee8b9d244d86b6981fc6438bBrian Paul * have the actual texture size. 33028e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 33038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 33048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_teximage1d(GLcontext *ctx, GLenum target, GLint level, 33058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 33068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint border, 33078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const GLvoid *pixels, 33088e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 33098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 33108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 33118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 331232aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul GLuint sizeInBytes; 3313a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 33148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 33158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul /* allocate memory */ 3316b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul sizeInBytes = texture_size(texImage); 33174cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul texImage->Data = _mesa_alloc_texmemory(sizeInBytes); 33187d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul if (!texImage->Data) { 33197d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); 33207d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 33217d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 33228e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 3323e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type, 3324e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexImage1D"); 33256b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul if (!pixels) { 33266b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul /* Note: we check for a NULL image pointer here, _after_ we allocated 33276b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * memory for the texture. That's what the GL spec calls for. 33286b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul */ 332989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 33306b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul } 33316b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul else { 3332b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLint dstRowStride = 0; 3333b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLboolean success = _mesa_texstore(ctx, 1, texImage->_BaseFormat, 3334b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->TexFormat, 3335b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Data, 3336b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 3337b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul dstRowStride, 3338b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->ImageOffsets, 3339b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul width, 1, 1, 3340b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul format, type, pixels, packing); 3341f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!success) { 3342f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); 3343f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3344f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3345f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul 334671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 33478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 33488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 33498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 33506b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/** 335189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexImage2D() 335289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexImage2D(). 33536b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * 3354b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * This function is oriented toward storing images in main memory, rather 3355b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * than VRAM. Device driver's can easily plug in their own replacement. 3356b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * 3357b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * Note: width and height may be pre-convolved dimensions, but 3358b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * texImage->Width and texImage->Height will be post-convolved dimensions. 33598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 33608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 33618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_teximage2d(GLcontext *ctx, GLenum target, GLint level, 33628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 33638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint border, 33648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 33658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 33668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 33678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 33688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 336932aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul GLuint sizeInBytes; 3370a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 33718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 33728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul /* allocate memory */ 3373b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul sizeInBytes = texture_size(texImage); 33744cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul texImage->Data = _mesa_alloc_texmemory(sizeInBytes); 33757d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul if (!texImage->Data) { 33767d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); 33777d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 33787d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 33798e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 338071699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type, 3381e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexImage2D"); 33826b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul if (!pixels) { 33836b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul /* Note: we check for a NULL image pointer here, _after_ we allocated 33846b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * memory for the texture. That's what the GL spec calls for. 33856b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul */ 338689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 33876b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul } 33886b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul else { 3389b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLint dstRowStride = texture_row_stride(texImage); 3390b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLboolean success = _mesa_texstore(ctx, 2, texImage->_BaseFormat, 3391b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->TexFormat, 3392b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Data, 3393b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 3394b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul dstRowStride, 3395b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->ImageOffsets, 3396b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul width, height, 1, 3397b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul format, type, pixels, packing); 3398f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!success) { 3399f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); 3400f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3401f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3402f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul 340371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 34048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 34058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 34068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 34078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 34086b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul/** 340989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexImage3D() 341089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexImage3D(). 34116b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * \sa _mesa_store_teximage2d() 34128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 34138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 34148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_teximage3d(GLcontext *ctx, GLenum target, GLint level, 34158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 34168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, GLint border, 34178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 34188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 34198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 34208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 34218e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 342232aa40eee46fd0b15f3873069f2440ea2dd75408Brian Paul GLuint sizeInBytes; 3423a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 34248e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 34258e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul /* allocate memory */ 3426b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul sizeInBytes = texture_size(texImage); 34274cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul texImage->Data = _mesa_alloc_texmemory(sizeInBytes); 34287d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul if (!texImage->Data) { 34297d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D"); 34307d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul return; 34317d58f44f73be59bd3583e6dfeedf56c43f7fbd55Brian Paul } 34328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 3433e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format, 3434e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul type, pixels, packing, "glTexImage3D"); 34356b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul if (!pixels) { 34366b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul /* Note: we check for a NULL image pointer here, _after_ we allocated 34376b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul * memory for the texture. That's what the GL spec calls for. 34386b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul */ 343989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 34406b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul } 34416b6c96bdeb580052cb9fa3831f1cd574f0e85728Brian Paul else { 3442b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLint dstRowStride = texture_row_stride(texImage); 3443b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLboolean success = _mesa_texstore(ctx, 3, texImage->_BaseFormat, 3444b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->TexFormat, 3445b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Data, 3446b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul 0, 0, 0, /* dstX/Y/Zoffset */ 3447b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul dstRowStride, 3448b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->ImageOffsets, 3449b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul width, height, depth, 3450b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul format, type, pixels, packing); 3451f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!success) { 3452f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D"); 3453f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3454f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3455f3b85c983f469875ac76081a61539a6c7b26777cBrian Paul 345671699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 34578e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 34588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 34598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 34608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 34618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 34628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 346389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage1D() 346489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage1D(). 34658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 34668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 34678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_texsubimage1d(GLcontext *ctx, GLenum target, GLint level, 34688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint width, 34698e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 34708e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 34718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 34728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 34738e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 3474b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 3475e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 1, width, 1, 1, format, type, 3476e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexSubImage1D"); 34777a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!pixels) 34787a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 34797a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 3480f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul { 3481b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul const GLint dstRowStride = 0; 3482b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLboolean success = _mesa_texstore(ctx, 1, texImage->_BaseFormat, 3483b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->TexFormat, 3484b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Data, 3485b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul xoffset, 0, 0, /* offsets */ 3486b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul dstRowStride, 3487b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->ImageOffsets, 3488b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul width, 1, 1, 3489b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul format, type, pixels, packing); 3490f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!success) { 3491f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage1D"); 3492f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3493f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 34943893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul 349571699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 34968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 34978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 34988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 349989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3500f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul/** 350189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the software fallback for Driver.TexSubImage2D() 350289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage2D(). 35038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 35048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 35058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_texsubimage2d(GLcontext *ctx, GLenum target, GLint level, 35068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint yoffset, 35078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, 35088e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 35098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 35108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 35118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 35128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 3513b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 351471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell pixels = _mesa_validate_pbo_teximage(ctx, 2, width, height, 1, format, type, 3515e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels, packing, "glTexSubImage2D"); 35167a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!pixels) 35177a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 35187a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 3519f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul { 3520b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLint dstRowStride = texture_row_stride(texImage); 3521b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLboolean success = _mesa_texstore(ctx, 2, texImage->_BaseFormat, 3522b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->TexFormat, 3523b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Data, 3524b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul xoffset, yoffset, 0, 3525b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul dstRowStride, 3526b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->ImageOffsets, 3527b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul width, height, 1, 3528b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul format, type, pixels, packing); 3529f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!success) { 3530f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage2D"); 3531f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3532f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 35333893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul 353471699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 35358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 35368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 35378e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 35388e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 35398e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * This is the software fallback for Driver.TexSubImage3D(). 354089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * and Driver.CopyTexSubImage3D(). 35418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 35428e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 35438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_texsubimage3d(GLcontext *ctx, GLenum target, GLint level, 35448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 35458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, 35468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum format, GLenum type, const void *pixels, 35478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_pixelstore_attrib *packing, 35488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 35498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 35508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 3551b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 3552e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul pixels = _mesa_validate_pbo_teximage(ctx, 3, width, height, depth, format, 3553e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul type, pixels, packing, 3554e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul "glTexSubImage3D"); 3555f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!pixels) 3556f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return; 3557f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3558f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul { 3559b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLint dstRowStride = texture_row_stride(texImage); 3560b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul GLboolean success = _mesa_texstore(ctx, 3, texImage->_BaseFormat, 3561b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->TexFormat, 3562b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->Data, 3563b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul xoffset, yoffset, zoffset, 3564b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul dstRowStride, 3565b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul texImage->ImageOffsets, 3566b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul width, height, depth, 3567b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul format, type, pixels, packing); 3568f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!success) { 3569f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexSubImage3D"); 3570f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3571f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 35728f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul 357371699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, packing); 35748e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 35758e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 35768e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 35772aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul/* 35788e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage1D() 35798e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 35808e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 35818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_compressed_teximage1d(GLcontext *ctx, GLenum target, GLint level, 35828e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 35838e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint border, 35848e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLsizei imageSize, const GLvoid *data, 35858e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 35868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 35878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 358889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* this space intentionally left blank */ 3589a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 3590a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 3591a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) internalFormat; 3592a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) border; 3593a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 3594a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 3595a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 35968e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 35978e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 35988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 35998e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 3600b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul/** 36018e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage2D() 36028e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 36038e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 36048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_compressed_teximage2d(GLcontext *ctx, GLenum target, GLint level, 36058e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 36068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint border, 36078e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLsizei imageSize, const GLvoid *data, 36088e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 36098e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 36108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 3611a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) height; (void) border; 3612a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul 361389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* This is pretty simple, basically just do a memcpy without worrying 361489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * about the usual image unpacking or image transfer operations. 36158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 361689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texObj); 361789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage); 361889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Width > 0); 361989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Height > 0); 362089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Depth == 1); 362189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ASSERT(texImage->Data == NULL); /* was freed in glCompressedTexImage2DARB */ 362289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 362389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* allocate storage */ 36244cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul texImage->Data = _mesa_alloc_texmemory(imageSize); 362589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (!texImage->Data) { 362689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2DARB"); 362789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 362889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 362989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3630e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data, 3631e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul &ctx->Unpack, 3632e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul "glCompressedTexImage2D"); 36337a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!data) 36347a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 36357a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 363689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* copy the data */ 363789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul MEMCPY(texImage->Data, data, imageSize); 36388f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul 363971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack); 36408e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 36418e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 36428e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 36438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 36448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul/* 36458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Fallback for Driver.CompressedTexImage3D() 36468e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul */ 36478e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulvoid 36488e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_store_compressed_teximage3d(GLcontext *ctx, GLenum target, GLint level, 36498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint internalFormat, 36508e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint width, GLint height, GLint depth, 36518e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint border, 36528e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLsizei imageSize, const GLvoid *data, 36538e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_object *texObj, 36548e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul struct gl_texture_image *texImage) 36558e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul{ 365689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* this space intentionally left blank */ 3657a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 3658a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 3659a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) internalFormat; 3660a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) height; (void) depth; 3661a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) border; 3662a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 3663a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 3664a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 36658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul} 36668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 36678e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 36688e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 366989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 367089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage1D() 3671e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul */ 3672e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paulvoid 367389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul_mesa_store_compressed_texsubimage1d(GLcontext *ctx, GLenum target, 367489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint level, 367589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLsizei width, 367689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 367789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei imageSize, const GLvoid *data, 367889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_object *texObj, 367989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage) 3680e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul{ 36815999c5b620236fb6a996cf56759aec31f01c126bBrian Paul /* there are no compressed 1D texture formats yet */ 3682a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 3683a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 3684a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) xoffset; (void) width; 3685a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) format; 3686a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 3687a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 3688a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 3689e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul} 3690e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 3691e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 369289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 369389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage2D() 369489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 369589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid 369689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul_mesa_store_compressed_texsubimage2d(GLcontext *ctx, GLenum target, 369789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint level, 369889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLint yoffset, 369989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei width, GLsizei height, 370089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 370189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei imageSize, const GLvoid *data, 370289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_object *texObj, 370389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage) 370489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 370589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint bytesPerRow, destRowStride, srcRowStride; 370689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint i, rows; 370789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLubyte *dest; 370889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul const GLubyte *src; 37091f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul const gl_format texFormat = texImage->TexFormat; 3710bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul const GLint destWidth = texImage->Width; 3711d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul GLuint bw, bh; 37125999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 3713d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul _mesa_get_format_block_size(texFormat, &bw, &bh); 37145999c5b620236fb6a996cf56759aec31f01c126bBrian Paul 3715d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul (void) level; 3716a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) format; 371789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 371889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* these should have been caught sooner */ 3719d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((width % bw) == 0 || width == 2 || width == 1); 3720d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((height % bh) == 0 || height == 2 || height == 1); 3721d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((xoffset % bw) == 0); 3722d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul ASSERT((yoffset % bh) == 0); 372389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3724b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* get pointer to src pixels (may be in a pbo which we'll map here) */ 3725e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data, 3726e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul &ctx->Unpack, 3727e4b2356c07d31fbeeabb13b2fb47db703b473080Brian Paul "glCompressedTexSubImage2D"); 37287a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul if (!data) 37297a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul return; 37307a6b71ef2944bae1718e8167b2faaceb8422071cBrian Paul 37312594168e9f3cdc4ac53c925486491167837cda30Brian Paul srcRowStride = _mesa_format_row_stride(texFormat, width); 373289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul src = (const GLubyte *) data; 373389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 37342594168e9f3cdc4ac53c925486491167837cda30Brian Paul destRowStride = _mesa_format_row_stride(texFormat, destWidth); 373589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul dest = _mesa_compressed_image_address(xoffset, yoffset, 0, 3736bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul texFormat, destWidth, 3737a5467697336f201abee19cba1521be80e5c87d3bBrian Paul (GLubyte *) texImage->Data); 373889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3739bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul bytesPerRow = srcRowStride; /* bytes per row of blocks */ 3740d255aaf54f9a4398247698408bd45698b1cefe58Brian Paul rows = height / bh; /* rows in blocks */ 374189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3742bea245ac2fecc312caec8f4af53174e4fb180103Brian Paul /* copy rows of blocks */ 374389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul for (i = 0; i < rows; i++) { 374489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul MEMCPY(dest, src, bytesPerRow); 374589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul dest += destRowStride; 374689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul src += srcRowStride; 374789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 37488f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul 374971699df7de8cc732caf6d4b8adb4ab2d1f0c7c1fKeith Whitwell _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack); 375089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 375189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 375289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 375389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 375489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Fallback for Driver.CompressedTexSubImage3D() 375589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 375689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulvoid 375789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul_mesa_store_compressed_texsubimage3d(GLcontext *ctx, GLenum target, 375889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint level, 375989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 376089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei width, GLsizei height, GLsizei depth, 376189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, 376289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei imageSize, const GLvoid *data, 376389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_object *texObj, 376489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage) 376589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 37665999c5b620236fb6a996cf56759aec31f01c126bBrian Paul /* there are no compressed 3D texture formats yet */ 3767a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) ctx; 3768a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) target; (void) level; 3769a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) xoffset; (void) yoffset; (void) zoffset; 3770a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) width; (void) height; (void) depth; 3771a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) format; 3772a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) imageSize; (void) data; 3773a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texObj; 3774a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) texImage; 377589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 3776