teximage.c revision f7b5707d66678f09bec652ecce024a0da6cc4a4b
1f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul/* $Id: teximage.c,v 1.20 2000/03/20 14:37:54 brianp Exp $ */ 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 4afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library 5fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul * Version: 3.3 6afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 7663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul * Copyright (C) 1999-2000 Brian Paul All Rights Reserved. 8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"), 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 13afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions: 15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 16afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software. 18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 25afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 26afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 27afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 28afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef PC_HEADER 29afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "all.h" 30afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 31fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h" 32afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h" 33afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "image.h" 34fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "mem.h" 35afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "mmath.h" 36afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "span.h" 37afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "teximage.h" 38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "texstate.h" 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "types.h" 40afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 41afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 42afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 43afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * NOTES: 45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * 46c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Mesa's native texture datatype is GLubyte. Native formats are 47c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * GL_ALPHA, GL_LUMINANCE, GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, GL_RGBA, 48c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * and GL_COLOR_INDEX. 49c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Device drivers are free to implement any internal format they want. 50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 51afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 52afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 53f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul/* 54f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul * Default pixel packing of Mesa's internal texture images: 55f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul */ 56f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paulstatic struct gl_pixelstore_attrib DefaultPacking = { 57f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1, /* Alignment */ 58f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 0, /* RowLength */ 59f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 0, /* SkipPixels */ 60f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 0, /* SkipRows */ 61f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 0, /* ImageHeight */ 62f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 0, /* SkipImages */ 63f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul GL_FALSE, /* SwapBytes */ 64f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul GL_FALSE /* LsbFirst */ 65f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul}; 66f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 67f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 68afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 69afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 70afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Compute log base 2 of n. 71afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * If n isn't an exact power of two return -1. 72afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * If n<0 return -1. 73afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 74fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstatic int 75fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paullogbase2( int n ) 76afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i = 1; 78afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint log2 = 0; 79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (n<0) { 81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return -1; 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg while ( n > i ) { 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg i *= 2; 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg log2++; 87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (i != n) { 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return -1; 90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return log2; 93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Given an internal texture format enum or 1, 2, 3, 4 return the 100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * corresponding _base_ internal format: GL_ALPHA, GL_LUMINANCE, 101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, or GL_RGBA. 102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return -1 if invalid enum. 103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 104fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstatic GLint 105fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Pauldecode_internal_format( GLint format ) 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (format) { 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA: 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA4: 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA8: 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA12: 112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA16: 113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_ALPHA; 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 1: 115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE: 116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE4: 117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE8: 118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE12: 119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE16: 120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_LUMINANCE; 121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 2: 122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE_ALPHA: 123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE4_ALPHA4: 124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE6_ALPHA2: 125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE8_ALPHA8: 126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE12_ALPHA4: 127afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE12_ALPHA12: 128afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE16_ALPHA16: 129afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_LUMINANCE_ALPHA; 130afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY: 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY4: 132afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY8: 133afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY12: 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY16: 135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_INTENSITY; 136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 3: 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB: 138afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_R3_G3_B2: 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB4: 140afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB5: 141afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB8: 142afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB10: 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB12: 144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB16: 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_RGB; 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 4: 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA: 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA2: 149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA4: 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB5_A1: 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA8: 152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB10_A2: 153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA12: 154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA16: 155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_RGBA; 156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX: 157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX1_EXT: 158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX2_EXT: 159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX4_EXT: 160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX8_EXT: 161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX12_EXT: 162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX16_EXT: 163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_COLOR_INDEX; 164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return -1; /* error */ 166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Given an internal texture format enum or 1, 2, 3, 4 return the 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * corresponding _base_ internal format: GL_ALPHA, GL_LUMINANCE, 174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, or GL_RGBA. Return the 175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * number of components for the format. Return -1 if invalid enum. 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 177fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstatic GLint 178fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcomponents_in_intformat( GLint format ) 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (format) { 181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA: 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA4: 183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA8: 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA12: 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA16: 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 1; 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 1: 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE: 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE4: 190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE8: 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE12: 192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE16: 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 1; 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 2: 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE_ALPHA: 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE4_ALPHA4: 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE6_ALPHA2: 198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE8_ALPHA8: 199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE12_ALPHA4: 200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE12_ALPHA12: 201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE16_ALPHA16: 202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 2; 203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY: 204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY4: 205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY8: 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY12: 207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY16: 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 1; 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 3: 210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB: 211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_R3_G3_B2: 212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB4: 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB5: 214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB8: 215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB10: 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB12: 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB16: 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 3; 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 4: 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA: 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA2: 222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA4: 223afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB5_A1: 224afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA8: 225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB10_A2: 226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA12: 227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA16: 228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 4; 229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX: 230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX1_EXT: 231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX2_EXT: 232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX4_EXT: 233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX8_EXT: 234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX12_EXT: 235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX16_EXT: 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return 1; 237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return -1; /* error */ 239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 244fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstruct gl_texture_image * 245fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulgl_alloc_texture_image( void ) 246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 247bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul return CALLOC_STRUCT(gl_texture_image); 248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 252fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 253fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulgl_free_texture_image( struct gl_texture_image *teximage ) 254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (teximage->Data) { 256bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE( teximage->Data ); 25791baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul teximage->Data = NULL; 258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 259bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul FREE( teximage ); 260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 264afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Examine the texImage->Format field and set the Red, Green, Blue, etc 266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * texel component sizes to default values. 267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * These fields are set only here by core Mesa but device drivers may 268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * overwritting these fields to indicate true texel resolution. 269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 270fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstatic void 271fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulset_teximage_component_sizes( struct gl_texture_image *texImage ) 272afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 273afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (texImage->Format) { 274afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA: 275afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->RedBits = 0; 276afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->GreenBits = 0; 277afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->BlueBits = 0; 278afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->AlphaBits = 8; 279afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IntensityBits = 0; 280afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->LuminanceBits = 0; 281afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IndexBits = 0; 282afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 283afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE: 284afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->RedBits = 0; 285afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->GreenBits = 0; 286afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->BlueBits = 0; 287afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->AlphaBits = 0; 288afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IntensityBits = 0; 289afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->LuminanceBits = 8; 290afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IndexBits = 0; 291afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 292afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE_ALPHA: 293afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->RedBits = 0; 294afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->GreenBits = 0; 295afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->BlueBits = 0; 296afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->AlphaBits = 8; 297afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IntensityBits = 0; 298afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->LuminanceBits = 8; 299afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IndexBits = 0; 300afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 301afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY: 302afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->RedBits = 0; 303afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->GreenBits = 0; 304afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->BlueBits = 0; 305afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->AlphaBits = 0; 306afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IntensityBits = 8; 307afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->LuminanceBits = 0; 308afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IndexBits = 0; 309afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 31091baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul case GL_RED: 31191baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->RedBits = 8; 31291baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->GreenBits = 0; 31391baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->BlueBits = 0; 31491baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->AlphaBits = 0; 31591baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->IntensityBits = 0; 31691baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->LuminanceBits = 0; 31791baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->IndexBits = 0; 31891baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul break; 31991baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul case GL_GREEN: 32091baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->RedBits = 0; 32191baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->GreenBits = 8; 32291baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->BlueBits = 0; 32391baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->AlphaBits = 0; 32491baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->IntensityBits = 0; 32591baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->LuminanceBits = 0; 32691baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->IndexBits = 0; 32791baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul break; 32891baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul case GL_BLUE: 32991baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->RedBits = 0; 33091baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->GreenBits = 0; 33191baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->BlueBits = 8; 33291baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->AlphaBits = 0; 33391baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->IntensityBits = 0; 33491baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->LuminanceBits = 0; 33591baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul texImage->IndexBits = 0; 33691baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul break; 337afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB: 338d53573daf7bb53a41c9307339d70cfbba4f3b7a5Brian Paul case GL_BGR: 339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->RedBits = 8; 340afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->GreenBits = 8; 341afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->BlueBits = 8; 342afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->AlphaBits = 0; 343afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IntensityBits = 0; 344afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->LuminanceBits = 0; 345afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IndexBits = 0; 346afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 347afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA: 348d53573daf7bb53a41c9307339d70cfbba4f3b7a5Brian Paul case GL_BGRA: 349d53573daf7bb53a41c9307339d70cfbba4f3b7a5Brian Paul case GL_ABGR_EXT: 350afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->RedBits = 8; 351afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->GreenBits = 8; 352afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->BlueBits = 8; 353afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->AlphaBits = 8; 354afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IntensityBits = 0; 355afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->LuminanceBits = 0; 356afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IndexBits = 0; 357afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 358afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX: 359afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->RedBits = 0; 360afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->GreenBits = 0; 361afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->BlueBits = 0; 362afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->AlphaBits = 0; 363afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IntensityBits = 0; 364afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->LuminanceBits = 0; 365afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IndexBits = 8; 366afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 367afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 368afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_problem(NULL, "unexpected format in set_teximage_component_sizes"); 369afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 370afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 372afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 373afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* Need this to prevent an out-of-bounds memory access when using 374afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * X86 optimized code. 375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#ifdef USE_X86_ASM 377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg# define EXTRA_BYTE 1 378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#else 379afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg# define EXTRA_BYTE 0 380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#endif 381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 383c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 385c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is called by glTexImage[123]D in order to build a gl_texture_image 386c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * object given the client's parameters and image data. 387c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * 388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * NOTES: Width, height and depth should include the border. 389c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * All texture image parameters should have already been error checked. 390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic struct gl_texture_image * 392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulmake_texture_image( GLcontext *ctx, GLint internalFormat, 393c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint width, GLint height, GLint depth, GLint border, 394c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum srcFormat, GLenum srcType, const GLvoid *pixels, 395c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const struct gl_pixelstore_attrib *unpacking) 396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 397c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint components, numPixels; 398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_image *texImage; 399afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 400c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(width > 0); 401c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(height > 0); 402c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(depth > 0); 403c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(border == 0 || border == 1); 404c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(pixels); 405c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(unpacking); 406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 408c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Allocate and initialize the texture_image struct 410c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage = gl_alloc_texture_image(); 412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!texImage) 413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->Format = (GLenum) decode_internal_format(internalFormat); 416afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg set_teximage_component_sizes( texImage ); 417afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IntFormat = (GLenum) internalFormat; 418afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->Border = border; 419c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texImage->Width = width; 420c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texImage->Height = height; 421c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texImage->Depth = depth; 422c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texImage->WidthLog2 = logbase2(width - 2 * border); 423c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (height == 1) /* 1-D texture */ 424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->HeightLog2 = 0; 425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else 426c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texImage->HeightLog2 = logbase2(height - 2 * border); 427c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (depth == 1) /* 2-D texture */ 428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->DepthLog2 = 0; 429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else 430c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texImage->DepthLog2 = logbase2(depth - 2 * border); 431afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->Width2 = 1 << texImage->WidthLog2; 432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->Height2 = 1 << texImage->HeightLog2; 433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->Depth2 = 1 << texImage->DepthLog2; 434c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texImage->MaxLog2 = MAX2(texImage->WidthLog2, texImage->HeightLog2); 435c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul components = components_in_intformat(internalFormat); 437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul numPixels = texImage->Width * texImage->Height * texImage->Depth; 438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 439c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texImage->Data = (GLubyte *) MALLOC(numPixels * components + EXTRA_BYTE); 440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!texImage->Data) { 442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* out of memory */ 443c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_free_texture_image(texImage); 444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 445afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 446afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 448c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 449c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * OK, the texture image struct has been initialized and the texture 450c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * image memory has been allocated. 451c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Now fill in the texture image from the source data. 452c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This includes applying the pixel transfer operations. 453c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 454c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 455c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* try common 2D texture cases first */ 456c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!ctx->Pixel.ScaleOrBiasRGBA && !ctx->Pixel.MapColorFlag 457c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul && !ctx->Pixel.IndexOffset && !ctx->Pixel.IndexShift 458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul && srcType == GL_UNSIGNED_BYTE && depth == 1) { 459c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 460c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcFormat == internalFormat) { 461c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* This will cover the common GL_RGB, GL_RGBA, GL_ALPHA, 462c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * GL_LUMINANCE_ALPHA, etc. texture formats. 463c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 464959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul const GLubyte *src = (const GLubyte *) gl_pixel_addr_in_image(unpacking, 465c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul pixels, width, height, srcFormat, srcType, 0, 0, 0); 466959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul const GLubyte *src1 = (const GLubyte *) gl_pixel_addr_in_image(unpacking, 467c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul pixels, width, height, srcFormat, srcType, 0, 1, 0); 468c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint srcStride = src1 - src; 469c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = texImage->Data; 470c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstBytesPerRow = width * components * sizeof(GLubyte); 471c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (srcStride == dstBytesPerRow) { 472c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dst, src, height * dstBytesPerRow); 473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 474c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 475c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint i; 476c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < height; i++) { 477c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMCPY(dst, src, dstBytesPerRow); 478c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul src += srcStride; 479c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += dstBytesPerRow; 480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 481c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 482c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return texImage; /* all done */ 483c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 484c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (srcFormat == GL_RGBA && internalFormat == GL_RGB) { 485c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* commonly used by Quake */ 486959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul const GLubyte *src = (const GLubyte *) gl_pixel_addr_in_image(unpacking, 487c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul pixels, width, height, srcFormat, srcType, 0, 0, 0); 488959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul const GLubyte *src1 = (const GLubyte *) gl_pixel_addr_in_image(unpacking, 489c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul pixels, width, height, srcFormat, srcType, 0, 1, 0); 490c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint srcStride = src1 - src; 491c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = texImage->Data; 492c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint i, j; 493c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < height; i++) { 494c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLubyte *s = src; 495c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (j = 0; j < width; j++) { 496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *dst++ = *s++; /*red*/ 497c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *dst++ = *s++; /*green*/ 498c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul *dst++ = *s++; /*blue*/ 499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul s++; /*alpha*/ 500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul src += srcStride; 502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 503c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return texImage; /* all done */ 504c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 505c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 508c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 509c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * General case solutions 510c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 511c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (texImage->Format == GL_COLOR_INDEX) { 512c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* color index texture */ 513c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint destBytesPerRow = width * components * sizeof(GLubyte); 514c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLenum dstType = GL_UNSIGNED_BYTE; 515c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dest = texImage->Data; 516c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint img, row; 517c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (img = 0; img < depth; img++) { 518c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (row = 0; row < height; row++) { 519c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLvoid *source = gl_pixel_addr_in_image(unpacking, 520c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul pixels, width, height, srcFormat, srcType, img, row, 0); 521c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul _mesa_unpack_index_span(ctx, width, dstType, dest, 522c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcType, source, unpacking, GL_TRUE); 523c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dest += destBytesPerRow; 524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 525c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 526c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 527c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 528c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* regular, color texture */ 529c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint destBytesPerRow = width * components * sizeof(GLubyte); 530c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLenum dstFormat = texImage->Format; 531c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dest = texImage->Data; 532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint img, row; 533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (img = 0; img < depth; img++) { 534c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (row = 0; row < height; row++) { 535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLvoid *source = gl_pixel_addr_in_image(unpacking, 536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul pixels, width, height, srcFormat, srcType, img, row, 0); 537c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul _mesa_unpack_ubyte_color_span(ctx, width, dstFormat, dest, 538c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul srcFormat, srcType, source, unpacking, GL_TRUE); 539c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dest += destBytesPerRow; 540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return texImage; /* All done! */ 545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 548afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 549afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * glTexImage[123]D can accept a NULL image pointer. In this case we 551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * create a texture image with unspecified image contents per the OpenGL 552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * spec. 553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgstatic struct gl_texture_image * 555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtgmake_null_texture( GLcontext *ctx, GLenum internalFormat, 556afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLsizei width, GLsizei height, GLsizei depth, GLint border ) 557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint components; 559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_image *texImage; 560afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint numPixels; 561afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (void) ctx; 562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /*internalFormat = decode_internal_format(internalFormat);*/ 564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg components = components_in_intformat(internalFormat); 565afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg numPixels = width * height * depth; 566afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 567afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage = gl_alloc_texture_image(); 568afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!texImage) 569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->Format = (GLenum) decode_internal_format(internalFormat); 572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg set_teximage_component_sizes( texImage ); 573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->IntFormat = internalFormat; 574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->Border = border; 575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->Width = width; 576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->Height = height; 577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->Depth = depth; 578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->WidthLog2 = logbase2(width - 2*border); 579afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (height==1) /* 1-D texture */ 580afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->HeightLog2 = 0; 581afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else 582afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->HeightLog2 = logbase2(height - 2*border); 583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (depth==1) /* 2-D texture */ 584afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->DepthLog2 = 0; 585afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else 586afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->DepthLog2 = logbase2(depth - 2*border); 587afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->Width2 = 1 << texImage->WidthLog2; 588afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->Height2 = 1 << texImage->HeightLog2; 589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->Depth2 = 1 << texImage->DepthLog2; 590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texImage->MaxLog2 = MAX2( texImage->WidthLog2, texImage->HeightLog2 ); 591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* XXX should we really allocate memory for the image or let it be NULL? */ 593afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /*texImage->Data = NULL;*/ 594afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 595bd5cdaf4442872d3cd2ff94eeafadd481d27fcfbBrian Paul texImage->Data = (GLubyte *) MALLOC( numPixels * components + EXTRA_BYTE ); 596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 597afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 598afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Let's see if anyone finds this. If glTexImage2D() is called with 599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * a NULL image pointer then load the texture image with something 600afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * interesting instead of leaving it indeterminate. 601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (texImage->Data) { 60365d54604c387dca986c876e811362d8e8517dcacBrian Paul static const char message[8][32] = { 604afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X XXXXX XXX X ", 605afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " XX XX X X X X X ", 606afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X X X X X X ", 607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X XXXX XXX XXXXX ", 608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X X X X X ", 609afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X X X X X X ", 610afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X XXXXX XXX X X ", 611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " " 612afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg }; 613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte *imgPtr = texImage->Data; 615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i, j, k; 616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i=0;i<height;i++) { 617afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint srcRow = 7 - i % 8; 618afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (j=0;j<width;j++) { 619afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint srcCol = j % 32; 6205b37c322741f019118a618bc6220f37adba4fbcdBrian Paul GLint texel = (message[srcRow][srcCol]=='X') ? 255 : 70; 621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (k=0;k<components;k++) { 6225b37c322741f019118a618bc6220f37adba4fbcdBrian Paul *imgPtr++ = (GLubyte) texel; 623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 624afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 627afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 628afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return texImage; 629afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 630afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 631afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 632afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 633afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 634c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Test glTexImage[123]D() parameters for errors. 635afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: 636afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * dimensions - must be 1 or 2 or 3 637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Return: GL_TRUE = an error was detected, GL_FALSE = no errors 638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 639c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean 640c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paultexture_error_check( GLcontext *ctx, GLenum target, 641c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint level, GLint internalFormat, 642c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum format, GLenum type, 6435b37c322741f019118a618bc6220f37adba4fbcdBrian Paul GLuint dimensions, 644c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint width, GLint height, 645c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint depth, GLint border ) 646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLboolean isProxy; 648afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint iformat; 649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (dimensions == 1) { 6515b37c322741f019118a618bc6220f37adba4fbcdBrian Paul isProxy = (GLboolean) (target == GL_PROXY_TEXTURE_1D); 652afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (target != GL_TEXTURE_1D && !isProxy) { 653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_error( ctx, GL_INVALID_ENUM, "glTexImage1D(target)" ); 654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 655afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 656afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (dimensions == 2) { 6585b37c322741f019118a618bc6220f37adba4fbcdBrian Paul isProxy = (GLboolean) (target == GL_PROXY_TEXTURE_2D); 659afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (target != GL_TEXTURE_2D && !isProxy) { 660afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_error( ctx, GL_INVALID_ENUM, "glTexImage2D(target)" ); 661afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 662afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 663afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 664afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (dimensions == 3) { 6655b37c322741f019118a618bc6220f37adba4fbcdBrian Paul isProxy = (GLboolean) (target == GL_PROXY_TEXTURE_3D); 666afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (target != GL_TEXTURE_3D && !isProxy) { 667afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_error( ctx, GL_INVALID_ENUM, "glTexImage3D(target)" ); 668afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 671afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_problem( ctx, "bad dims in texture_error_check" ); 673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 676afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Border */ 677afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (border!=0 && border!=1) { 678afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!isProxy) { 679c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 680c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glTexImage%dD(border)", dimensions); 681c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 682afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Width */ 687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (width < 2 * border || width > 2 + ctx->Const.MaxTextureSize 688afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg || logbase2( width - 2 * border ) < 0) { 689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!isProxy) { 690c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glTexImage%dD(width)", dimensions); 692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 694afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 695afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Height */ 698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (dimensions >= 2) { 699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (height < 2 * border || height > 2 + ctx->Const.MaxTextureSize 700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg || logbase2( height - 2 * border ) < 0) { 701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!isProxy) { 702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glTexImage%dD(height)", dimensions); 704c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 710afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Depth */ 711afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (dimensions >= 3) { 712afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (depth < 2 * border || depth > 2 + ctx->Const.MaxTextureSize 713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg || logbase2( depth - 2 * border ) < 0) { 714afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!isProxy) { 715afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_error( ctx, GL_INVALID_VALUE, "glTexImage3D(depth)" ); 716afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 717afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 718afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 719afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 720afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 721afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Level */ 722afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (level<0 || level>=ctx->Const.MaxTextureLevels) { 723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!isProxy) { 724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 725c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glTexImage%dD(level)", dimensions); 726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 728afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 729afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 731afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg iformat = decode_internal_format( internalFormat ); 732afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (iformat < 0) { 733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!isProxy) { 734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glTexImage%dD(internalFormat)", dimensions); 736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 737c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 741afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!gl_is_legal_format_and_type( format, type )) { 742d53573daf7bb53a41c9307339d70cfbba4f3b7a5Brian Paul /* Yes, generate GL_INVALID_OPERATION, not GL_INVALID_ENUM, if there 743d53573daf7bb53a41c9307339d70cfbba4f3b7a5Brian Paul * is a type/format mismatch. See 1.2 spec page 94, sec 3.6.4. 744d53573daf7bb53a41c9307339d70cfbba4f3b7a5Brian Paul */ 745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!isProxy) { 746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glTexImage%dD(format or type)", dimensions); 748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_OPERATION, message); 749c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* if we get here, the parameters are OK */ 754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 757afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Test glTexSubImage[123]D() parameters for errors. 761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Input: 762c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * dimensions - must be 1 or 2 or 3 763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return: GL_TRUE = an error was detected, GL_FALSE = no errors 764afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 765c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean 766fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulsubtexture_error_check( GLcontext *ctx, GLuint dimensions, 767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum target, GLint level, 768c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint xoffset, GLint yoffset, GLint zoffset, 769c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint width, GLint height, GLint depth, 770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum format, GLenum type ) 771afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 772afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul struct gl_texture_image *destTex; 774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions == 1) { 776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (target != GL_TEXTURE_1D) { 777c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error( ctx, GL_INVALID_ENUM, "glTexSubImage1D(target)" ); 778c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 779afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 781c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (dimensions == 2) { 782c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (target != GL_TEXTURE_2D) { 783c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error( ctx, GL_INVALID_ENUM, "glTexSubImage2D(target)" ); 784c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 786c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 787c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (dimensions == 3) { 788c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (target != GL_TEXTURE_3D) { 789c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error( ctx, GL_INVALID_ENUM, "glTexSubImage3D(target)" ); 790c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 791afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 792c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 793c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 794c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_problem( ctx, "bad dims in texture_error_check" ); 795c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 796c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 797afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 798c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (level < 0 || level >= ctx->Const.MaxTextureLevels) { 799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_ENUM, "glTexSubImage2D(level)"); 800c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 801c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 802afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 803c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width < 0) { 804c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 805c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glTexSubImage%dD(width)", dimensions); 806c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 808c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 809c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (height < 0 && dimensions > 1) { 810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glTexSubImage%dD(height)", dimensions); 812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 814c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 815c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (depth < 0 && dimensions > 2) { 816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glTexSubImage%dD(depth)", dimensions); 818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 819c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 820c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 822c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul destTex = texUnit->CurrentD[2]->Image[level]; 823c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!destTex) { 824c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_OPERATION, "glTexSubImage2D"); 825c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 826c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 827afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 828c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (xoffset < -((GLint)destTex->Border)) { 829c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, "glTexSubImage1/2/3D(xoffset)"); 830c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 831afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 832c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (xoffset + width > (GLint) (destTex->Width + destTex->Border)) { 833c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, "glTexSubImage1/2/3D(xoffset+width)"); 834c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 835c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 836c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 1) { 837c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (yoffset < -((GLint)destTex->Border)) { 838c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, "glTexSubImage2/3D(yoffset)"); 839c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 840afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 841c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (yoffset + height > (GLint) (destTex->Height + destTex->Border)) { 842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, "glTexSubImage2/3D(yoffset+height)"); 843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 844afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 845afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 2) { 847c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (zoffset < -((GLint)destTex->Border)) { 848c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset)"); 849c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 850c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 851c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (zoffset + depth > (GLint) (destTex->Depth+destTex->Border)) { 852c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset+depth)"); 853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!gl_is_legal_format_and_type(format, type)) { 858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glTexSubImage%dD(format or type)", dimensions); 860c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_ENUM, message); 861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 863afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_FALSE; 865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 867afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 868afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Test glCopyTexImage[12]D() parameters for errors. 870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Input: dimensions - must be 1 or 2 or 3 871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return: GL_TRUE = an error was detected, GL_FALSE = no errors 872afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean 874fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcopytexture_error_check( GLcontext *ctx, GLuint dimensions, 875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum target, GLint level, GLint internalFormat, 876c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint width, GLint height, GLint border ) 877afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint iformat; 879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 880c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (target != GL_TEXTURE_1D && target != GL_TEXTURE_2D) { 881c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error( ctx, GL_INVALID_ENUM, "glCopyTexImage1/2D(target)" ); 882c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 883c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions == 1 && target != GL_TEXTURE_1D) { 886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error( ctx, GL_INVALID_ENUM, "glCopyTexImage1D(target)" ); 887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 888c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 889c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (dimensions == 2 && target != GL_TEXTURE_2D) { 890c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error( ctx, GL_INVALID_ENUM, "glCopyTexImage2D(target)" ); 891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 892c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 894c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Border */ 895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (border!=0 && border!=1) { 896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexImage%dD(border)", dimensions); 898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 900c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 901c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 902c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Width */ 903c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width < 2 * border || width > 2 + ctx->Const.MaxTextureSize 904c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul || logbase2( width - 2 * border ) < 0) { 905c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 906c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexImage%dD(width)", dimensions); 907c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 908c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 909c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 910c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 911c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Height */ 912c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions >= 2) { 913c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (height < 2 * border || height > 2 + ctx->Const.MaxTextureSize 914c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul || logbase2( height - 2 * border ) < 0) { 915c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 916c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexImage%dD(height)", dimensions); 917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 921c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 922c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Level */ 923c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (level<0 || level>=ctx->Const.MaxTextureLevels) { 924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexImage%dD(level)", dimensions); 926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 929c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul iformat = decode_internal_format( internalFormat ); 931c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (iformat < 0) { 932c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 933c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexImage%dD(internalFormat)", dimensions); 934c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 935c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 936c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 937c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 938c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* if we get here, the parameters are OK */ 939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_FALSE; 940c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 942c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean 944fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcopytexsubimage_error_check( GLcontext *ctx, GLuint dimensions, 945c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum target, GLint level, 946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint xoffset, GLint yoffset, GLint zoffset, 9475b37c322741f019118a618bc6220f37adba4fbcdBrian Paul GLsizei width, GLsizei height ) 948c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 949c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul struct gl_texture_image *teximage; 951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions == 1 && target != GL_TEXTURE_1D) { 953c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage1D(target)" ); 954c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 955c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 956c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (dimensions == 2 && target != GL_TEXTURE_2D) { 957c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage2D(target)" ); 958c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (dimensions == 3 && target != GL_TEXTURE_3D) { 961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage3D(target)" ); 962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 964c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (level < 0 || level >= ctx->Const.MaxTextureLevels) { 966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 967c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexSubImage%dD(level)", dimensions); 968c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 969c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 970c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 971c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 972c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width < 0) { 973c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 974c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexSubImage%dD(width)", dimensions ); 975c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 976c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 1 && height < 0) { 979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexSubImage%dD(height)", dimensions ); 981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 983c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 984c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 985df6a28d105a31cfdc3c7d52574ef81f9d31bd3bdBrian Paul teximage = texUnit->CurrentD[dimensions]->Image[level]; 986c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!teximage) { 987c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexSubImage%dD(undefined texture)", dimensions); 989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_OPERATION, message); 990c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 991c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 992c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 993c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (xoffset < -((GLint)teximage->Border)) { 994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexSubImage%dD(xoffset)", dimensions); 996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 999c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (xoffset+width > (GLint) (teximage->Width+teximage->Border)) { 1000c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 1001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexSubImage%dD(xoffset+width)", dimensions); 1002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 1003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1004c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1005c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 1) { 1006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (yoffset < -((GLint)teximage->Border)) { 1007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 1008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexSubImage%dD(yoffset)", dimensions); 1009c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 1010c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1011c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1012c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* NOTE: we're adding the border here, not subtracting! */ 1013c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (yoffset+height > (GLint) (teximage->Height+teximage->Border)) { 1014c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 1015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexSubImage%dD(yoffset+height)", dimensions); 1016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 1017c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1018c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1020c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 2) { 1022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (zoffset < -((GLint)teximage->Border)) { 1023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 1024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexSubImage%dD(zoffset)", dimensions); 1025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 1026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1027c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1028c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (zoffset > (GLint) (teximage->Depth+teximage->Border)) { 1029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul char message[100]; 1030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sprintf(message, "glCopyTexSubImage%dD(zoffset+depth)", dimensions); 1031c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error(ctx, GL_INVALID_VALUE, message); 1032c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1033c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* if we get here, the parameters are OK */ 1037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_FALSE; 1038c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 1039c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1043c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul/* 1044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Called from the API. Note that width includes the border. 1045c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 1046fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 1047fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_TexImage1D( GLenum target, GLint level, GLint internalformat, 1048fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLint border, GLenum format, 1049fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum type, const GLvoid *pixels ) 1050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 1051fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1052c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glTexImage1D"); 1053c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (target==GL_TEXTURE_1D) { 1055f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul struct gl_texture_unit *texUnit; 1056c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul struct gl_texture_image *teximage; 1057f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1058c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (texture_error_check( ctx, target, level, internalformat, 1059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul format, type, 1, width, 1, 1, border )) { 1060f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; /* error in texture image was detected */ 1061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1063f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1064f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1065c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* free current texture image, if any */ 1066c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (texUnit->CurrentD[1]->Image[level]) { 1067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_free_texture_image( texUnit->CurrentD[1]->Image[level] ); 1068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1069c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1070c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* make new texture from source image */ 1071c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (pixels) { 1072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul teximage = make_texture_image(ctx, internalformat, width, 1, 1, 1073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul border, format, type, pixels, &ctx->Unpack); 1074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1076c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul teximage = make_null_texture(ctx, (GLenum) internalformat, 1077c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, 1, 1, border); 1078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* install new texture image */ 1081c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texUnit->CurrentD[1]->Image[level] = teximage; 1082c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_put_texobj_on_dirty_list( ctx, texUnit->CurrentD[1] ); 1083c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ctx->NewState |= NEW_TEXTURING; 1084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* tell driver about change */ 1086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (ctx->Driver.TexImage) { 1087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul (*ctx->Driver.TexImage)( ctx, GL_TEXTURE_1D, 1088c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texUnit->CurrentD[1], 1089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul level, internalformat, teximage ); 1090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1091c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1092c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (target==GL_PROXY_TEXTURE_1D) { 1093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Proxy texture: check for errors and update proxy state */ 1094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (texture_error_check( ctx, target, level, internalformat, 1095c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul format, type, 1, width, 1, 1, border )) { 1096c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (level>=0 && level<ctx->Const.MaxTextureLevels) { 1097c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul MEMSET( ctx->Texture.Proxy1D->Image[level], 0, 1098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul sizeof(struct gl_texture_image) ); 1099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1102c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ctx->Texture.Proxy1D->Image[level]->Format = (GLenum) format; 1103c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul set_teximage_component_sizes( ctx->Texture.Proxy1D->Image[level] ); 1104c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ctx->Texture.Proxy1D->Image[level]->IntFormat = (GLenum) internalformat; 1105c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ctx->Texture.Proxy1D->Image[level]->Border = border; 1106c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ctx->Texture.Proxy1D->Image[level]->Width = width; 1107c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ctx->Texture.Proxy1D->Image[level]->Height = 1; 1108c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ctx->Texture.Proxy1D->Image[level]->Depth = 1; 1109c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1110c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1111c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1112c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error( ctx, GL_INVALID_ENUM, "glTexImage1D(target)" ); 1113c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 1114c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1115c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 1116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1118fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 1119fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_TexImage2D( GLenum target, GLint level, GLint internalformat, 1120fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLsizei height, GLint border, 1121fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum format, GLenum type, 1122fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLvoid *pixels ) 1123c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 1124fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1125c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glTexImage2D"); 1126c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1127c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (target==GL_TEXTURE_2D) { 1128f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul struct gl_texture_unit *texUnit; 1129c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul struct gl_texture_image *teximage; 1130f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1131c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (texture_error_check( ctx, target, level, internalformat, 1132c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul format, type, 2, width, height, 1, border )) { 1133f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; /* error in texture image was detected */ 1134c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1135c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1136f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1137f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1138c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* free current texture image, if any */ 1139c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (texUnit->CurrentD[2]->Image[level]) { 1140c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_free_texture_image( texUnit->CurrentD[2]->Image[level] ); 1141c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1142c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1143c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* make new texture from source image */ 1144c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (pixels) { 1145c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul teximage = make_texture_image(ctx, internalformat, width, height, 1, 1146c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul border, format, type, pixels, &ctx->Unpack); 1147c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1148c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1149afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg teximage = make_null_texture(ctx, (GLenum) internalformat, 1150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg width, height, 1, border); 1151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* install new texture image */ 1154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texUnit->CurrentD[2]->Image[level] = teximage; 1155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_put_texobj_on_dirty_list( ctx, texUnit->CurrentD[2] ); 1156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->NewState |= NEW_TEXTURING; 1157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1158afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* tell driver about change */ 1159afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Driver.TexImage) { 1160afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (*ctx->Driver.TexImage)( ctx, GL_TEXTURE_2D, 1161afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texUnit->CurrentD[2], 1162afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg level, internalformat, teximage ); 1163afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1164afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1165afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (target==GL_PROXY_TEXTURE_2D) { 1166afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Proxy texture: check for errors and update proxy state */ 1167afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (texture_error_check( ctx, target, level, internalformat, 1168afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg format, type, 2, width, height, 1, border )) { 1169afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (level>=0 && level<ctx->Const.MaxTextureLevels) { 1170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg MEMSET( ctx->Texture.Proxy2D->Image[level], 0, 1171afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg sizeof(struct gl_texture_image) ); 1172afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1174afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Texture.Proxy2D->Image[level]->Format = (GLenum) format; 1176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg set_teximage_component_sizes( ctx->Texture.Proxy2D->Image[level] ); 1177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Texture.Proxy2D->Image[level]->IntFormat = (GLenum) internalformat; 1178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Texture.Proxy2D->Image[level]->Border = border; 1179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Texture.Proxy2D->Image[level]->Width = width; 1180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Texture.Proxy2D->Image[level]->Height = height; 1181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Texture.Proxy2D->Image[level]->Depth = 1; 1182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_error( ctx, GL_INVALID_ENUM, "glTexImage2D(target)" ); 1186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 1187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Called by the API or display list executor. 1194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Note that width and height include the border. 1195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1196fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 1197fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_TexImage3D( GLenum target, GLint level, GLint internalformat, 1198fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLsizei height, GLsizei depth, 1199fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint border, GLenum format, GLenum type, 1200fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLvoid *pixels ) 1201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1202fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1203f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glTexImage3D"); 1204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1205fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul if (target==GL_TEXTURE_3D_EXT) { 1206f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul struct gl_texture_unit *texUnit; 1207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_image *teximage; 1208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (texture_error_check( ctx, target, level, internalformat, 1209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg format, type, 3, width, height, depth, 1210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg border )) { 1211f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; /* error in texture image was detected */ 1212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1214f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1215f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* free current texture image, if any */ 1217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (texUnit->CurrentD[3]->Image[level]) { 1218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_free_texture_image( texUnit->CurrentD[3]->Image[level] ); 1219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* make new texture from source image */ 1222c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (pixels) { 1223c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul teximage = make_texture_image(ctx, internalformat, width, height, 1224c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul depth, border, format, type, pixels, &ctx->Unpack); 1225afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1226afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1227afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg teximage = make_null_texture(ctx, (GLenum) internalformat, 1228afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg width, height, depth, border); 1229afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1230afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1231afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* install new texture image */ 1232afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texUnit->CurrentD[3]->Image[level] = teximage; 1233afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_put_texobj_on_dirty_list( ctx, texUnit->CurrentD[3] ); 1234afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->NewState |= NEW_TEXTURING; 1235afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* tell driver about change */ 1237afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (ctx->Driver.TexImage) { 1238afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg (*ctx->Driver.TexImage)( ctx, GL_TEXTURE_3D_EXT, 1239afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texUnit->CurrentD[3], 1240afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg level, internalformat, teximage ); 1241afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1242afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1243afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (target==GL_PROXY_TEXTURE_3D_EXT) { 1244afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Proxy texture: check for errors and update proxy state */ 1245afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (texture_error_check( ctx, target, level, internalformat, 1246afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg format, type, 3, width, height, depth, 1247afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg border )) { 1248afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (level>=0 && level<ctx->Const.MaxTextureLevels) { 1249afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg MEMSET( ctx->Texture.Proxy3D->Image[level], 0, 1250afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg sizeof(struct gl_texture_image) ); 1251afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1252afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1253afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1254afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Texture.Proxy3D->Image[level]->Format = (GLenum) format; 1255afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg set_teximage_component_sizes( ctx->Texture.Proxy3D->Image[level] ); 1256afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Texture.Proxy3D->Image[level]->IntFormat = (GLenum) internalformat; 1257afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Texture.Proxy3D->Image[level]->Border = border; 1258afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Texture.Proxy3D->Image[level]->Width = width; 1259afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Texture.Proxy3D->Image[level]->Height = height; 1260afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ctx->Texture.Proxy3D->Image[level]->Depth = depth; 1261afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1262afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1263afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1264c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error( ctx, GL_INVALID_ENUM, "glTexImage3D(target)" ); 1265afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 1266afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1267afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1268afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1269afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1270663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paulvoid 1271663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul_mesa_TexImage3DEXT( GLenum target, GLint level, GLenum internalformat, 1272663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul GLsizei width, GLsizei height, GLsizei depth, 1273663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul GLint border, GLenum format, GLenum type, 1274663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul const GLvoid *pixels ) 1275663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul{ 1276663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul _mesa_TexImage3D(target, level, (GLint) internalformat, width, height, 1277663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul depth, border, format, type, pixels); 1278663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul} 1279663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul 1280663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul 1281f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul/* 1282f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul * Fetch a texture image from the device driver. 1283f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul * Store the results in the given texture object at the given mipmap level. 1284f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul */ 1285f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paulstatic void 1286f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paulget_teximage_from_driver( GLcontext *ctx, GLenum target, GLint level, 1287f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul const struct gl_texture_object *texObj ) 1288f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul{ 1289f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul GLvoid *image; 1290f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul GLenum imgFormat, imgType; 1291f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul GLboolean freeImage; 1292f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul struct gl_texture_image *texImage; 1293f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul GLint destComponents, numPixels, srcBytesPerTexel; 1294f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1295f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (!ctx->Driver.GetTexImage) 1296f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; 1297f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1298f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul image = (*ctx->Driver.GetTexImage)( ctx, target, level, 1299f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul &imgFormat, &imgType, &freeImage); 1300f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (!image) 1301f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; 1302f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1303f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul texImage = texObj->Image[level]; 1304f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul ASSERT(texImage); 1305f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (!texImage) 1306f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; 1307f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1308f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul destComponents = components_in_intformat(texImage->Format); 1309f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul assert(destComponents > 0); 1310f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul numPixels = texImage->Width * texImage->Height * texImage->Depth; 1311f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul assert(numPixels > 0); 1312f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul srcBytesPerTexel = gl_bytes_per_pixel(imgFormat, imgType); 1313f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul assert(srcBytesPerTexel > 0); 1314f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1315f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (!texImage->Data) { 1316f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul /* Allocate memory for the texture image data */ 1317f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul texImage->Data = (GLubyte *) MALLOC(numPixels * destComponents + EXTRA_BYTE); 1318f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1319f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1320f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (imgFormat == texImage->Format && imgType == GL_UNSIGNED_BYTE) { 1321f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul /* We got lucky! The driver's format and type match Mesa's format. */ 1322f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (texImage->Data) { 1323f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul MEMCPY(texImage->Data, image, numPixels * destComponents); 1324f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1325f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1326f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul else { 1327f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul /* Convert the texture image from the driver's format to Mesa's 1328f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul * internal format. 1329f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul */ 1330f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul const GLint width = texImage->Width; 1331f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul const GLint height = texImage->Height; 1332f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul const GLint depth = texImage->Depth; 1333f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul const GLint destBytesPerRow = width * destComponents * sizeof(GLchan); 1334f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul const GLint srcBytesPerRow = width * srcBytesPerTexel; 1335f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul const GLenum dstType = GL_UNSIGNED_BYTE; 1336f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul const GLenum dstFormat = texImage->Format; 1337f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul const GLubyte *srcPtr = (const GLubyte *) image; 1338f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul GLubyte *destPtr = texImage->Data; 1339f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1340f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (texImage->Format == GL_COLOR_INDEX) { 1341f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul /* color index texture */ 1342f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul GLint img, row; 1343f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul assert(imgFormat == GL_COLOR_INDEX); 1344f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul for (img = 0; img < depth; img++) { 1345f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul for (row = 0; row < height; row++) { 1346f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul _mesa_unpack_index_span(ctx, width, dstType, destPtr, 1347f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul imgType, srcPtr, &DefaultPacking, GL_FALSE); 1348f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul destPtr += destBytesPerRow; 1349f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul srcPtr += srcBytesPerRow; 1350f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1351f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1352f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1353f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul else { 1354f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul /* color texture */ 1355f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul GLint img, row; 1356f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul for (img = 0; img < depth; img++) { 1357f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul for (row = 0; row < height; row++) { 1358f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul _mesa_unpack_ubyte_color_span(ctx, width, dstFormat, destPtr, 1359f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul imgFormat, imgType, srcPtr, &DefaultPacking, GL_FALSE); 1360f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul destPtr += destBytesPerRow; 1361f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul srcPtr += srcBytesPerRow; 1362f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1363f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1364f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1365f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1366f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1367f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (freeImage) 1368f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul FREE(image); 1369f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul} 1370f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1371afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1372fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 1373fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_GetTexImage( GLenum target, GLint level, GLenum format, 1374fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum type, GLvoid *pixels ) 1375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1376fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const struct gl_texture_object *texObj; 1378f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul struct gl_texture_image *texImage; 1379f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul GLboolean discardImage; 1380afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1381afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glGetTexImage"); 1382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (level < 0 || level >= ctx->Const.MaxTextureLevels) { 1384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_error( ctx, GL_INVALID_VALUE, "glGetTexImage(level)" ); 1385afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 1386afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1387afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1388afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (gl_sizeof_type(type) <= 0) { 1389afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_error( ctx, GL_INVALID_ENUM, "glGetTexImage(type)" ); 1390afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 1391afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1392afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1393afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (gl_components_in_format(format) <= 0) { 1394afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_error( ctx, GL_INVALID_ENUM, "glGetTexImage(format)" ); 1395afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 1396afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1397afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1398afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (!pixels) 1399f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; 1400afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1401afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (target) { 1402afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_TEXTURE_1D: 1403afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texObj = ctx->Texture.Unit[ctx->Texture.CurrentUnit].CurrentD[1]; 1404afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1405afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_TEXTURE_2D: 1406afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texObj = ctx->Texture.Unit[ctx->Texture.CurrentUnit].CurrentD[2]; 1407afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1408afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_TEXTURE_3D: 1409afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texObj = ctx->Texture.Unit[ctx->Texture.CurrentUnit].CurrentD[3]; 1410afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1411afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1412afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_error( ctx, GL_INVALID_ENUM, "glGetTexImage(target)" ); 1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1415afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1416f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul texImage = texObj->Image[level]; 1417f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (!texImage) { 1418f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul /* invalid mipmap level */ 1419f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; 1420f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1421f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1422f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (!texImage->Data) { 1423f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul /* try to get the texture image from the device driver */ 1424f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul get_teximage_from_driver(ctx, target, level, texObj); 1425f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul discardImage = GL_TRUE; 1426f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1427f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul else { 1428f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul discardImage = GL_FALSE; 1429f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1430f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1431f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (texImage->Data) { 1432afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint width = texImage->Width; 1433afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint height = texImage->Height; 1434afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint row; 1435afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1436afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (row = 0; row < height; row++) { 1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* compute destination address in client memory */ 1438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLvoid *dest = gl_pixel_addr_in_image( &ctx->Unpack, pixels, 1439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg width, height, 1440afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg format, type, 0, row, 0); 1441afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1442afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg assert(dest); 1443afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (texImage->Format == GL_RGBA) { 1444afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const GLubyte *src = texImage->Data + row * width * 4 * sizeof(GLubyte); 1445959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul gl_pack_rgba_span( ctx, width, (CONST GLubyte (*)[4]) src, 1446959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul format, type, dest, 1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg &ctx->Pack, GL_TRUE ); 1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1450afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* fetch RGBA row from texture image then pack it in client mem */ 1451afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte rgba[MAX_WIDTH][4]; 1452afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i; 1453afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg const GLubyte *src; 1454afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg switch (texImage->Format) { 1455afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA: 1456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg src = texImage->Data + row * width * sizeof(GLubyte); 1457afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i = 0; i < width; i++) { 1458afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][RCOMP] = 255; 1459afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][GCOMP] = 255; 1460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][BCOMP] = 255; 1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][ACOMP] = src[i]; 1462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1463afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1464afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE: 1465afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg src = texImage->Data + row * width * sizeof(GLubyte); 1466afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i = 0; i < width; i++) { 1467afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][RCOMP] = src[i]; 1468afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][GCOMP] = src[i]; 1469afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][BCOMP] = src[i]; 1470afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][ACOMP] = 255; 1471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1472afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1473afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE_ALPHA: 1474afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg src = texImage->Data + row * 2 * width * sizeof(GLubyte); 1475afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i = 0; i < width; i++) { 1476afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][RCOMP] = src[i*2+0]; 1477afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][GCOMP] = src[i*2+0]; 1478afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][BCOMP] = src[i*2+0]; 1479afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][ACOMP] = src[i*2+1]; 1480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1482afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY: 1483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg src = texImage->Data + row * width * sizeof(GLubyte); 1484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i = 0; i < width; i++) { 1485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][RCOMP] = src[i]; 1486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][GCOMP] = src[i]; 1487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][BCOMP] = src[i]; 1488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][ACOMP] = 255; 1489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB: 1492afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg src = texImage->Data + row * 3 * width * sizeof(GLubyte); 1493afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg for (i = 0; i < width; i++) { 1494afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][RCOMP] = src[i*3+0]; 1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][GCOMP] = src[i*3+1]; 1496afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][BCOMP] = src[i*3+2]; 1497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rgba[i][ACOMP] = 255; 1498afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1499afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA: 1501afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* this special case should have been handled above! */ 1502afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_problem( ctx, "error 1 in gl_GetTexImage" ); 1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1504afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_COLOR_INDEX: 1505afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_problem( ctx, "GL_COLOR_INDEX not implemented in gl_GetTexImage" ); 1506afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg break; 1507afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg default: 1508afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_problem( ctx, "bad format in gl_GetTexImage" ); 1509afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1510afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg gl_pack_rgba_span( ctx, width, (const GLubyte (*)[4])rgba, 1511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg format, type, dest, &ctx->Pack, GL_TRUE ); 1512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1513afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1514f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1515f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul /* if we got the teximage from the device driver we'll discard it now */ 1516f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (discardImage) { 1517f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul FREE(texImage->Data); 1518f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul texImage->Data = NULL; 1519f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1520afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1521afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1522afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1523afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1524afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1525fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 1526fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_TexSubImage1D( GLenum target, GLint level, 1527fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLsizei width, 1528fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum format, GLenum type, 1529fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLvoid *pixels ) 1530afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1531fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1532c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1533c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul struct gl_texture_image *destTex; 1534afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1535c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (subtexture_error_check(ctx, 1, target, level, xoffset, 0, 0, 1536c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, 1, 1, format, type)) { 1537f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; /* error was detected */ 1538afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1539afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1540c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul destTex = texUnit->CurrentD[1]->Image[level]; 1541c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(destTex); 1542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1543c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width == 0 || !pixels) 1544c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; /* no-op, not an error */ 1545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1547c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 1548c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Replace the texture subimage 1549c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 1550c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1551c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint texComponents = components_in_intformat(destTex->Format); 1552c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLenum texFormat = destTex->Format; 1553c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint xoffsetb = xoffset + destTex->Border; 1554c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = destTex->Data + xoffsetb * texComponents; 1555c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (texFormat == GL_COLOR_INDEX) { 1556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* color index texture */ 1557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLvoid *src = gl_pixel_addr_in_image(&ctx->Unpack, pixels, 1558c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, 1, format, type, 0, 0, 0); 1559c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul _mesa_unpack_index_span(ctx, width, GL_UNSIGNED_BYTE, dst, 1560c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul type, src, &ctx->Unpack, GL_TRUE); 1561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1562c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1563c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* color texture */ 1564c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLvoid *src = gl_pixel_addr_in_image(&ctx->Unpack, pixels, 1565c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, 1, format, type, 0, 0, 0); 1566c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul _mesa_unpack_ubyte_color_span(ctx, width, texFormat, dst, 1567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul format, type, src, &ctx->Unpack, GL_TRUE); 1568c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1569afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1570afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_put_texobj_on_dirty_list( ctx, texUnit->CurrentD[1] ); 1572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1573c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 1574c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Inform device driver of texture image change. 1575c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 1576c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (ctx->Driver.TexSubImage) { 1577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul (*ctx->Driver.TexSubImage)(ctx, GL_TEXTURE_1D, texUnit->CurrentD[1], 1578c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul level, xoffset, 0, width, 1, 1579c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texUnit->CurrentD[1]->Image[level]->IntFormat, 1580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul destTex ); 1581c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1582c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1583c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (ctx->Driver.TexImage) { 1584c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul (*ctx->Driver.TexImage)(ctx, GL_TEXTURE_1D, texUnit->CurrentD[1], 1585c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul level, 1586c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texUnit->CurrentD[1]->Image[level]->IntFormat, 1587c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul destTex ); 1588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1592afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1593fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 1594fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_TexSubImage2D( GLenum target, GLint level, 1595fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLint yoffset, 1596fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLsizei height, 1597fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum format, GLenum type, 1598fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLvoid *pixels ) 1599afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1600fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1601afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1602afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_image *destTex; 1603afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1604c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (subtexture_error_check(ctx, 2, target, level, xoffset, yoffset, 0, 1605c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, 1, format, type)) { 1606f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; /* error was detected */ 1607afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1609c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul destTex = texUnit->CurrentD[2]->Image[level]; 1610c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(destTex); 1611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1612c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width == 0 || height == 0 || !pixels) 1613c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; /* no-op, not an error */ 1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1616c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 1617c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Replace the texture subimage 1618c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 1619c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1620c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint texComponents = components_in_intformat(destTex->Format); 1621c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLenum texFormat = destTex->Format; 1622c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint xoffsetb = xoffset + destTex->Border; 1623c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint yoffsetb = yoffset + destTex->Border; 1624c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = destTex->Data 1625c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul + (yoffsetb * destTex->Width + xoffsetb) * texComponents; 1626c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (texFormat == GL_COLOR_INDEX) { 1627c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* color index texture */ 1628c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint stride = destTex->Width * sizeof(GLubyte); 1629c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint row; 1630c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (row = 0; row < height; row++) { 1631c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLvoid *src = gl_pixel_addr_in_image(&ctx->Unpack, pixels, 1632c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, format, type, 0, row, 0); 1633c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul _mesa_unpack_index_span(ctx, width, GL_UNSIGNED_BYTE, dst, 1634c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul type, src, &ctx->Unpack, GL_TRUE); 1635c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += stride; 1636c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1637afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1638afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1639c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* color texture */ 1640c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint stride = destTex->Width * texComponents * sizeof(GLubyte); 1641c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint row; 1642c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (row = 0; row < height; row++) { 1643c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLvoid *src = gl_pixel_addr_in_image(&ctx->Unpack, pixels, 1644c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, format, type, 0, row, 0); 1645c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul _mesa_unpack_ubyte_color_span(ctx, width, texFormat, dst, 1646c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul format, type, src, &ctx->Unpack, GL_TRUE); 1647c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += stride; 1648c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1649afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1650c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1652c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_put_texobj_on_dirty_list( ctx, texUnit->CurrentD[2] ); 1653c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1654c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 1655c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Inform device driver of texture image change. 1656c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 1657c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (ctx->Driver.TexSubImage) { 1658c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul (*ctx->Driver.TexSubImage)(ctx, GL_TEXTURE_2D, texUnit->CurrentD[2], 1659c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul level, xoffset, yoffset, width, height, 1660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texUnit->CurrentD[2]->Image[level]->IntFormat, 1661c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul destTex ); 1662c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (ctx->Driver.TexImage) { 1665c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul (*ctx->Driver.TexImage)(ctx, GL_TEXTURE_2D, texUnit->CurrentD[2], 1666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul level, 1667c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texUnit->CurrentD[2]->Image[level]->IntFormat, 1668c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul destTex ); 1669afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1670c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 1672afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1673afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1675fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 1676fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_TexSubImage3D( GLenum target, GLint level, 1677fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 1678fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLsizei height, GLsizei depth, 1679fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum format, GLenum type, 1680fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLvoid *pixels ) 1681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1682fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1683afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_unit *texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1684afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg struct gl_texture_image *destTex; 1685afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1686c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (subtexture_error_check(ctx, 3, target, level, xoffset, yoffset, zoffset, 1687c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, depth, format, type)) { 1688f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; /* error was detected */ 1689afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1690afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1691afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg destTex = texUnit->CurrentD[3]->Image[level]; 1692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(destTex); 1693afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1694c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width == 0 || height == 0 || height == 0 || !pixels) 1695c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; /* no-op, not an error */ 1696afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1697c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 1698c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Replace the texture subimage 1699c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 1700c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul { 1701c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint texComponents = components_in_intformat(destTex->Format); 1702c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLenum texFormat = destTex->Format; 170391baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul const GLint xoffsetb = xoffset + destTex->Border; 170491baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul const GLint yoffsetb = yoffset + destTex->Border; 170591baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul const GLint zoffsetb = zoffset + destTex->Border; 1706c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstRectArea = destTex->Width * destTex->Height; 1707c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst = destTex->Data 1708c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul + (zoffsetb * dstRectArea + yoffsetb * destTex->Width + xoffsetb) 1709c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * texComponents; 1710c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1711c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (texFormat == GL_COLOR_INDEX) { 1712c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* color index texture */ 1713c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint stride = destTex->Width * sizeof(GLubyte); 1714c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint img, row; 1715c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (img = 0; img < depth; img++) { 1716c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (row = 0; row < height; row++) { 1717c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLvoid *src = gl_pixel_addr_in_image(&ctx->Unpack, pixels, 1718c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, format, type, img, row, 0); 1719c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul _mesa_unpack_index_span(ctx, width, GL_UNSIGNED_BYTE, dst, 1720c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul type, src, &ctx->Unpack, GL_TRUE); 1721c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += stride; 1722c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1724afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1725afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 1726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* color texture */ 1727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLint stride = destTex->Width * texComponents * sizeof(GLubyte); 1728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint img, row; 1729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (img = 0; img < depth; img++) { 1730c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (row = 0; row < height; row++) { 1731c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul const GLvoid *src = gl_pixel_addr_in_image(&ctx->Unpack, pixels, 1732c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, format, type, img, row, 0); 1733c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul _mesa_unpack_ubyte_color_span(ctx, width, texFormat, dst, 1734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul format, type, src, &ctx->Unpack, GL_TRUE); 1735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += stride; 1736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1740afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_put_texobj_on_dirty_list( ctx, texUnit->CurrentD[1] ); 1742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* 1744c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Inform device driver of texture image change. 1745c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 1746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* XXX todo */ 1747afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1748afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1751afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Read an RGBA image from the frame buffer. 1753c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * This is used by glCopyTexSubImage[12]D(). 1754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Input: ctx - the context 1755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * x, y - lower left corner 1756afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * width, height - size of region to read 1757c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Return: pointer to block of GL_RGBA, GLubyte data. 1758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1759c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLubyte * 1760c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulread_color_image( GLcontext *ctx, GLint x, GLint y, 1761c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLsizei width, GLsizei height ) 1762afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1763c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint stride, i; 1764c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *image, *dst; 1765afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1766959f802dabd4f4347dc0ea925ae687abb6938588Brian Paul image = (GLubyte *) MALLOC(width * height * 4 * sizeof(GLubyte)); 1767c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!image) 1768afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return NULL; 1769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1770afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Select buffer to read from */ 1771cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul (*ctx->Driver.SetReadBuffer)( ctx, ctx->ReadBuffer, 1772cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ctx->Pixel.DriverReadBuffer ); 1773afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1774c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst = image; 1775c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul stride = width * 4 * sizeof(GLubyte); 1776c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0; i < height; i++) { 17773f02f90f943a996d88abc20f74503afbb56a4c98Brian Paul gl_read_rgba_span( ctx, ctx->ReadBuffer, width, x, y + i, 17783f02f90f943a996d88abc20f74503afbb56a4c98Brian Paul (GLubyte (*)[4]) dst ); 1779c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst += stride; 1780c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1781afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1782cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul /* Read from draw buffer (the default) */ 1783cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, 1784cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ctx->Color.DriverDrawBuffer ); 1785afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1786afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return image; 1787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1788afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1789afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1790afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1791fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 1792fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CopyTexImage1D( GLenum target, GLint level, 1793fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum internalFormat, 1794fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint x, GLint y, 1795fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLint border ) 1796afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1797fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1798afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glCopyTexImage1D"); 1799afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1800f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (copytexture_error_check(ctx, 1, target, level, internalFormat, 1801f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul width, 1, border)) 1802f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; 1803f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1804f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA 1805f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul || !ctx->Driver.CopyTexImage1D 1806f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul || !(*ctx->Driver.CopyTexImage1D)(ctx, target, level, 1807f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul internalFormat, x, y, width, border)) 1808f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul { 1809c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *image = read_color_image( ctx, x, y, width, 1 ); 1810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!image) { 1811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error( ctx, GL_OUT_OF_MEMORY, "glCopyTexImage1D" ); 1812c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 1813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 18143ab6bbe6135da26dfe9a9ba880386fdc98f6580aBrian Paul (*ctx->Exec->TexImage1D)( target, level, internalFormat, width, 1815f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul border, GL_RGBA, GL_UNSIGNED_BYTE, image ); 1816c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul FREE(image); 1817afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1818afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1821afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1822fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 1823fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat, 1824fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint x, GLint y, GLsizei width, GLsizei height, 1825fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint border ) 1826afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1827fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1828afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glCopyTexImage2D"); 1829afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1830f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (copytexture_error_check(ctx, 2, target, level, internalFormat, 1831f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul width, height, border)) 1832f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; 1833f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1834f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA 1835f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul || !ctx->Driver.CopyTexImage2D 1836f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul || !(*ctx->Driver.CopyTexImage2D)(ctx, target, level, 1837f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul internalFormat, x, y, width, height, border)) 1838f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul { 1839c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *image = read_color_image( ctx, x, y, width, height ); 1840c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!image) { 1841c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul gl_error( ctx, GL_OUT_OF_MEMORY, "glCopyTexImage2D" ); 1842c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 1843c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 18443ab6bbe6135da26dfe9a9ba880386fdc98f6580aBrian Paul (ctx->Exec->TexImage2D)( target, level, internalFormat, width, 1845f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul height, border, GL_RGBA, GL_UNSIGNED_BYTE, image ); 1846c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul FREE(image); 1847afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1848afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1849afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1850afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1851afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1852afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 1853afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Do the work of glCopyTexSubImage[123]D. 1854afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1855c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic void 1856c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulcopy_tex_sub_image( GLcontext *ctx, struct gl_texture_image *dest, 1857c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint width, GLint height, 1858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint srcx, GLint srcy, 1859c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint dstx, GLint dsty, GLint dstz ) 1860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1861c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul static struct gl_pixelstore_attrib packing = { 1862c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1, /* Alignment */ 1863c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 0, /* RowLength */ 1864c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 0, /* SkipPixels */ 1865c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 0, /* SkipRows */ 1866c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 0, /* ImageHeight */ 1867c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 0, /* SkipImages */ 1868c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GL_FALSE, /* SwapBytes */ 1869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GL_FALSE /* LsbFirst */ 1870c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul }; 1871c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint i; 1873afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint format, components, rectarea; 187491baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul GLint texwidth, texheight, zoffset; 1875afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 187691baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul /* dst[xyz] may be negative if we have a texture border! */ 187791baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul dstx += dest->Border; 187891baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul dsty += dest->Border; 187991baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul dstz += dest->Border; 1880afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texwidth = dest->Width; 1881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg texheight = dest->Height; 1882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg rectarea = texwidth * texheight; 188391baaa3d5a34a0a746dcb70967364a388d5ca438Brian Paul zoffset = dstz * rectarea; 1884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg format = dest->Format; 1885afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg components = components_in_intformat( format ); 1886afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1887afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Select buffer to read from */ 1888cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul (*ctx->Driver.SetReadBuffer)( ctx, ctx->ReadBuffer, 1889cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ctx->Pixel.DriverReadBuffer ); 1890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1891c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul for (i = 0;i < height; i++) { 1892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLubyte rgba[MAX_WIDTH][4]; 1893c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLubyte *dst; 18943f02f90f943a996d88abc20f74503afbb56a4c98Brian Paul gl_read_rgba_span( ctx, ctx->ReadBuffer, width, srcx, srcy + i, rgba ); 1895c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul dst = dest->Data + ( zoffset + (dsty+i) * texwidth + dstx) * components; 1896c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul _mesa_unpack_ubyte_color_span(ctx, width, format, dst, 1897c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GL_RGBA, GL_UNSIGNED_BYTE, rgba, 1898c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul &packing, GL_TRUE); 1899c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1900afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1901cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul /* Read from draw buffer (the default) */ 1902cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul (*ctx->Driver.SetReadBuffer)( ctx, ctx->DrawBuffer, 1903cea0e8e6700e871bb9bcb334cb75fbfbfcdfd702Brian Paul ctx->Color.DriverDrawBuffer ); 1904afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1905afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1906afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1907afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1908afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1909fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 1910fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CopyTexSubImage1D( GLenum target, GLint level, 1911fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLint x, GLint y, GLsizei width ) 1912afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1913fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1914afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glCopyTexSubImage1D"); 1915afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1916f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (copytexsubimage_error_check(ctx, 1, target, level, 1917f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul xoffset, 0, 0, width, 1)) 1918f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; 1919f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1920f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA 1921f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul || !ctx->Driver.CopyTexSubImage1D 1922f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul || !(*ctx->Driver.CopyTexSubImage1D)(ctx, target, level, 1923f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul xoffset, x, y, width)) { 1924c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul struct gl_texture_unit *texUnit; 1925c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul struct gl_texture_image *teximage; 1926c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1927c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul teximage = texUnit->CurrentD[1]->Image[level]; 1928c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(teximage); 1929afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (teximage->Data) { 1930c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul copy_tex_sub_image(ctx, teximage, width, 1, x, y, xoffset, 0, 0); 1931f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul /* tell driver about the change */ 1932f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (ctx->Driver.TexImage) { 1933f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul (*ctx->Driver.TexImage)( ctx, GL_TEXTURE_1D, 1934f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul texUnit->CurrentD[1], 1935f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul level, teximage->IntFormat, teximage ); 1936f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 1937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1938afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1939afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1940afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1941afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1943fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 1944fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CopyTexSubImage2D( GLenum target, GLint level, 1945fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLint yoffset, 1946fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint x, GLint y, GLsizei width, GLsizei height ) 1947afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1948fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glCopyTexSubImage2D"); 1950afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1951f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (copytexsubimage_error_check(ctx, 2, target, level, 1952f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul xoffset, yoffset, 0, width, height)) 1953f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; 1954f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1955f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA 1956f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul || !ctx->Driver.CopyTexSubImage2D 1957f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul || !(*ctx->Driver.CopyTexSubImage2D)(ctx, target, level, 1958f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul xoffset, yoffset, x, y, width, height )) { 1959c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul struct gl_texture_unit *texUnit; 1960c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul struct gl_texture_image *teximage; 1961c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1962c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul teximage = texUnit->CurrentD[2]->Image[level]; 1963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul assert(teximage); 1964afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (teximage->Data) { 1965c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul copy_tex_sub_image(ctx, teximage, width, height, 1966c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul x, y, xoffset, yoffset, 0); 1967f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul /* tell driver about the change */ 1968f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (ctx->Driver.TexImage) { 1969f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul (*ctx->Driver.TexImage)( ctx, GL_TEXTURE_2D, 1970f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul texUnit->CurrentD[2], 1971f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul level, teximage->IntFormat, teximage ); 1972afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1974afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1975afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1976afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1977afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1979fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulvoid 1980fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CopyTexSubImage3D( GLenum target, GLint level, 1981fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 1982fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint x, GLint y, GLsizei width, GLsizei height ) 1983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1984fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 1985c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx, "glCopyTexSubImage3D"); 1986afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1987f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (copytexsubimage_error_check(ctx, 3, target, level, 1988f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul xoffset, yoffset, zoffset, width, height)) 1989f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; 1990f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 1991f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (ctx->Pixel.MapColorFlag || ctx->Pixel.ScaleOrBiasRGBA 1992f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul || !ctx->Driver.CopyTexSubImage3D 1993f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul || !(*ctx->Driver.CopyTexSubImage3D)(ctx, target, level, 1994f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul xoffset, yoffset, zoffset, x, y, width, height )) { 1995f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul struct gl_texture_unit *texUnit; 1996f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul struct gl_texture_image *teximage; 1997f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 1998f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul teximage = texUnit->CurrentD[3]->Image[level]; 1999f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul assert(teximage); 2000f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (teximage->Data) { 2001f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul copy_tex_sub_image(ctx, teximage, width, height, 2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul x, y, xoffset, yoffset, zoffset); 2003f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul /* tell driver about the change */ 2004f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul if (ctx->Driver.TexImage) { 2005f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul (*ctx->Driver.TexImage)( ctx, GL_TEXTURE_3D, 2006f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul texUnit->CurrentD[3], 2007f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul level, teximage->IntFormat, teximage ); 2008f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul } 2009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2010afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2011afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2012