1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Version: 7.5 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (c) 2008-2009 VMware, Inc. 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Authors: 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Brian Paul 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The GL texture image functions in teximage.c basically just do 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * error checking and data structure allocation. They in turn call 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * device driver functions which actually copy/convert/store the user's 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture image data. 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * However, most device drivers will be able to use the fallback functions 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in this file. That is, most drivers will have the following bit of 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * code: 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ctx->Driver.TexImage = _mesa_store_teximage; 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ctx->Driver.TexSubImage = _mesa_store_texsubimage; 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * etc... 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texture image processing is actually kind of complicated. We have to do: 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Format/type conversions 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pixel unpacking 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * pixel transfer (scale, bais, lookup, etc) 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * These functions can handle most everything, including processing full 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * images and sub-images. 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h" 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "bufferobj.h" 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "colormac.h" 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "format_pack.h" 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "image.h" 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "macros.h" 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mipmap.h" 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mfeatures.h" 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h" 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pack.h" 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "pbo.h" 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h" 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress.h" 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress_fxt1.h" 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress_rgtc.h" 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress_s3tc.h" 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress_etc.h" 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "teximage.h" 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texstore.h" 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "enums.h" 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glformats.h" 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "../../gallium/auxiliary/util/u_format_rgb9e5.h" 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "../../gallium/auxiliary/util/u_format_r11g11b10f.h" 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum { 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ZERO = 4, 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ONE = 5 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texture image storage function. 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtypedef GLboolean (*StoreTexImageFunc)(TEXSTORE_PARAMS); 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return GL_TRUE if the given image format is one that be converted 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to another format by swizzling. 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcan_swizzle(GLenum logicalBaseFormat) 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (logicalBaseFormat) { 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY: 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED: 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN: 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE: 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR: 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA: 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ABGR_EXT: 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG: 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgenum { 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_LUMINANCE = 0, 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_ALPHA, 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_INTENSITY, 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_LUMINANCE_ALPHA, 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_RGB, 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_RGBA, 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_RED, 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_GREEN, 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_BLUE, 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_BGR, 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_BGRA, 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_ABGR, 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_RG, 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAX_IDX 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAP1(x) MAP4(x, ZERO, ZERO, ZERO) 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAP2(x,y) MAP4(x, y, ZERO, ZERO) 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAP3(x,y,z) MAP4(x, y, z, ZERO) 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define MAP4(x,y,z,w) { x, y, z, w, ZERO, ONE } 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const struct { 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte format_idx; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte to_rgba[6]; 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte from_rgba[6]; 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} mappings[MAX_IDX] = 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_LUMINANCE, 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(0,0,0,ONE), 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP1(0) 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_ALPHA, 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(ZERO, ZERO, ZERO, 0), 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP1(3) 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_INTENSITY, 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(0, 0, 0, 0), 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP1(0), 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_LUMINANCE_ALPHA, 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(0,0,0,1), 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP2(0,3) 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_RGB, 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(0,1,2,ONE), 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP3(0,1,2) 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_RGBA, 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(0,1,2,3), 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(0,1,2,3), 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_RED, 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(0, ZERO, ZERO, ONE), 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP1(0), 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_GREEN, 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(ZERO, 0, ZERO, ONE), 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP1(1), 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_BLUE, 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(ZERO, ZERO, 0, ONE), 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP1(2), 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_BGR, 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(2,1,0,ONE), 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP3(2,1,0) 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_BGRA, 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(2,1,0,3), 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(2,1,0,3) 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_ABGR, 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(3,2,1,0), 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(3,2,1,0) 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org IDX_RG, 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP4(0, 1, ZERO, ONE), 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org MAP2(0, 1) 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }, 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Convert a GL image format enum to an IDX_* value (see above). 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic int 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_map_idx(GLenum value) 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (value) { 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: return IDX_LUMINANCE; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: return IDX_ALPHA; 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY: return IDX_INTENSITY; 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: return IDX_LUMINANCE_ALPHA; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: return IDX_RGB; 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: return IDX_RGBA; 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED: return IDX_RED; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_GREEN: return IDX_GREEN; 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BLUE: return IDX_BLUE; 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGR: return IDX_BGR; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA: return IDX_BGRA; 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ABGR_EXT: return IDX_ABGR; 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG: return IDX_RG; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "Unexpected inFormat"); 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When promoting texture formats (see below) we need to compute the 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mapping of dest components back to source components. 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function does that. 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param inFormat the incoming format of the texture 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param outFormat the final texture format 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return map[6] a full 6-component map 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompute_component_mapping(GLenum inFormat, GLenum outFormat, 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *map) 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int inFmt = get_map_idx(inFormat); 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const int outFmt = get_map_idx(outFormat); 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *in2rgba = mappings[inFmt].to_rgba; 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *rgba2out = mappings[outFmt].from_rgba; 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int i; 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[i] = in2rgba[rgba2out[i]]; 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[ZERO] = ZERO; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[ONE] = ONE; 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("from %x/%s to %x/%s map %d %d %d %d %d %d\n", 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org inFormat, _mesa_lookup_enum_by_nr(inFormat), 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org outFormat, _mesa_lookup_enum_by_nr(outFormat), 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[0], 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[1], 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[2], 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[3], 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[4], 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[5]); 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Make a temporary (color) texture image with GLfloat components. 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Apply all needed pixel unpacking and pixel transfer operations. 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that there are both logicalBaseFormat and textureBaseFormat parameters. 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Suppose the user specifies GL_LUMINANCE as the internal texture format 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * but the graphics hardware doesn't support luminance textures. So, we might 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * use an RGB hardware format instead. 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If logicalBaseFormat != textureBaseFormat we have some extra work to do. 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx the rendering context 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dims image dimensions: 1, 2 or 3 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param logicalBaseFormat basic texture derived from the user's 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * internal texture format value 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param textureBaseFormat the actual basic format of the texture 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcWidth source image width 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcHeight source image height 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcDepth source image depth 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcFormat source image format 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcType source image type 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcAddr source image address 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcPacking source image pixel packing 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return resulting image with format = textureBaseFormat and type = GLfloat. 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLfloat * 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_make_temp_float_image(struct gl_context *ctx, GLuint dims, 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum logicalBaseFormat, 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum textureBaseFormat, 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint srcWidth, GLint srcHeight, GLint srcDepth, 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcFormat, GLenum srcType, 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *srcAddr, 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *srcPacking, 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbitfield transferOps) 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *tempImage; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint components = _mesa_components_in_format(logicalBaseFormat); 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcStride = 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *dst; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dims >= 1 && dims <= 3); 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(logicalBaseFormat == GL_RGBA || 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_RGB || 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_RG || 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_RED || 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_LUMINANCE_ALPHA || 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_LUMINANCE || 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_ALPHA || 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_INTENSITY || 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_DEPTH_COMPONENT); 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(textureBaseFormat == GL_RGBA || 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_RGB || 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_RG || 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_RED || 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_LUMINANCE_ALPHA || 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_LUMINANCE || 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_ALPHA || 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_INTENSITY || 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_DEPTH_COMPONENT); 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tempImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * components * sizeof(GLfloat)); 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst = tempImage; 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img, 0, 0); 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_color_span_float(ctx, srcWidth, logicalBaseFormat, 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst, srcFormat, srcType, src, 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, transferOps); 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += srcWidth * components; 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcStride; 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (logicalBaseFormat != textureBaseFormat) { 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* more work */ 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint texComponents = _mesa_components_in_format(textureBaseFormat); 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLfloat *newImage; 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i, n; 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte map[6]; 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_LUMINANCE_ALPHA); 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The actual texture format should have at least as many components 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * as the logical texture format. 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(texComponents >= logComponents); 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newImage = (GLfloat *) malloc(srcWidth * srcHeight * srcDepth 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texComponents * sizeof(GLfloat)); 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!newImage) { 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(tempImage); 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org n = srcWidth * srcHeight * srcDepth; 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint k; 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (k = 0; k < texComponents; k++) { 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint j = map[k]; 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j == ZERO) 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newImage[i * texComponents + k] = 0.0F; 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (j == ONE) 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newImage[i * texComponents + k] = 1.0F; 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(tempImage); 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tempImage = newImage; 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tempImage; 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Make temporary image with uint pixel values. Used for unsigned 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * integer-valued textures. 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint * 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmake_temp_uint_image(struct gl_context *ctx, GLuint dims, 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum logicalBaseFormat, 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum textureBaseFormat, 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint srcWidth, GLint srcHeight, GLint srcDepth, 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcFormat, GLenum srcType, 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *srcAddr, 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *srcPacking) 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *tempImage; 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint components = _mesa_components_in_format(logicalBaseFormat); 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcStride = 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dims >= 1 && dims <= 3); 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(logicalBaseFormat == GL_RGBA || 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_RGB || 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_RG || 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_RED || 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_LUMINANCE_ALPHA || 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_LUMINANCE || 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_INTENSITY || 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_ALPHA); 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(textureBaseFormat == GL_RGBA || 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_RGB || 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_RG || 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_RED || 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_LUMINANCE_ALPHA || 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_LUMINANCE || 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_INTENSITY || 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_ALPHA); 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tempImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * components * sizeof(GLuint)); 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst = tempImage; 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img, 0, 0); 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_color_span_uint(ctx, srcWidth, logicalBaseFormat, 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst, srcFormat, srcType, src, 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += srcWidth * components; 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcStride; 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (logicalBaseFormat != textureBaseFormat) { 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* more work */ 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint texComponents = _mesa_components_in_format(textureBaseFormat); 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *newImage; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i, n; 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte map[6]; 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_LUMINANCE_ALPHA); 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The actual texture format should have at least as many components 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * as the logical texture format. 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(texComponents >= logComponents); 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newImage = (GLuint *) malloc(srcWidth * srcHeight * srcDepth 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texComponents * sizeof(GLuint)); 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!newImage) { 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(tempImage); 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org n = srcWidth * srcHeight * srcDepth; 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint k; 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (k = 0; k < texComponents; k++) { 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint j = map[k]; 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j == ZERO) 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newImage[i * texComponents + k] = 0; 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (j == ONE) 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newImage[i * texComponents + k] = 1; 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(tempImage); 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tempImage = newImage; 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tempImage; 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Make a temporary (color) texture image with GLubyte components. 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Apply all needed pixel unpacking and pixel transfer operations. 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that there are both logicalBaseFormat and textureBaseFormat parameters. 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Suppose the user specifies GL_LUMINANCE as the internal texture format 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * but the graphics hardware doesn't support luminance textures. So, we might 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * use an RGB hardware format instead. 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If logicalBaseFormat != textureBaseFormat we have some extra work to do. 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx the rendering context 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dims image dimensions: 1, 2 or 3 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param logicalBaseFormat basic texture derived from the user's 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * internal texture format value 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param textureBaseFormat the actual basic format of the texture 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcWidth source image width 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcHeight source image height 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcDepth source image depth 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcFormat source image format 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcType source image type 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcAddr source image address 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcPacking source image pixel packing 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return resulting image with format = textureBaseFormat and type = GLubyte. 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLubyte * 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_make_temp_ubyte_image(struct gl_context *ctx, GLuint dims, 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum logicalBaseFormat, 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum textureBaseFormat, 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint srcWidth, GLint srcHeight, GLint srcDepth, 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcFormat, GLenum srcType, 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *srcAddr, 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *srcPacking) 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint transferOps = ctx->_ImageTransferState; 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint components = _mesa_components_in_format(logicalBaseFormat); 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *tempImage, *dst; 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dims >= 1 && dims <= 3); 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(logicalBaseFormat == GL_RGBA || 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_RGB || 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_RG || 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_RED || 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_LUMINANCE_ALPHA || 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_LUMINANCE || 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_ALPHA || 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org logicalBaseFormat == GL_INTENSITY); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(textureBaseFormat == GL_RGBA || 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_RGB || 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_RG || 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_RED || 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_LUMINANCE_ALPHA || 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_LUMINANCE || 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_ALPHA || 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_INTENSITY); 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* unpack and transfer the source image */ 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tempImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * components * sizeof(GLubyte)); 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) { 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst = tempImage; 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcStride = 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src = 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img, 0, 0); 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_color_span_ubyte(ctx, srcWidth, logicalBaseFormat, dst, 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, src, srcPacking, 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org transferOps); 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += srcWidth * components; 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcStride; 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (logicalBaseFormat != textureBaseFormat) { 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* one more conversion step */ 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint texComponents = _mesa_components_in_format(textureBaseFormat); 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint logComponents = _mesa_components_in_format(logicalBaseFormat); 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *newImage; 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i, n; 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte map[6]; 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we only promote up to RGB, RGBA and LUMINANCE_ALPHA formats for now */ 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(textureBaseFormat == GL_RGB || textureBaseFormat == GL_RGBA || 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org textureBaseFormat == GL_LUMINANCE_ALPHA); 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The actual texture format should have at least as many components 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * as the logical texture format. 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(texComponents >= logComponents); 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newImage = (GLubyte *) malloc(srcWidth * srcHeight * srcDepth 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texComponents * sizeof(GLubyte)); 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!newImage) { 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(tempImage); 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_component_mapping(logicalBaseFormat, textureBaseFormat, map); 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org n = srcWidth * srcHeight * srcDepth; 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < n; i++) { 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint k; 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (k = 0; k < texComponents; k++) { 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint j = map[k]; 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (j == ZERO) 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newImage[i * texComponents + k] = 0; 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (j == ONE) 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newImage[i * texComponents + k] = 255; 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newImage[i * texComponents + k] = tempImage[i * logComponents + j]; 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(tempImage); 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tempImage = newImage; 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return tempImage; 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copy GLubyte pixels from <src> to <dst> with swizzling. 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dst destination pixels 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dstComponents number of color components in destination pixels 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param src source pixels 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param srcComponents number of color components in source pixels 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param map the swizzle mapping. map[X] says where to find the X component 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in the source image's pixels. For example, if the source image 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is GL_BGRA and X = red, map[0] yields 2. 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param count number of pixels to copy/swizzle. 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgswizzle_copy(GLubyte *dst, GLuint dstComponents, const GLubyte *src, 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint srcComponents, const GLubyte *map, GLuint count) 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define SWZ_CPY(dst, src, count, dstComps, srcComps) \ 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org do { \ 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; \ 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < count; i++) { \ 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint j; \ 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcComps == 4) { \ 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org COPY_4UBV(tmp, src); \ 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { \ 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < srcComps; j++) { \ 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp[j] = src[j]; \ 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcComps; \ 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < dstComps; j++) { \ 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[j] = tmp[map[j]]; \ 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstComps; \ 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } \ 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } while (0) 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte tmp[6]; 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp[ZERO] = 0x0; 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tmp[ONE] = 0xff; 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcComponents <= 4); 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstComponents <= 4); 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dstComponents) { 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (srcComponents) { 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 4, 4); 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 4, 3); 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 4, 2); 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 4, 1); 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (srcComponents) { 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 3, 4); 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 3, 3); 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 3, 2); 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 3, 1); 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (srcComponents) { 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 2, 4); 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 2, 3); 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 2, 2); 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 2, 1); 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (srcComponents) { 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 1, 4); 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 1, 3); 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 1, 2); 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org SWZ_CPY(dst, src, count, 1, 1); 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#undef SWZ_CPY 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const GLubyte map_identity[6] = { 0, 1, 2, 3, ZERO, ONE }; 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const GLubyte map_3210[6] = { 3, 2, 1, 0, ZERO, ONE }; 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mapping array depending on endianness. 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const GLubyte * 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtype_mapping( GLenum srcType ) 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (srcType) { 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return map_identity; 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8: 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_little_endian() ? map_3210 : map_identity; 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8_REV: 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_little_endian() ? map_identity : map_3210; 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For 1-byte/pixel formats (or 8_8_8_8 packed formats), return a 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mapping array depending on pixelstore byte swapping state. 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic const GLubyte * 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgbyteswap_mapping( GLboolean swapBytes, 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcType ) 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!swapBytes) 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return map_identity; 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (srcType) { 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BYTE: 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_BYTE: 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return map_identity; 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8: 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_UNSIGNED_INT_8_8_8_8_REV: 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return map_3210; 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Transfer a GLubyte texture image with component swizzling. 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_swizzle_ubyte_image(struct gl_context *ctx, 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint dimensions, 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcFormat, 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcType, 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum baseInternalFormat, 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *rgba2dst, 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint dstComponents, 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint dstRowStride, 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte **dstSlices, 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint srcWidth, GLint srcHeight, GLint srcDepth, 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *srcAddr, 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *srcPacking ) 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint srcComponents = _mesa_components_in_format(srcFormat); 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *srctype2ubyte, *swap; 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte map[4], src2base[6], base2rgba[6]; 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcRowStride = 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_row_stride(srcPacking, srcWidth, 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, GL_UNSIGNED_BYTE); 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcImageStride 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = _mesa_image_image_stride(srcPacking, srcWidth, srcHeight, srcFormat, 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_UNSIGNED_BYTE); 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *srcImage 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = (const GLubyte *) _mesa_image_address(dimensions, srcPacking, srcAddr, 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcFormat, 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_UNSIGNED_BYTE, 0, 0, 0); 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Translate from src->baseInternal->GL_RGBA->dst. This will 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * correctly deal with RGBA->RGB->RGBA conversions where the final 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A value must be 0xff regardless of the incoming alpha values. 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_component_mapping(srcFormat, baseInternalFormat, src2base); 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compute_component_mapping(baseInternalFormat, GL_RGBA, base2rgba); 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swap = byteswap_mapping(srcPacking->SwapBytes, srcType); 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srctype2ubyte = type_mapping(srcType); 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < 4; i++) 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org map[i] = srctype2ubyte[swap[src2base[base2rgba[rgba2dst[i]]]]]; 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* printf("map %d %d %d %d\n", map[0], map[1], map[2], map[3]); */ 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcComponents == dstComponents && 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRowStride == dstRowStride && 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRowStride == srcWidth * srcComponents && 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions < 3) { 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1 and 2D images only */ 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstImage = dstSlices[0]; 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle_copy(dstImage, dstComponents, srcImage, srcComponents, map, 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth * srcHeight); 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *srcRow = srcImage; 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org swizzle_copy(dstRow, dstComponents, srcRow, srcComponents, map, srcWidth); 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow += srcRowStride; 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcImage += srcImageStride; 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Teximage storage routine for when a simple memcpy will do. 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * No pixel transfer operations or special texel encodings allowed. 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1D, 2D and 3D images supported. 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmemcpy_texture(struct gl_context *ctx, 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint dimensions, 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format dstFormat, 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint dstRowStride, 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte **dstSlices, 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint srcWidth, GLint srcHeight, GLint srcDepth, 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum srcFormat, GLenum srcType, 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *srcAddr, 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *srcPacking) 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcRowStride = _mesa_image_row_stride(srcPacking, srcWidth, 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType); 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcImageStride = _mesa_image_image_stride(srcPacking, 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcFormat, srcType); 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *srcImage = (const GLubyte *) _mesa_image_address(dimensions, 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, srcAddr, srcWidth, srcHeight, srcFormat, srcType, 0, 0, 0); 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint bytesPerRow = srcWidth * texelBytes; 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstRowStride == srcRowStride && 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride == bytesPerRow) { 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* memcpy image by image */ 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img; 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstImage = dstSlices[img]; 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dstImage, srcImage, bytesPerRow * srcHeight); 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcImage += srcImageStride; 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* memcpy row by row */ 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *srcRow = srcImage; 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dstRow, srcRow, bytesPerRow); 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow += srcRowStride; 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcImage += srcImageStride; 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * General-case function for storing a color texture images with 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * components that can be represented with ubytes. Example destination 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture formats are MESA_FORMAT_ARGB888, ARGB4444, RGB565. 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstore_ubyte_texture(TEXSTORE_PARAMS) 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcRowStride = srcWidth * 4 * sizeof(GLubyte); 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *tempImage, *src; 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img; 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_RGBA, 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = tempImage; 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_pack_ubyte_rgba_rect(dstFormat, srcWidth, srcHeight, 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src, srcRowStride, 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstSlices[img], dstRowStride); 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcHeight * srcRowStride; 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(tempImage); 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a 32-bit integer or float depth component texture image. 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_z32(TEXSTORE_PARAMS) 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint depthScale = 0xffffffff; 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum dstType; 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) dims; 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_Z32 || 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_Z32_FLOAT); 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == sizeof(GLuint)); 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == MESA_FORMAT_Z32) 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstType = GL_UNSIGNED_INT; 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstType = GL_FLOAT; 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Pixel.DepthScale == 1.0f && 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Pixel.DepthBias == 0.0f && 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_DEPTH_COMPONENT && 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_DEPTH_COMPONENT && 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == dstType) { 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *src = _mesa_image_address(dims, srcPacking, 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_depth_span(ctx, srcWidth, 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstType, dstRow, 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthScale, srcType, src, srcPacking); 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a 24-bit integer depth component texture image. 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_x8_z24(TEXSTORE_PARAMS) 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint depthScale = 0xffffff; 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) dims; 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_X8_Z24); 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *src = _mesa_image_address(dims, srcPacking, 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_depth_span(ctx, srcWidth, 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_UNSIGNED_INT, (GLuint *) dstRow, 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthScale, srcType, src, srcPacking); 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a 24-bit integer depth component texture image. 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_z24_x8(TEXSTORE_PARAMS) 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint depthScale = 0xffffff; 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) dims; 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_Z24_X8); 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *src = _mesa_image_address(dims, srcPacking, 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dst = (GLuint *) dstRow; 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_depth_span(ctx, srcWidth, 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_UNSIGNED_INT, dst, 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthScale, srcType, src, srcPacking); 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth; i++) 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[i] <<= 8; 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a 16-bit integer depth component texture image. 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_z16(TEXSTORE_PARAMS) 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint depthScale = 0xffff; 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) dims; 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_Z16); 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == sizeof(GLushort)); 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Pixel.DepthScale == 1.0f && 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Pixel.DepthBias == 0.0f && 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_DEPTH_COMPONENT && 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_DEPTH_COMPONENT && 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT) { 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *src = _mesa_image_address(dims, srcPacking, 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, row, 0); 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dst16 = (GLushort *) dstRow; 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_depth_span(ctx, srcWidth, 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_UNSIGNED_SHORT, dst16, depthScale, 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, src, srcPacking); 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store an rgb565 or rgb565_rev texture image. 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgb565(TEXSTORE_PARAMS) 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_RGB565 || 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGB565_REV); 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB && 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!ctx->_ImageTransferState && 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB && 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGB && 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE && 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims == 2) { 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* do optimized tex store */ 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcRowStride = 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src = (const GLubyte *) 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, srcHeight, 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 0, 0, 0); 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dst = dstSlices[0]; 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint row, col; 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *srcUB = (const GLubyte *) src; 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dstUS = (GLushort *) dst; 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check for byteswapped format */ 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == MESA_FORMAT_RGB565) { 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUS[col] = PACK_COLOR_565( srcUB[0], srcUB[1], srcUB[2] ); 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcUB += 3; 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUS[col] = PACK_COLOR_565_REV( srcUB[0], srcUB[1], srcUB[2] ); 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcUB += 3; 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstRowStride; 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcRowStride; 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return store_ubyte_texture(ctx, dims, baseInternalFormat, 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, dstRowStride, dstSlices, 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, srcPacking); 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a texture in MESA_FORMAT_RGBA8888 or MESA_FORMAT_RGBA8888_REV. 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba8888(TEXSTORE_PARAMS) 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean littleEndian = _mesa_little_endian(); 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_RGBA8888 || 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGBA8888_REV || 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGBX8888 || 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGBX8888_REV); 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGBA && 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!ctx->_ImageTransferState && 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (srcType == GL_UNSIGNED_BYTE || 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8 || 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8_REV) && 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org can_swizzle(baseInternalFormat) && 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org can_swizzle(srcFormat)) { 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte dstmap[4]; 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dstmap - how to swizzle from RGBA to dst format: 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((littleEndian && (dstFormat == MESA_FORMAT_RGBA8888 || 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGBX8888)) || 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (!littleEndian && (dstFormat == MESA_FORMAT_RGBA8888_REV || 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGBX8888_REV))) { 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[3] = 0; 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[2] = 1; 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[1] = 2; 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 3; 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[3] = 3; 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[2] = 2; 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[1] = 1; 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 0; 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swizzle_ubyte_image(ctx, dims, 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap, 4, 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcAddr, 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return store_ubyte_texture(ctx, dims, baseInternalFormat, 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, dstRowStride, dstSlices, 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, srcPacking); 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_argb8888(TEXSTORE_PARAMS) 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean littleEndian = _mesa_little_endian(); 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_ARGB8888 || 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_ARGB8888_REV || 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_XRGB8888 || 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_XRGB8888_REV ); 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGBA && 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path (big endian) */ 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!ctx->_ImageTransferState && 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (dstFormat == MESA_FORMAT_ARGB8888 || 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_XRGB8888) && 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGB && 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (baseInternalFormat == GL_RGBA || 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB) && 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE) { 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int img, row, col; 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcRowStride = 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *d4 = (GLuint *) dstRow; 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d4[col] = PACK_COLOR_8888(0xff, 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow[col * 3 + RCOMP], 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow[col * 3 + GCOMP], 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow[col * 3 + BCOMP]); 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow += srcRowStride; 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!ctx->_ImageTransferState && 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_ARGB8888 && 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_ALPHA && 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGBA && 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE) { 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* special case of storing LA -> ARGB8888 */ 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int img, row, col; 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcRowStride = 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *srcRow = (const GLubyte *) 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_address(dims, srcPacking, srcAddr, srcWidth, 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcHeight, srcFormat, srcType, img, 0, 0); 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *d4 = (GLuint *) dstRow; 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte l = srcRow[col * 2 + 0], a = srcRow[col * 2 + 1]; 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d4[col] = PACK_COLOR_8888(a, l, l, l); 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow += srcRowStride; 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!ctx->_ImageTransferState && 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_ARGB8888 && 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA && 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGBA && 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE) { 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* same as above case, but src data has alpha too */ 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For some reason, streaming copies to write-combined regions 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * are extremely sensitive to the characteristics of how the 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * source data is retrieved. By reordering the source reads to 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * be in-order, the speed of this operation increases by half. 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Strangely the same isn't required for the RGB path, above. 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcRowStride = 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *d4 = (GLuint *) dstRow; 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org d4[col] = PACK_COLOR_8888(srcRow[col * 4 + ACOMP], 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow[col * 4 + RCOMP], 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow[col * 4 + GCOMP], 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow[col * 4 + BCOMP]); 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow += srcRowStride; 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!ctx->_ImageTransferState && 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (srcType == GL_UNSIGNED_BYTE || 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8 || 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_8_8_8_8_REV) && 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org can_swizzle(baseInternalFormat) && 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org can_swizzle(srcFormat)) { 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte dstmap[4]; 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dstmap - how to swizzle from RGBA to dst format: 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (littleEndian && dstFormat == MESA_FORMAT_XRGB8888) || 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) || 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV)) { 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[3] = 3; /* alpha */ 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[2] = 0; /* red */ 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[1] = 1; /* green */ 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 2; /* blue */ 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert((littleEndian && dstFormat == MESA_FORMAT_ARGB8888_REV) || 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (!littleEndian && dstFormat == MESA_FORMAT_ARGB8888) || 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (littleEndian && dstFormat == MESA_FORMAT_XRGB8888_REV) || 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (!littleEndian && dstFormat == MESA_FORMAT_XRGB8888)); 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[3] = 2; 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[2] = 1; 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[1] = 0; 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 3; 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swizzle_ubyte_image(ctx, dims, 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap, 4, 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstSlices, 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcAddr, 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return store_ubyte_texture(ctx, dims, baseInternalFormat, 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, dstRowStride, dstSlices, 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, srcPacking); 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgb888(TEXSTORE_PARAMS) 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_RGB888); 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 3); 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB && 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!ctx->_ImageTransferState && 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA && 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE) { 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* extract RGB from RGBA */ 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcRowStride = 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow[col * 3 + 0] = srcRow[col * 4 + BCOMP]; 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow[col * 3 + 2] = srcRow[col * 4 + RCOMP]; 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow += srcRowStride; 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!ctx->_ImageTransferState && 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE && 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org can_swizzle(baseInternalFormat) && 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org can_swizzle(srcFormat)) { 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte dstmap[4]; 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dstmap - how to swizzle from RGBA to dst format: 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 2; 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[1] = 1; 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[2] = 0; 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[3] = ONE; /* ? */ 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swizzle_ubyte_image(ctx, dims, 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap, 3, 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcAddr, 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return store_ubyte_texture(ctx, dims, baseInternalFormat, 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, dstRowStride, dstSlices, 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, srcPacking); 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_bgr888(TEXSTORE_PARAMS) 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_BGR888); 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 3); 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB && 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!ctx->_ImageTransferState && 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA && 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE) { 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* extract BGR from RGBA */ 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org int img, row, col; 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcRowStride = 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *srcRow = (GLubyte *) _mesa_image_address(dims, srcPacking, 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcWidth, srcHeight, srcFormat, srcType, img, 0, 0); 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow[col * 3 + 0] = srcRow[col * 4 + RCOMP]; 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow[col * 3 + 1] = srcRow[col * 4 + GCOMP]; 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow[col * 3 + 2] = srcRow[col * 4 + BCOMP]; 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow += srcRowStride; 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!ctx->_ImageTransferState && 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE && 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org can_swizzle(baseInternalFormat) && 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org can_swizzle(srcFormat)) { 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte dstmap[4]; 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dstmap - how to swizzle from RGBA to dst format: 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 0; 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[1] = 1; 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[2] = 2; 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[3] = ONE; /* ? */ 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swizzle_ubyte_image(ctx, dims, 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap, 3, 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcAddr, 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return store_ubyte_texture(ctx, dims, baseInternalFormat, 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, dstRowStride, dstSlices, 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, srcPacking); 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_argb4444(TEXSTORE_PARAMS) 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_ARGB4444 || 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_ARGB4444_REV); 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGBA && 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return store_ubyte_texture(ctx, dims, baseInternalFormat, 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, dstRowStride, dstSlices, 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, srcPacking); 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba5551(TEXSTORE_PARAMS) 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_RGBA5551); 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGBA && 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return store_ubyte_texture(ctx, dims, baseInternalFormat, 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, dstRowStride, dstSlices, 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, srcPacking); 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_argb1555(TEXSTORE_PARAMS) 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_ARGB1555 || 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_ARGB1555_REV); 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGBA && 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return store_ubyte_texture(ctx, dims, baseInternalFormat, 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, dstRowStride, dstSlices, 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, srcPacking); 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_argb2101010(TEXSTORE_PARAMS) 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_ARGB2101010); 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGBA && 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *src = tempImage; 1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (baseInternalFormat == GL_RGBA) { 1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dstUI = (GLuint *) dstRow; 1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort a,r,g,b; 1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(a, src[ACOMP]); 1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); 1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); 1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); 1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUI[col] = PACK_COLOR_2101010_US(a, r, g, b); 1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 4; 1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else if (baseInternalFormat == GL_RGB) { 1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dstUI = (GLuint *) dstRow; 1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort r,g,b; 1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(r, src[RCOMP]); 1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(g, src[GCOMP]); 1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(b, src[BCOMP]); 1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUI[col] = PACK_COLOR_2101010_US(0xffff, r, g, b); 1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 4; 1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(0); 1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do texstore for 2-channel, 4-bit/channel, unsigned normalized formats. 1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_unorm44(TEXSTORE_PARAMS) 1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_AL44); 1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 1); 1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src = tempImage; 1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstUS = (GLubyte *) dstRow; 1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* src[0] is luminance, src[1] is alpha */ 1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUS[col] = PACK_COLOR_44( src[1], 1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src[0] ); 1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 2; 1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do texstore for 2-channel, 8-bit/channel, unsigned normalized formats. 1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_unorm88(TEXSTORE_PARAMS) 1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean littleEndian = _mesa_little_endian(); 1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_AL88 || 1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_AL88_REV || 1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_GR88 || 1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RG88); 1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((dstFormat == MESA_FORMAT_AL88 && 1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE_ALPHA && 1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_ALPHA) || 1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (dstFormat == MESA_FORMAT_GR88 && 1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat)) && 1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE && 1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org littleEndian) { 1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!ctx->_ImageTransferState && 1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org littleEndian && 1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE && 1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org can_swizzle(baseInternalFormat) && 1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org can_swizzle(srcFormat)) { 1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte dstmap[4]; 1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dstmap - how to swizzle from RGBA to dst format: 1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == MESA_FORMAT_AL88 || dstFormat == MESA_FORMAT_AL88_REV) { 1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((littleEndian && dstFormat == MESA_FORMAT_AL88) || 1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (!littleEndian && dstFormat == MESA_FORMAT_AL88_REV)) { 1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 0; 1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[1] = 3; 1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 3; 1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[1] = 0; 1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((littleEndian && dstFormat == MESA_FORMAT_GR88) || 1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (!littleEndian && dstFormat == MESA_FORMAT_RG88)) { 1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 0; 1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[1] = 1; 1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 1; 1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[1] = 0; 1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[2] = ZERO; /* ? */ 1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[3] = ONE; /* ? */ 1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swizzle_ubyte_image(ctx, dims, 1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, 1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, 1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap, 2, 1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcAddr, 1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src = tempImage; 1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dstUS = (GLushort *) dstRow; 1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == MESA_FORMAT_AL88 || 1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_GR88) { 1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* src[0] is luminance (or R), src[1] is alpha (or G) */ 1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUS[col] = PACK_COLOR_88( src[1], 1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src[0] ); 1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 2; 1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* src[0] is luminance (or R), src[1] is alpha (or G) */ 1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUS[col] = PACK_COLOR_88_REV( src[1], 1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src[0] ); 1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 2; 1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do texstore for 2-channel, 16-bit/channel, unsigned normalized formats. 1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_unorm1616(TEXSTORE_PARAMS) 1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean littleEndian = _mesa_little_endian(); 1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_AL1616 || 1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_AL1616_REV || 1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RG1616 || 1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RG1616_REV); 1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((dstFormat == MESA_FORMAT_AL1616 && 1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE_ALPHA && 1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_LUMINANCE_ALPHA) || 1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (dstFormat == MESA_FORMAT_RG1616 && 1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat)) && 1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT && 1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org littleEndian) { 1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *src = tempImage; 1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dstUI = (GLuint *) dstRow; 1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == MESA_FORMAT_AL1616 || 1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RG1616) { 1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort l, a; 1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(l, src[0]); 1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(a, src[1]); 1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUI[col] = PACK_COLOR_1616(a, l); 1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 2; 1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort l, a; 1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(l, src[0]); 1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(a, src[1]); 1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUI[col] = PACK_COLOR_1616_REV(a, l); 1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 2; 1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Texstore for R16, A16, L16, I16. */ 1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_unorm16(TEXSTORE_PARAMS) 2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean littleEndian = _mesa_little_endian(); 2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_R16 || 2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_A16 || 2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_L16 || 2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_I16); 2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT && 2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org littleEndian) { 2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *src = tempImage; 2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dstUS = (GLushort *) dstRow; 2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort r; 2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(r, src[0]); 2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUS[col] = r; 2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 1; 2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_16(TEXSTORE_PARAMS) 2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_RGBA_16); 2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 8); 2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGBA && 2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA && 2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT) { 2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *src = tempImage; 2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dstUS = (GLushort *) dstRow; 2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort r, g, b, a; 2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(r, src[0]); 2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(g, src[1]); 2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(b, src[2]); 2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_USHORT(a, src[3]); 2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUS[col*4+0] = r; 2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUS[col*4+1] = g; 2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUS[col*4+2] = b; 2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUS[col*4+3] = a; 2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 4; 2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_signed_rgba_16(TEXSTORE_PARAMS) 2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGB_16 || 2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_SIGNED_RGBA_16); 2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGBA && 2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_SIGNED_RGBA_16 && 2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_RGBA && 2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_SHORT) { 2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *src = tempImage; 2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint comps = _mesa_get_format_bytes(dstFormat) / 2; 2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: tempImage is always float[4] / RGBA. We convert to 1, 2, 2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 3 or 4 components/pixel here. 2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLshort *dstRowS = (GLshort *) dstRow; 2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == MESA_FORMAT_SIGNED_RGBA_16) { 2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint c; 2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < comps; c++) { 2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLshort p; 2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 4 + c]); 2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowS[col * comps + c] = p; 2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 4 * srcWidth; 2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint c; 2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (c = 0; c < comps; c++) { 2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLshort p; 2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_SHORT(p, src[col * 3 + c]); 2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowS[col * comps + c] = p; 2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 3 * srcWidth; 2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgb332(TEXSTORE_PARAMS) 2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_RGB332); 2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 1); 2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB && 2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return store_ubyte_texture(ctx, dims, baseInternalFormat, 2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, dstRowStride, dstSlices, 2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, srcPacking); 2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texstore for _mesa_texformat_a8, _mesa_texformat_l8, _mesa_texformat_i8. 2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_unorm8(TEXSTORE_PARAMS) 2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_A8 || 2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_L8 || 2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_I8 || 2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_R8); 2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 1); 2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE) { 2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (!ctx->_ImageTransferState && 2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE && 2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org can_swizzle(baseInternalFormat) && 2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org can_swizzle(srcFormat)) { 2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte dstmap[4]; 2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dstmap - how to swizzle from RGBA to dst format: 2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == MESA_FORMAT_A8) { 2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 3; 2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 0; 2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[1] = ZERO; /* ? */ 2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[2] = ZERO; /* ? */ 2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[3] = ONE; /* ? */ 2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swizzle_ubyte_image(ctx, dims, 2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, 2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, 2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap, 1, 2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcAddr, 2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *tempImage = _mesa_make_temp_ubyte_image(ctx, dims, 2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src = tempImage; 2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow[col] = src[col]; 2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcWidth; 2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texstore for _mesa_texformat_ycbcr or _mesa_texformat_ycbcr_REV. 2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_ycbcr(TEXSTORE_PARAMS) 2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean littleEndian = _mesa_little_endian(); 2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; (void) dims; (void) baseInternalFormat; 2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT((dstFormat == MESA_FORMAT_YCBCR) || 2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (dstFormat == MESA_FORMAT_YCBCR_REV)); 2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(ctx->Extensions.MESA_ycbcr_texture); 2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat == GL_YCBCR_MESA); 2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT((srcType == GL_UNSIGNED_SHORT_8_8_MESA) || 2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA)); 2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(baseInternalFormat == GL_YCBCR_MESA); 2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* always just memcpy since no pixel transfer ops apply */ 2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check if we need byte swapping */ 2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* XXX the logic here _might_ be wrong */ 2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcPacking->SwapBytes ^ 2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (srcType == GL_UNSIGNED_SHORT_8_8_REV_MESA) ^ 2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (dstFormat == MESA_FORMAT_YCBCR_REV) ^ 2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !littleEndian) { 2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swap2((GLushort *) dstRow, srcWidth); 2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_dudv8(TEXSTORE_PARAMS) 2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean littleEndian = _mesa_little_endian(); 2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint texelBytes = _mesa_get_format_bytes(dstFormat); 2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_DUDV8); 2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(texelBytes == 2); 2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(ctx->Extensions.ATI_envmap_bumpmap); 2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT((srcFormat == GL_DU8DV8_ATI) || 2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (srcFormat == GL_DUDV_ATI)); 2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(baseInternalFormat == GL_DUDV_ATI); 2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!srcPacking->SwapBytes && srcType == GL_BYTE && 2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org littleEndian) { 2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (srcType == GL_BYTE) { 2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte dstmap[4]; 2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* dstmap - how to swizzle from RGBA to dst format: 2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (littleEndian) { 2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 0; 2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[1] = 3; 2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[0] = 3; 2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[1] = 0; 2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[2] = ZERO; /* ? */ 2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap[3] = ONE; /* ? */ 2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_swizzle_ubyte_image(ctx, dims, 2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_LUMINANCE_ALPHA, /* hack */ 2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_UNSIGNED_BYTE, /* hack */ 2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_LUMINANCE_ALPHA, /* hack */ 2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstmap, 2, 2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcAddr, 2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path - note this is defined for 2d textures only */ 2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint components = _mesa_components_in_format(baseInternalFormat); 2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcStride = _mesa_image_row_stride(srcPacking, srcWidth, 2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType); 2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *tempImage, *dst, *src; 2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint row; 2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tempImage = (GLbyte *) malloc(srcWidth * srcHeight * srcDepth 2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * components * sizeof(GLbyte)); 2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = (GLbyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, 2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, 0); 2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst = tempImage; 2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_dudv_span_byte(ctx, srcWidth, baseInternalFormat, 2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst, srcFormat, srcType, src, 2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 0); 2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += srcWidth * components; 2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcStride; 2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = tempImage; 2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst = (GLbyte *) dstSlices[0]; 2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dst, src, srcWidth * texelBytes); 2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += dstRowStride; 2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcWidth * texelBytes; 2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a texture in a signed normalized 8-bit format. 2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_snorm8(TEXSTORE_PARAMS) 2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_SIGNED_A8 || 2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_SIGNED_L8 || 2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_SIGNED_I8 || 2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_SIGNED_R8); 2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 1); 2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_BYTE) { 2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *src = tempImage; 2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *dstRow = (GLbyte *) dstSlices[img]; 2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 2470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow[col] = FLOAT_TO_BYTE_TEX(src[col]); 2471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 2473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcWidth; 2474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 2477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a texture in a signed normalized two-channel 16-bit format. 2484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_snorm88(TEXSTORE_PARAMS) 2487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean littleEndian = _mesa_little_endian(); 2489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL88 || 2492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_SIGNED_RG88_REV); 2493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 2494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 2496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 2497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 2498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_BYTE && 2499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org littleEndian) { 2500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 2501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 2509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 2511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 2512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 2513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 2514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 2515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 2516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *src = tempImage; 2517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 2518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 2519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *dstRow = (GLbyte *) dstSlices[img]; 2522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *dst = dstRow; 2524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 2525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0] = FLOAT_TO_BYTE_TEX(src[0]); 2526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1] = FLOAT_TO_BYTE_TEX(src[1]); 2527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 2; 2528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += 2; 2529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 2531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 2534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Texstore for signed R16, A16, L16, I16. */ 2539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_snorm16(TEXSTORE_PARAMS) 2541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean littleEndian = _mesa_little_endian(); 2543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_SIGNED_R16 || 2546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_SIGNED_A16 || 2547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_SIGNED_L16 || 2548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_SIGNED_I16); 2549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 2); 2550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 2552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 2553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 2554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_SHORT && 2555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org littleEndian) { 2556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 2557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 2565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 2567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 2568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 2569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 2570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 2571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 2572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *src = tempImage; 2573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 2574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 2575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 2578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLshort *dstUS = (GLshort *) dstRow; 2580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 2581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort r; 2582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_SHORT(r, src[0]); 2584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUS[col] = r; 2585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 1; 2586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 2588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 2591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do texstore for 2-channel, 16-bit/channel, signed normalized formats. 2597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_snorm1616(TEXSTORE_PARAMS) 2600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean littleEndian = _mesa_little_endian(); 2602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_SIGNED_AL1616 || 2605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_SIGNED_GR1616); 2606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 2607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 2609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 2610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 2611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_SHORT && 2612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org littleEndian) { 2613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 2614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 2622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 2624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 2625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 2626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 2627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 2628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 2629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *src = tempImage; 2630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 2631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 2632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 2635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLshort *dst = (GLshort *) dstRow; 2637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 2638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort l, a; 2639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_SHORT(l, src[0]); 2641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org UNCLAMPED_FLOAT_TO_SHORT(a, src[1]); 2642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0] = l; 2643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1] = a; 2644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 2; 2645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += 2; 2646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 2648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 2651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a texture in MESA_FORMAT_SIGNED_RGBX8888. 2657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_signed_rgbx8888(TEXSTORE_PARAMS) 2660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBX8888); 2664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 2665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 2667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 2668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 2670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 2671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 2672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 2673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 2674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 2675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *srcRow = tempImage; 2676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 2677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 2678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *dstRow = (GLbyte *) dstSlices[img]; 2681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *dst = dstRow; 2683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 2684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 2685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 2686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 2687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0] = 127; 2688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow += 3; 2689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += 4; 2690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 2692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 2695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a texture in MESA_FORMAT_SIGNED_RGBA8888 or 2703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * MESA_FORMAT_SIGNED_RGBA8888_REV 2704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_signed_rgba8888(TEXSTORE_PARAMS) 2707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 2709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_SIGNED_RGBA8888 || 2711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_SIGNED_RGBA8888_REV); 2712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 2713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 2715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGBA && 2716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 2717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 2718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 2719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 2727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 2728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 2729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 2730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 2731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 2732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 2733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 2734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *srcRow = tempImage; 2735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 2736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 2737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *dstRow = (GLbyte *) dstSlices[img]; 2740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *dst = dstRow; 2742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstFormat == MESA_FORMAT_SIGNED_RGBA8888) { 2743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 2744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[3] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 2745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[2] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 2746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 2747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]); 2748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow += 4; 2749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += 4; 2750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 2754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[0] = FLOAT_TO_BYTE_TEX(srcRow[RCOMP]); 2755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[1] = FLOAT_TO_BYTE_TEX(srcRow[GCOMP]); 2756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[2] = FLOAT_TO_BYTE_TEX(srcRow[BCOMP]); 2757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst[3] = FLOAT_TO_BYTE_TEX(srcRow[ACOMP]); 2758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow += 4; 2759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dst += 4; 2760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 2763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 2766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a combined depth/stencil texture image. 2773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_z24_s8(TEXSTORE_PARAMS) 2776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint depthScale = 0xffffff; 2778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcRowStride 2779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 2780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 2781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_Z24_S8); 2783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || 2784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_DEPTH_COMPONENT || 2785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_STENCIL_INDEX); 2786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || srcType == GL_UNSIGNED_INT_24_8_EXT); 2787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcFormat == GL_DEPTH_STENCIL && ctx->Pixel.DepthScale == 1.0f && 2789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Pixel.DepthBias == 0.0f && 2790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes) { 2791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple path */ 2792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (srcFormat == GL_DEPTH_COMPONENT || 2799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_STENCIL_INDEX) { 2800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *depth = (GLuint *) malloc(srcWidth * sizeof(GLuint)); 2801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte)); 2802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!depth || !stencil) { 2804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(depth); 2805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(stencil); 2806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* In case we only upload depth we need to preserve the stencil */ 2810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dstRow = (GLuint *) dstSlices[img]; 2812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src 2813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, 2815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 2816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img, 0, 0); 2817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 2819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; 2820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */ 2822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org keepstencil = GL_TRUE; 2823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */ 2825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org keepdepth = GL_TRUE; 2826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (keepdepth == GL_FALSE) 2829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* the 24 depth bits will be in the low position: */ 2830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_depth_span(ctx, srcWidth, 2831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_UNSIGNED_INT, /* dst type */ 2832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org keepstencil ? depth : dstRow, /* dst addr */ 2833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthScale, 2834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, src, srcPacking); 2835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (keepstencil == GL_FALSE) 2837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get the 8-bit stencil values */ 2838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_stencil_span(ctx, srcWidth, 2839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_UNSIGNED_BYTE, /* dst type */ 2840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stencil, /* dst addr */ 2841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, src, srcPacking, 2842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 2843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth; i++) { 2845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (keepstencil) 2846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow[i] = depth[i] << 8 | (dstRow[i] & 0x000000FF); 2847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 2848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow[i] = (dstRow[i] & 0xFFFFFF00) | (stencil[i] & 0xFF); 2849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcRowStride; 2852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride / sizeof(GLuint); 2853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(depth); 2857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(stencil); 2858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store a combined depth/stencil texture image. 2865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_s8_z24(TEXSTORE_PARAMS) 2868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint depthScale = 0xffffff; 2870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcRowStride 2871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 2872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 2873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *depth; 2874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *stencil; 2875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_S8_Z24); 2877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat == GL_DEPTH_STENCIL_EXT || 2878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_DEPTH_COMPONENT || 2879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_STENCIL_INDEX); 2880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat != GL_DEPTH_STENCIL_EXT || 2881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT_24_8_EXT); 2882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = (GLuint *) malloc(srcWidth * sizeof(GLuint)); 2884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte)); 2885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!depth || !stencil) { 2887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(depth); 2888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(stencil); 2889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dstRow = (GLuint *) dstSlices[img]; 2894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src 2895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, 2897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 2898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img, 0, 0); 2899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 2901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean keepdepth = GL_FALSE, keepstencil = GL_FALSE; 2902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcFormat == GL_DEPTH_COMPONENT) { /* preserve stencil */ 2904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org keepstencil = GL_TRUE; 2905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (srcFormat == GL_STENCIL_INDEX) { /* preserve depth */ 2907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org keepdepth = GL_TRUE; 2908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (keepdepth == GL_FALSE) 2911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* the 24 depth bits will be in the low position: */ 2912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_depth_span(ctx, srcWidth, 2913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_UNSIGNED_INT, /* dst type */ 2914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org keepstencil ? depth : dstRow, /* dst addr */ 2915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depthScale, 2916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, src, srcPacking); 2917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (keepstencil == GL_FALSE) 2919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get the 8-bit stencil values */ 2920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_stencil_span(ctx, srcWidth, 2921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_UNSIGNED_BYTE, /* dst type */ 2922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stencil, /* dst addr */ 2923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, src, srcPacking, 2924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 2925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* merge stencil values into depth values */ 2927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth; i++) { 2928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (keepstencil) 2929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow[i] = depth[i] | (dstRow[i] & 0xFF000000); 2930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 2931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow[i] = (dstRow[i] & 0xFFFFFF) | (stencil[i] << 24); 2932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcRowStride; 2935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride / sizeof(GLuint); 2936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(depth); 2940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(stencil); 2941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store simple 8-bit/value stencil texture data. 2948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_s8(TEXSTORE_PARAMS) 2951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_S8); 2953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat == GL_STENCIL_INDEX); 2954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 2956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 2957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 2958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE) { 2959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 2960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 2961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 2962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 2963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 2964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 2965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcRowStride 2968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType); 2969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 2970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *stencil = (GLubyte *) malloc(srcWidth * sizeof(GLubyte)); 2971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!stencil) 2973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 2976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 2977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src 2978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = (const GLubyte *) _mesa_image_address(dims, srcPacking, srcAddr, 2979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, 2980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 2981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img, 0, 0); 2982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 2983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 2984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get the 8-bit stencil values */ 2986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_stencil_span(ctx, srcWidth, 2987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_UNSIGNED_BYTE, /* dst type */ 2988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org stencil, /* dst addr */ 2989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, src, srcPacking, 2990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 2991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* merge stencil values into depth values */ 2992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth; i++) 2993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow[i] = stencil[i]; 2994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcRowStride; 2996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride / sizeof(GLubyte); 2997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(stencil); 3001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 3008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store an image in any of the formats: 3009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _mesa_texformat_rgba_float32 3010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _mesa_texformat_rgb_float32 3011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _mesa_texformat_alpha_float32 3012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _mesa_texformat_luminance_float32 3013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _mesa_texformat_luminance_alpha_float32 3014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * _mesa_texformat_intensity_float32 3015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_float32(TEXSTORE_PARAMS) 3018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint components = _mesa_components_in_format(baseFormat); 3021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT32 || 3023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGB_FLOAT32 || 3024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_ALPHA_FLOAT32 || 3025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_FLOAT32 || 3026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32 || 3027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_INTENSITY_FLOAT32 || 3028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_R_FLOAT32 || 3029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RG_FLOAT32); 3030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(baseInternalFormat == GL_RGBA || 3031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB || 3032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_ALPHA || 3033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE || 3034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE_ALPHA || 3035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_INTENSITY || 3036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RED || 3037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RG); 3038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLfloat)); 3039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 3041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 3042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 3043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == baseFormat && 3044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_FLOAT) { 3045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 3046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 3047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 3048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 3054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 3056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 3057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 3059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 3060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 3061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *srcRow = tempImage; 3062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint bytesPerRow; 3063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 3064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 3065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 3066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytesPerRow = srcWidth * components * sizeof(GLfloat); 3067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 3068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 3069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 3070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dstRow, srcRow, bytesPerRow); 3071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 3072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow += srcWidth * components; 3073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 3077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 3084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * As above, but store 16-bit floats. 3085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_float16(TEXSTORE_PARAMS) 3088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint components = _mesa_components_in_format(baseFormat); 3091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_RGBA_FLOAT16 || 3093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGB_FLOAT16 || 3094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_ALPHA_FLOAT16 || 3095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_FLOAT16 || 3096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16 || 3097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_INTENSITY_FLOAT16 || 3098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_R_FLOAT16 || 3099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RG_FLOAT16); 3100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(baseInternalFormat == GL_RGBA || 3101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB || 3102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_ALPHA || 3103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE || 3104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE_ALPHA || 3105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_INTENSITY || 3106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RED || 3107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RG); 3108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLhalfARB)); 3109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 3111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes && 3112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 3113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == baseFormat && 3114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_HALF_FLOAT_ARB) { 3115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 3116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 3117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 3118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 3124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 3126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 3127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 3129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 3130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 3131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *src = tempImage; 3132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 3133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 3134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 3135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 3136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 3137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 3138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLhalfARB *dstTexel = (GLhalfARB *) dstRow; 3139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 3140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth * components; i++) { 3141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTexel[i] = _mesa_float_to_half(src[i]); 3142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 3144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcWidth * components; 3145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 3149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* non-normalized, signed int8 */ 3155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_int8(TEXSTORE_PARAMS) 3157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint components = _mesa_components_in_format(baseFormat); 3160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_R_INT8 || 3162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RG_INT8 || 3163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGB_INT8 || 3164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGBA_INT8 || 3165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_ALPHA_INT8 || 3166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_INTENSITY_INT8 || 3167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_INT8 || 3168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT8); 3169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(baseInternalFormat == GL_RGBA || 3170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB || 3171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RG || 3172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RED || 3173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_ALPHA || 3174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE || 3175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE_ALPHA || 3176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_INTENSITY); 3177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLbyte)); 3178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to integer formats. 3181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!srcPacking->SwapBytes && 3183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 3184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_BYTE) { 3185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 3186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 3187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 3188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 3194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *tempImage = make_temp_uint_image(ctx, dims, 3195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 3196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 3197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 3199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, 3200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 3201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *src = tempImage; 3202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 3203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 3205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 3206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 3207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 3208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 3209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLbyte *dstTexel = (GLbyte *) dstRow; 3210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 3211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_unsigned) { 3212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth * components; i++) { 3213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTexel[i] = (GLbyte) MIN2(src[i], 0x7f); 3214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth * components; i++) { 3217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTexel[i] = (GLbyte) CLAMP((GLint) src[i], -0x80, 0x7f); 3218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 3221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcWidth * components; 3222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 3226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* non-normalized, signed int16 */ 3232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_int16(TEXSTORE_PARAMS) 3234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint components = _mesa_components_in_format(baseFormat); 3237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_R_INT16 || 3239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RG_INT16 || 3240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGB_INT16 || 3241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGBA_INT16 || 3242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_ALPHA_INT16 || 3243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_INT16 || 3244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_INTENSITY_INT16 || 3245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT16); 3246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(baseInternalFormat == GL_RGBA || 3247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB || 3248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RG || 3249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RED || 3250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_ALPHA || 3251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE || 3252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE_ALPHA || 3253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_INTENSITY); 3254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLshort)); 3255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to integer formats. 3258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!srcPacking->SwapBytes && 3260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 3261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_SHORT) { 3262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 3263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 3264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 3265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 3271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *tempImage = make_temp_uint_image(ctx, dims, 3272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 3273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 3274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 3276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, 3277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 3278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *src = tempImage; 3279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 3280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 3282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 3283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 3284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 3285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 3286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLshort *dstTexel = (GLshort *) dstRow; 3287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 3288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_unsigned) { 3289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth * components; i++) { 3290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTexel[i] = (GLshort) MIN2(src[i], 0x7fff); 3291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth * components; i++) { 3294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTexel[i] = (GLshort)CLAMP((GLint) src[i], -0x8000, 0x7fff); 3295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 3298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcWidth * components; 3299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 3303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* non-normalized, signed int32 */ 3309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_int32(TEXSTORE_PARAMS) 3311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint components = _mesa_components_in_format(baseFormat); 3314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_R_INT32 || 3316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RG_INT32 || 3317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGB_INT32 || 3318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGBA_INT32 || 3319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_ALPHA_INT32 || 3320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_INTENSITY_INT32 || 3321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_INT32 || 3322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_INT32); 3323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(baseInternalFormat == GL_RGBA || 3324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB || 3325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RG || 3326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RED || 3327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_ALPHA || 3328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE || 3329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE_ALPHA || 3330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_INTENSITY); 3331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLint)); 3332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to integer formats. 3335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!srcPacking->SwapBytes && 3337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 3338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_INT) { 3339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 3340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 3341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 3342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 3348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *tempImage = make_temp_uint_image(ctx, dims, 3349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 3350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 3351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 3353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, 3354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 3355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *src = tempImage; 3356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 3357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 3359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 3360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 3361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 3362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 3363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *dstTexel = (GLint *) dstRow; 3364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 3365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_unsigned) { 3366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth * components; i++) { 3367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTexel[i] = (GLint) MIN2(src[i], 0x7fffffff); 3368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth * components; i++) { 3371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTexel[i] = (GLint) src[i]; 3372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 3375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcWidth * components; 3376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 3380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* non-normalized, unsigned int8 */ 3386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_uint8(TEXSTORE_PARAMS) 3388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint components = _mesa_components_in_format(baseFormat); 3391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_R_UINT8 || 3393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RG_UINT8 || 3394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGB_UINT8 || 3395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGBA_UINT8 || 3396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_ALPHA_UINT8 || 3397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_INTENSITY_UINT8 || 3398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_UINT8 || 3399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT8); 3400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(baseInternalFormat == GL_RGBA || 3401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB || 3402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RG || 3403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RED || 3404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_ALPHA || 3405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE || 3406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE_ALPHA || 3407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_INTENSITY); 3408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLubyte)); 3409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to integer formats. 3412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!srcPacking->SwapBytes && 3414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 3415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_BYTE) { 3416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 3417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 3418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 3419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 3425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *tempImage = 3426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, srcPacking); 3429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *src = tempImage; 3430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 3431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 3433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 3434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 3435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 3436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 3437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstTexel = (GLubyte *) dstRow; 3438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 3439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_unsigned) { 3440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth * components; i++) { 3441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTexel[i] = (GLubyte) MIN2(src[i], 0xff); 3442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth * components; i++) { 3445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTexel[i] = (GLubyte) CLAMP((GLint) src[i], 0, 0xff); 3446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 3449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcWidth * components; 3450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 3454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* non-normalized, unsigned int16 */ 3460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_uint16(TEXSTORE_PARAMS) 3462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint components = _mesa_components_in_format(baseFormat); 3465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_R_UINT16 || 3467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RG_UINT16 || 3468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGB_UINT16 || 3469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGBA_UINT16 || 3470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_ALPHA_UINT16 || 3471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_INTENSITY_UINT16 || 3472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_UINT16 || 3473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT16); 3474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(baseInternalFormat == GL_RGBA || 3475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB || 3476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RG || 3477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RED || 3478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_ALPHA || 3479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE || 3480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE_ALPHA || 3481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_INTENSITY); 3482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLushort)); 3483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to integer formats. 3486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!srcPacking->SwapBytes && 3488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 3489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_SHORT) { 3490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 3491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 3492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 3493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 3499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *tempImage = 3500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, srcPacking); 3503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *src = tempImage; 3504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 3505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 3507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 3508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 3509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 3510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 3511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort *dstTexel = (GLushort *) dstRow; 3512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 3513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_unsigned) { 3514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth * components; i++) { 3515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTexel[i] = (GLushort) MIN2(src[i], 0xffff); 3516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth * components; i++) { 3519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTexel[i] = (GLushort) CLAMP((GLint) src[i], 0, 0xffff); 3520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 3523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcWidth * components; 3524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 3528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* non-normalized, unsigned int32 */ 3534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgba_uint32(TEXSTORE_PARAMS) 3536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint components = _mesa_components_in_format(baseFormat); 3539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_R_UINT32 || 3541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RG_UINT32 || 3542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGB_UINT32 || 3543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_RGBA_UINT32 || 3544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_ALPHA_UINT32 || 3545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_INTENSITY_UINT32 || 3546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_UINT32 || 3547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat == MESA_FORMAT_LUMINANCE_ALPHA_UINT32); 3548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(baseInternalFormat == GL_RGBA || 3549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RGB || 3550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RG || 3551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_RED || 3552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_ALPHA || 3553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE || 3554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_LUMINANCE_ALPHA || 3555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == GL_INTENSITY); 3556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == components * sizeof(GLuint)); 3557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: Pixel transfer ops (scale, bias, table lookup) do not apply 3559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to integer formats. 3560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!srcPacking->SwapBytes && 3562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat == srcFormat && 3563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_UNSIGNED_INT) { 3564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 3565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 3566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 3567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 3573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *tempImage = 3574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org make_temp_uint_image(ctx, dims, baseInternalFormat, baseFormat, 3575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, srcPacking); 3577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *src = tempImage; 3578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 3580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 3581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 3582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 3583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 3584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 3585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dstTexel = (GLuint *) dstRow; 3586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i; 3587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_unsigned) { 3588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth * components; i++) { 3589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTexel[i] = src[i]; 3590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < srcWidth * components; i++) { 3593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstTexel[i] = MAX2((GLint) src[i], 0); 3594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 3597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcWidth * components; 3598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 3602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_EXT_texture_sRGB 3610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_srgb8(TEXSTORE_PARAMS) 3612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format newDstFormat; 3614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean k; 3615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_SRGB8); 3617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* reuse normal rgb texstore code */ 3619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newDstFormat = MESA_FORMAT_RGB888; 3620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org k = _mesa_texstore_rgb888(ctx, dims, baseInternalFormat, 3622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newDstFormat, 3623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 3626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return k; 3628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_srgba8(TEXSTORE_PARAMS) 3633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format newDstFormat; 3635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean k; 3636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_SRGBA8); 3638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* reuse normal rgba texstore code */ 3640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newDstFormat = MESA_FORMAT_RGBA8888; 3641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org k = _mesa_texstore_rgba8888(ctx, dims, baseInternalFormat, 3642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newDstFormat, 3643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 3646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return k; 3648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_sargb8(TEXSTORE_PARAMS) 3653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format newDstFormat; 3655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean k; 3656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_SARGB8); 3658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* reuse normal rgba texstore code */ 3660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newDstFormat = MESA_FORMAT_ARGB8888; 3661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org k = _mesa_texstore_argb8888(ctx, dims, baseInternalFormat, 3663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newDstFormat, 3664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 3667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return k; 3669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_sl8(TEXSTORE_PARAMS) 3674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format newDstFormat; 3676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean k; 3677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_SL8); 3679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newDstFormat = MESA_FORMAT_L8; 3681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* _mesa_textore_a8 handles luminance8 too */ 3683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org k = _mesa_texstore_unorm8(ctx, dims, baseInternalFormat, 3684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newDstFormat, 3685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 3688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return k; 3690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_sla8(TEXSTORE_PARAMS) 3695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format newDstFormat; 3697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean k; 3698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_SLA8); 3700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* reuse normal luminance/alpha texstore code */ 3702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newDstFormat = MESA_FORMAT_AL88; 3703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org k = _mesa_texstore_unorm88(ctx, dims, baseInternalFormat, 3705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org newDstFormat, 3706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 3709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return k; 3711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 3714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* these are used only in texstore_funcs[] below */ 3716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _mesa_texstore_srgb8 NULL 3717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _mesa_texstore_srgba8 NULL 3718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _mesa_texstore_sargb8 NULL 3719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _mesa_texstore_sl8 NULL 3720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define _mesa_texstore_sla8 NULL 3721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* FEATURE_EXT_texture_sRGB */ 3723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_rgb9_e5(TEXSTORE_PARAMS) 3726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_RGB9_E5_FLOAT); 3730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(baseInternalFormat == GL_RGB); 3731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 3733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 3734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 3735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 3736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 3737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 3738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 3744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 3746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 3747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 3749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 3750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 3751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *srcRow = tempImage; 3752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 3753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 3754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 3755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 3756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 3757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 3758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dstUI = (GLuint*)dstRow; 3759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 3760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUI[col] = float3_to_rgb9e5(&srcRow[col * 3]); 3761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 3763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow += srcWidth * 3; 3764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 3768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_r11_g11_b10f(TEXSTORE_PARAMS) 3774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_R11_G11_B10_FLOAT); 3778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(baseInternalFormat == GL_RGB); 3779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->_ImageTransferState && 3781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 3782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 3783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 3784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 3785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 3786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 3792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *tempImage = _mesa_make_temp_float_image(ctx, dims, 3793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 3794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 3795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 3796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, 3797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking, 3798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 3799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLfloat *srcRow = tempImage; 3800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 3801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 3802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 3803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 3804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 3805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 3806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dstUI = (GLuint*)dstRow; 3807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 3808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUI[col] = float3_to_r11g11b10f(&srcRow[col * 3]); 3809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 3811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRow += srcWidth * 3; 3812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 3816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_z32f_x24s8(TEXSTORE_PARAMS) 3823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_Z32_FLOAT_X24S8); 3825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat == GL_DEPTH_STENCIL || 3826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_DEPTH_COMPONENT || 3827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_STENCIL_INDEX); 3828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(srcFormat != GL_DEPTH_STENCIL || 3829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType == GL_FLOAT_32_UNSIGNED_INT_24_8_REV); 3830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcFormat == GL_DEPTH_STENCIL && 3832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Pixel.DepthScale == 1.0f && 3833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Pixel.DepthBias == 0.0f && 3834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !srcPacking->SwapBytes) { 3835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple path */ 3836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 3837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 3838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (srcFormat == GL_DEPTH_COMPONENT || 3843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat == GL_STENCIL_INDEX) { 3844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row; 3845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint srcRowStride 3846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = _mesa_image_row_stride(srcPacking, srcWidth, srcFormat, srcType) 3847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org / sizeof(uint64_t); 3848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* In case we only upload depth we need to preserve the stencil */ 3850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 3851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t *dstRow = (uint64_t *) dstSlices[img]; 3852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const uint64_t *src 3853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org = (const uint64_t *) _mesa_image_address(dims, srcPacking, srcAddr, 3854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, 3855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, 3856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img, 0, 0); 3857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 3858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The unpack functions with: 3859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * dstType = GL_FLOAT_32_UNSIGNED_INT_24_8_REV 3860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * only write their own dword, so the other dword (stencil 3861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * or depth) is preserved. */ 3862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcFormat != GL_STENCIL_INDEX) 3863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_depth_span(ctx, srcWidth, 3864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */ 3865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow, /* dst addr */ 3866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ~0U, srcType, src, srcPacking); 3867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (srcFormat != GL_DEPTH_COMPONENT) 3869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unpack_stencil_span(ctx, srcWidth, 3870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_FLOAT_32_UNSIGNED_INT_24_8_REV, /* dst type */ 3871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow, /* dst addr */ 3872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, src, srcPacking, 3873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->_ImageTransferState); 3874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcRowStride; 3876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride / sizeof(uint64_t); 3877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_argb2101010_uint(TEXSTORE_PARAMS) 3885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_ARGB2101010_UINT); 3889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 3890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (baseInternalFormat == GL_RGBA && 3892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 3893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 3894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 3895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 3896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 3897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 3903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *tempImage = make_temp_uint_image(ctx, dims, 3904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 3905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 3906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, 3907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcDepth, srcFormat, 3908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, srcAddr, 3909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 3910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *src = tempImage; 3911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 3912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 3914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 3915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 3916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 3917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 3919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dstUI = (GLuint *) dstRow; 3920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_unsigned) { 3921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 3922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort a,r,g,b; 3923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = MIN2(src[RCOMP], 0x3ff); 3924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org g = MIN2(src[GCOMP], 0x3ff); 3925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = MIN2(src[BCOMP], 0x3ff); 3926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a = MIN2(src[ACOMP], 0x003); 3927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b); 3928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 4; 3929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 3932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort a,r,g,b; 3933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = CLAMP((GLint) src[RCOMP], 0, 0x3ff); 3934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org g = CLAMP((GLint) src[GCOMP], 0, 0x3ff); 3935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = CLAMP((GLint) src[BCOMP], 0, 0x3ff); 3936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a = CLAMP((GLint) src[ACOMP], 0, 0x003); 3937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUI[col] = (a << 30) | (r << 20) | (g << 10) | (b); 3938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 4; 3939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 3942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 3945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_abgr2101010_uint(TEXSTORE_PARAMS) 3951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum baseFormat = _mesa_get_format_base_format(dstFormat); 3953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dstFormat == MESA_FORMAT_ABGR2101010_UINT); 3955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_format_bytes(dstFormat) == 4); 3956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (baseInternalFormat == GL_RGBA && 3958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_format_matches_format_and_type(dstFormat, srcFormat, srcType, 3959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking->SwapBytes)) { 3960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* simple memcpy path */ 3961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy_texture(ctx, dims, 3962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 3963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 3964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, srcFormat, srcType, 3965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcAddr, srcPacking); 3966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general path */ 3969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *tempImage = make_temp_uint_image(ctx, dims, 3970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseInternalFormat, 3971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat, 3972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, 3973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcDepth, srcFormat, 3974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcType, srcAddr, 3975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcPacking); 3976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint *src = tempImage; 3977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint img, row, col; 3978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean is_unsigned = _mesa_is_type_unsigned(srcType); 3979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!tempImage) 3980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 3981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (img = 0; img < srcDepth; img++) { 3982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstRow = dstSlices[img]; 3983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (row = 0; row < srcHeight; row++) { 3985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint *dstUI = (GLuint *) dstRow; 3986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (is_unsigned) { 3987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 3988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort a,r,g,b; 3989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = MIN2(src[RCOMP], 0x3ff); 3990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org g = MIN2(src[GCOMP], 0x3ff); 3991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = MIN2(src[BCOMP], 0x3ff); 3992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a = MIN2(src[ACOMP], 0x003); 3993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUI[col] = (a << 30) | (b << 20) | (g << 10) | (r); 3994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 4; 3995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (col = 0; col < srcWidth; col++) { 3998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLushort a,r,g,b; 3999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org r = CLAMP((GLint) src[RCOMP], 0, 0x3ff); 4000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org g = CLAMP((GLint) src[GCOMP], 0, 0x3ff); 4001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org b = CLAMP((GLint) src[BCOMP], 0, 0x3ff); 4002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org a = CLAMP((GLint) src[ACOMP], 0, 0x003); 4003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstUI[col] = (a << 30) | (b << 20) | (g << 10) | (r); 4004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += 4; 4005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRow += dstRowStride; 4008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free((void *) tempImage); 4011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 4013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 4016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore_null(TEXSTORE_PARAMS) 4017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; (void) dims; 4019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) baseInternalFormat; 4020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) dstFormat; 4021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) dstRowStride; (void) dstSlices, 4022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) srcWidth; (void) srcHeight; (void) srcDepth; 4023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) srcFormat; (void) srcType; 4024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) srcAddr; 4025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) srcPacking; 4026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* should never happen */ 4028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "_mesa_texstore_null() is called"); 4029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 4030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 4034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the StoreTexImageFunc pointer to store an image in the given format. 4035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic StoreTexImageFunc 4037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_texstore_func(gl_format format) 4038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static StoreTexImageFunc table[MESA_FORMAT_COUNT]; 4040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static GLboolean initialized = GL_FALSE; 4041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!initialized) { 4043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_NONE] = _mesa_texstore_null; 4044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA8888] = _mesa_texstore_rgba8888; 4046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA8888_REV] = _mesa_texstore_rgba8888; 4047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ARGB8888] = _mesa_texstore_argb8888; 4048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ARGB8888_REV] = _mesa_texstore_argb8888; 4049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBX8888] = _mesa_texstore_rgba8888; 4050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBX8888_REV] = _mesa_texstore_rgba8888; 4051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_XRGB8888] = _mesa_texstore_argb8888; 4052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_XRGB8888_REV] = _mesa_texstore_argb8888; 4053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB888] = _mesa_texstore_rgb888; 4054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_BGR888] = _mesa_texstore_bgr888; 4055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB565] = _mesa_texstore_rgb565; 4056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB565_REV] = _mesa_texstore_rgb565; 4057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ARGB4444] = _mesa_texstore_argb4444; 4058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ARGB4444_REV] = _mesa_texstore_argb4444; 4059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA5551] = _mesa_texstore_rgba5551; 4060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ARGB1555] = _mesa_texstore_argb1555; 4061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ARGB1555_REV] = _mesa_texstore_argb1555; 4062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_AL44] = _mesa_texstore_unorm44; 4063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_AL88] = _mesa_texstore_unorm88; 4064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_AL88_REV] = _mesa_texstore_unorm88; 4065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_AL1616] = _mesa_texstore_unorm1616; 4066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_AL1616_REV] = _mesa_texstore_unorm1616; 4067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB332] = _mesa_texstore_rgb332; 4068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_A8] = _mesa_texstore_unorm8; 4069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_A16] = _mesa_texstore_unorm16; 4070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_L8] = _mesa_texstore_unorm8; 4071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_L16] = _mesa_texstore_unorm16; 4072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_I8] = _mesa_texstore_unorm8; 4073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_I16] = _mesa_texstore_unorm16; 4074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_YCBCR] = _mesa_texstore_ycbcr; 4075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_YCBCR_REV] = _mesa_texstore_ycbcr; 4076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_R8] = _mesa_texstore_unorm8; 4077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_GR88] = _mesa_texstore_unorm88; 4078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RG88] = _mesa_texstore_unorm88; 4079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_R16] = _mesa_texstore_unorm16; 4080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RG1616] = _mesa_texstore_unorm1616; 4081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RG1616_REV] = _mesa_texstore_unorm1616; 4082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ARGB2101010] = _mesa_texstore_argb2101010; 4083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_Z24_S8] = _mesa_texstore_z24_s8; 4084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_S8_Z24] = _mesa_texstore_s8_z24; 4085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_Z16] = _mesa_texstore_z16; 4086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_X8_Z24] = _mesa_texstore_x8_z24; 4087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_Z24_X8] = _mesa_texstore_z24_x8; 4088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_Z32] = _mesa_texstore_z32; 4089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_S8] = _mesa_texstore_s8; 4090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SRGB8] = _mesa_texstore_srgb8; 4091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SRGBA8] = _mesa_texstore_srgba8; 4092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SARGB8] = _mesa_texstore_sargb8; 4093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SL8] = _mesa_texstore_sl8; 4094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SLA8] = _mesa_texstore_sla8; 4095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SRGB_DXT1] = _mesa_texstore_rgb_dxt1; 4096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SRGBA_DXT1] = _mesa_texstore_rgba_dxt1; 4097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SRGBA_DXT3] = _mesa_texstore_rgba_dxt3; 4098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SRGBA_DXT5] = _mesa_texstore_rgba_dxt5; 4099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB_FXT1] = _mesa_texstore_rgb_fxt1; 4100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA_FXT1] = _mesa_texstore_rgba_fxt1; 4101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB_DXT1] = _mesa_texstore_rgb_dxt1; 4102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA_DXT1] = _mesa_texstore_rgba_dxt1; 4103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA_DXT3] = _mesa_texstore_rgba_dxt3; 4104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA_DXT5] = _mesa_texstore_rgba_dxt5; 4105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA_FLOAT32] = _mesa_texstore_rgba_float32; 4106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA_FLOAT16] = _mesa_texstore_rgba_float16; 4107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB_FLOAT32] = _mesa_texstore_rgba_float32; 4108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB_FLOAT16] = _mesa_texstore_rgba_float16; 4109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32; 4110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16; 4111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_FLOAT32] = _mesa_texstore_rgba_float32; 4112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_FLOAT16] = _mesa_texstore_rgba_float16; 4113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32] = _mesa_texstore_rgba_float32; 4114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16] = _mesa_texstore_rgba_float16; 4115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_INTENSITY_FLOAT32] = _mesa_texstore_rgba_float32; 4116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_INTENSITY_FLOAT16] = _mesa_texstore_rgba_float16; 4117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_R_FLOAT32] = _mesa_texstore_rgba_float32; 4118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_R_FLOAT16] = _mesa_texstore_rgba_float16; 4119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RG_FLOAT32] = _mesa_texstore_rgba_float32; 4120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RG_FLOAT16] = _mesa_texstore_rgba_float16; 4121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_DUDV8] = _mesa_texstore_dudv8; 4122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_R8] = _mesa_texstore_snorm8; 4123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_RG88_REV] = _mesa_texstore_snorm88; 4124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_RGBX8888] = _mesa_texstore_signed_rgbx8888; 4125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_RGBA8888] = _mesa_texstore_signed_rgba8888; 4126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_RGBA8888_REV] = _mesa_texstore_signed_rgba8888; 4127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_R16] = _mesa_texstore_snorm16; 4128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_GR1616] = _mesa_texstore_snorm1616; 4129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_RGB_16] = _mesa_texstore_signed_rgba_16; 4130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_RGBA_16] = _mesa_texstore_signed_rgba_16; 4131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA_16] = _mesa_texstore_rgba_16; 4132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RED_RGTC1] = _mesa_texstore_red_rgtc1; 4133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_RED_RGTC1] = _mesa_texstore_signed_red_rgtc1; 4134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RG_RGTC2] = _mesa_texstore_rg_rgtc2; 4135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_RG_RGTC2] = _mesa_texstore_signed_rg_rgtc2; 4136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_L_LATC1] = _mesa_texstore_red_rgtc1; 4137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_L_LATC1] = _mesa_texstore_signed_red_rgtc1; 4138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LA_LATC2] = _mesa_texstore_rg_rgtc2; 4139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_LA_LATC2] = _mesa_texstore_signed_rg_rgtc2; 4140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ETC1_RGB8] = _mesa_texstore_etc1_rgb8; 4141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_A8] = _mesa_texstore_snorm8; 4142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_L8] = _mesa_texstore_snorm8; 4143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_AL88] = _mesa_texstore_snorm88; 4144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_I8] = _mesa_texstore_snorm8; 4145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_A16] = _mesa_texstore_snorm16; 4146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_L16] = _mesa_texstore_snorm16; 4147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_AL1616] = _mesa_texstore_snorm1616; 4148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_SIGNED_I16] = _mesa_texstore_snorm16; 4149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB9_E5_FLOAT] = _mesa_texstore_rgb9_e5; 4150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_R11_G11_B10_FLOAT] = _mesa_texstore_r11_g11_b10f; 4151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_Z32_FLOAT] = _mesa_texstore_z32; 4152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_Z32_FLOAT_X24S8] = _mesa_texstore_z32f_x24s8; 4153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ALPHA_UINT8] = _mesa_texstore_rgba_uint8; 4155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ALPHA_UINT16] = _mesa_texstore_rgba_uint16; 4156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ALPHA_UINT32] = _mesa_texstore_rgba_uint32; 4157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ALPHA_INT8] = _mesa_texstore_rgba_int8; 4158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ALPHA_INT16] = _mesa_texstore_rgba_int16; 4159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ALPHA_INT32] = _mesa_texstore_rgba_int32; 4160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_INTENSITY_UINT8] = _mesa_texstore_rgba_uint8; 4162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_INTENSITY_UINT16] = _mesa_texstore_rgba_uint16; 4163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_INTENSITY_UINT32] = _mesa_texstore_rgba_uint32; 4164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_INTENSITY_INT8] = _mesa_texstore_rgba_int8; 4165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_INTENSITY_INT16] = _mesa_texstore_rgba_int16; 4166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_INTENSITY_INT32] = _mesa_texstore_rgba_int32; 4167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_UINT8] = _mesa_texstore_rgba_uint8; 4169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_UINT16] = _mesa_texstore_rgba_uint16; 4170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_UINT32] = _mesa_texstore_rgba_uint32; 4171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_INT8] = _mesa_texstore_rgba_int8; 4172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_INT16] = _mesa_texstore_rgba_int16; 4173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_INT32] = _mesa_texstore_rgba_int32; 4174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_ALPHA_UINT8] = _mesa_texstore_rgba_uint8; 4176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_ALPHA_UINT16] = _mesa_texstore_rgba_uint16; 4177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_ALPHA_UINT32] = _mesa_texstore_rgba_uint32; 4178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_ALPHA_INT8] = _mesa_texstore_rgba_int8; 4179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_ALPHA_INT16] = _mesa_texstore_rgba_int16; 4180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_LUMINANCE_ALPHA_INT32] = _mesa_texstore_rgba_int32; 4181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_R_INT8] = _mesa_texstore_rgba_int8; 4183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RG_INT8] = _mesa_texstore_rgba_int8; 4184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB_INT8] = _mesa_texstore_rgba_int8; 4185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA_INT8] = _mesa_texstore_rgba_int8; 4186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_R_INT16] = _mesa_texstore_rgba_int16; 4187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RG_INT16] = _mesa_texstore_rgba_int16; 4188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB_INT16] = _mesa_texstore_rgba_int16; 4189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA_INT16] = _mesa_texstore_rgba_int16; 4190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_R_INT32] = _mesa_texstore_rgba_int32; 4191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RG_INT32] = _mesa_texstore_rgba_int32; 4192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB_INT32] = _mesa_texstore_rgba_int32; 4193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA_INT32] = _mesa_texstore_rgba_int32; 4194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_R_UINT8] = _mesa_texstore_rgba_uint8; 4196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RG_UINT8] = _mesa_texstore_rgba_uint8; 4197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB_UINT8] = _mesa_texstore_rgba_uint8; 4198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA_UINT8] = _mesa_texstore_rgba_uint8; 4199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_R_UINT16] = _mesa_texstore_rgba_uint16; 4200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RG_UINT16] = _mesa_texstore_rgba_uint16; 4201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB_UINT16] = _mesa_texstore_rgba_uint16; 4202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA_UINT16] = _mesa_texstore_rgba_uint16; 4203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_R_UINT32] = _mesa_texstore_rgba_uint32; 4204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RG_UINT32] = _mesa_texstore_rgba_uint32; 4205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGB_UINT32] = _mesa_texstore_rgba_uint32; 4206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_RGBA_UINT32] = _mesa_texstore_rgba_uint32; 4207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ARGB2101010_UINT] = _mesa_texstore_argb2101010_uint; 4209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org table[MESA_FORMAT_ABGR2101010_UINT] = _mesa_texstore_abgr2101010_uint; 4210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org initialized = GL_TRUE; 4211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(table[format]); 4214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return table[format]; 4215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 4219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Store user data into texture memory. 4220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via glTex[Sub]Image1/2/3D() 4221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean 4223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_texstore(TEXSTORE_PARAMS) 4224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org StoreTexImageFunc storeImage; 4226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean success; 4227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org storeImage = _mesa_get_texstore_func(dstFormat); 4229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org success = storeImage(ctx, dims, baseInternalFormat, 4231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstFormat, 4232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, dstSlices, 4233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcWidth, srcHeight, srcDepth, 4234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcFormat, srcType, srcAddr, srcPacking); 4235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return success; 4236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 4240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Normally, we'll only _write_ texel data to a texture when we map it. 4241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * But if the user is providing depth or stencil values and the texture 4242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * image is a combined depth/stencil format, we'll actually read from 4243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the texture buffer too (in order to insert the depth or stencil values. 4244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param userFormat the user-provided image format 4245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param texFormat the destination texture format 4246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLbitfield 4248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_read_write_mode(GLenum userFormat, gl_format texFormat) 4249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((userFormat == GL_STENCIL_INDEX || userFormat == GL_DEPTH_COMPONENT) 4251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && _mesa_get_format_base_format(texFormat) == GL_DEPTH_STENCIL) 4252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_MAP_READ_BIT | GL_MAP_WRITE_BIT; 4253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 4254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT; 4255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 4259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper function for storing 1D, 2D, 3D whole and subimages into texture 4260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * memory. 4261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The source of the image data may be user memory or a PBO. In the later 4262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * case, we'll map the PBO, copy from it, then unmap it. 4263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 4265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstore_texsubimage(struct gl_context *ctx, 4266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage, 4267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 4268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint width, GLint height, GLint depth, 4269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLenum type, const GLvoid *pixels, 4270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *packing, 4271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *caller) 4272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLbitfield mapMode = get_read_write_mode(format, texImage->TexFormat); 4275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum target = texImage->TexObject->Target; 4276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean success = GL_FALSE; 4277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint dims, slice, numSlices = 1, sliceOffset = 0; 4278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint srcImageStride = 0; 4279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src; 4280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(xoffset + width <= texImage->Width); 4282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(yoffset + height <= texImage->Height); 4283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(zoffset + depth <= texImage->Depth); 4284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 4286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D: 4287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims = 1; 4288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D_ARRAY: 4290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_3D: 4291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims = 3; 4292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 4294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims = 2; 4295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get pointer to src pixels (may be in a pbo which we'll map here) */ 4298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = (const GLubyte *) 4299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_validate_pbo_teximage(ctx, dims, width, height, depth, 4300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type, pixels, packing, caller); 4301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!src) 4302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* compute slice info (and do some sanity checks) */ 4305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 4306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D: 4307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_RECTANGLE: 4308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP: 4309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* one image slice, nothing special needs to be done */ 4310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D: 4312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(height == 1); 4313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(depth == 1); 4314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(yoffset == 0); 4315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(zoffset == 0); 4316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D_ARRAY: 4318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(depth == 1); 4319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(zoffset == 0); 4320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org numSlices = height; 4321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sliceOffset = yoffset; 4322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height = 1; 4323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org yoffset = 0; 4324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcImageStride = _mesa_image_row_stride(packing, width, format, type); 4325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D_ARRAY: 4327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org numSlices = depth; 4328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sliceOffset = zoffset; 4329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth = 1; 4330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zoffset = 0; 4331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcImageStride = _mesa_image_image_stride(packing, width, height, 4332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type); 4333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_3D: 4335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* we'll store 3D images as a series of slices */ 4336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org numSlices = depth; 4337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sliceOffset = zoffset; 4338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcImageStride = _mesa_image_image_stride(packing, width, height, 4339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type); 4340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 4342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(ctx, "Unexpected target 0x%x in store_texsubimage()", target); 4343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(numSlices == 1 || srcImageStride != 0); 4347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (slice = 0; slice < numSlices; slice++) { 4349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstMap; 4350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint dstRowStride; 4351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.MapTextureImage(ctx, texImage, 4353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org slice + sliceOffset, 4354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset, yoffset, width, height, 4355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org mapMode, &dstMap, &dstRowStride); 4356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstMap) { 4357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: we're only storing a 2D (or 1D) slice at a time but we need 4358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to pass the right 'dims' value so that GL_UNPACK_SKIP_IMAGES is 4359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * used for 3D images. 4360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org success = _mesa_texstore(ctx, dims, texImage->_BaseFormat, 4362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->TexFormat, 4363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstRowStride, 4364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dstMap, 4365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, 1, /* w, h, d */ 4366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type, src, packing); 4367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.UnmapTextureImage(ctx, texImage, slice + sliceOffset); 4369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcImageStride; 4372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!success) 4374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 4375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!success) 4378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s", caller); 4379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unmap_teximage_pbo(ctx, packing); 4381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 4386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fallback code for ctx->Driver.TexImage(). 4387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Basically, allocate storage for the texture image, then copy the 4388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * user's image into it. 4389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 4391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_store_teximage(struct gl_context *ctx, 4392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint dims, 4393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage, 4394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLenum type, const GLvoid *pixels, 4395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *packing) 4396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(dims == 1 || dims == 2 || dims == 3); 4398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texImage->Width == 0 || texImage->Height == 0 || texImage->Depth == 0) 4400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* allocate storage for texture data */ 4403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) { 4404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims); 4405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store_texsubimage(ctx, texImage, 4409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, 0, texImage->Width, texImage->Height, texImage->Depth, 4410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type, pixels, packing, "glTexImage"); 4411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 4415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fallback for Driver.TexSubImage(). 4416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 4418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_store_texsubimage(struct gl_context *ctx, GLuint dims, 4419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage, 4420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 4421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint width, GLint height, GLint depth, 4422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLenum type, const void *pixels, 4423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *packing) 4424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org store_texsubimage(ctx, texImage, 4426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset, yoffset, zoffset, width, height, depth, 4427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type, pixels, packing, "glTexSubImage"); 4428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 4432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fallback for Driver.CompressedTexImage() 4433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 4435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_store_compressed_teximage(struct gl_context *ctx, GLuint dims, 4436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage, 4437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei imageSize, const GLvoid *data) 4438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* only 2D compressed images are supported at this time */ 4440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims != 2) { 4441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Unexpected glCompressedTexImage1D/3D call"); 4442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This is pretty simple, because unlike the general texstore path we don't 4446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * have to worry about the usual image unpacking or image transfer 4447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * operations. 4448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(texImage); 4450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(texImage->Width > 0); 4451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(texImage->Height > 0); 4452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(texImage->Depth == 1); 4453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* allocate storage for texture data */ 4455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Driver.AllocTextureImageBuffer(ctx, texImage)) { 4456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D"); 4457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_store_compressed_texsubimage(ctx, dims, texImage, 4461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 0, 0, 0, 4462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->Width, texImage->Height, texImage->Depth, 4463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->TexFormat, 4464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org imageSize, data); 4465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 4469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fallback for Driver.CompressedTexSubImage() 4470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 4472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_store_compressed_texsubimage(struct gl_context *ctx, GLuint dims, 4473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage, 4474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 4475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, GLsizei depth, 4476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, 4477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei imageSize, const GLvoid *data) 4478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint bytesPerRow, dstRowStride, srcRowStride; 4480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint i, rows; 4481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *dstMap; 4482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLubyte *src; 4483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const gl_format texFormat = texImage->TexFormat; 4484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint bw, bh; 4485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims != 2) { 4487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Unexpected 1D/3D compressed texsubimage call"); 4488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_get_format_block_size(texFormat, &bw, &bh); 4492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* get pointer to src pixels (may be in a pbo which we'll map here) */ 4494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org data = _mesa_validate_pbo_compressed_teximage(ctx, imageSize, data, 4495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &ctx->Unpack, 4496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCompressedTexSubImage2D"); 4497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!data) 4498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRowStride = _mesa_format_row_stride(texFormat, width); 4501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src = (const GLubyte *) data; 4502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Map dest texture buffer */ 4504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.MapTextureImage(ctx, texImage, 0, 4505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset, yoffset, width, height, 4506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_MAP_WRITE_BIT | GL_MAP_INVALIDATE_RANGE_BIT, 4507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &dstMap, &dstRowStride); 4508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dstMap) { 4510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bytesPerRow = srcRowStride; /* bytes per row of blocks */ 4511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org rows = (height + bh - 1) / bh; /* rows in blocks */ 4512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* copy rows of blocks */ 4514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < rows; i++) { 4515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org memcpy(dstMap, src, bytesPerRow); 4516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dstMap += dstRowStride; 4517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org src += srcRowStride; 4518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.UnmapTextureImage(ctx, texImage, 0); 4521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 4523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexSubImage2D"); 4524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unmap_teximage_pbo(ctx, &ctx->Unpack); 4527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4528