teximage.c revision 5ac93f86210eb5c2a8dee74ec19b0ecd54376863
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 2afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Mesa 3-D graphics library 3df926955be59a0128eea44141eb46fc52556dc05Brian Paul * Version: 6.5.1 45e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 534bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul * Copyright (C) 1999-2006 Brian Paul All Rights Reserved. 65e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 7afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Permission is hereby granted, free of charge, to any person obtaining a 8afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * copy of this software and associated documentation files (the "Software"), 9afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * to deal in the Software without restriction, including without limitation 10afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * and/or sell copies of the Software, and to permit persons to whom the 12afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Software is furnished to do so, subject to the following conditions: 135e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 14afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * The above copyright notice and this permission notice shall be included 15afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * in all copies or substantial portions of the Software. 165e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 17afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 24afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell 26add9f2168a5d6b15eb9955ee761246c4f4cf8458Brian Paul/** 27add9f2168a5d6b15eb9955ee761246c4f4cf8458Brian Paul * \file teximage.c 2877ee31930a1b0cc7766939415f4f04ed6a1fa4acBrian Paul * Texture image-related functions. 29add9f2168a5d6b15eb9955ee761246c4f4cf8458Brian Paul */ 30add9f2168a5d6b15eb9955ee761246c4f4cf8458Brian Paul 31add9f2168a5d6b15eb9955ee761246c4f4cf8458Brian Paul 32fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul#include "glheader.h" 33b46712ca9d379d9c091f5543500088d82cf9776cBrian Paul#include "bufferobj.h" 34afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "context.h" 35f93b3dd69e744cf1dd6b102a11cdb07c2df4a967Brian Paul#include "convolve.h" 3634bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul#include "fbobject.h" 3734bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul#include "framebuffer.h" 38afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "image.h" 393c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 40ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h" 41fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul#include "state.h" 4289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul#include "texcompress.h" 432c3d34c905fa6b831a066afae83b938de05eb241Gareth Hughes#include "texformat.h" 44afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "teximage.h" 45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "texstate.h" 463893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul#include "texstore.h" 475e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 48afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 504cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul/** 514cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul * We allocate texture memory on 512-byte boundaries so we can use MMX/SSE 524cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul * elsewhere. 534cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul */ 544cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paulvoid * 554cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul_mesa_alloc_texmemory(GLsizei bytes) 564cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul{ 574cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul return _mesa_align_malloc(bytes, 512); 584cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul} 594cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul 604cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul 614cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul/** 624cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul * Free texture memory allocated with _mesa_alloc_texmemory() 634cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul */ 644cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paulvoid 654cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul_mesa_free_texmemory(void *m) 664cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul{ 674cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul _mesa_align_free(m); 684cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul} 694cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul 704cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul 714cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul 724cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul 734e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul#if 0 744e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paulstatic void PrintTexture(GLcontext *ctx, const struct gl_texture_image *img) 754827179cc0d314f69671e97dcb016f5a3b90a213Brian Paul{ 76f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#if CHAN_TYPE == GL_FLOAT 77f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul _mesa_problem(NULL, "PrintTexture doesn't support float channels"); 78f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#else 79b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul GLuint i, j, c; 80b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul const GLchan *data = (const GLchan *) img->Data; 81b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul 82b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul if (!data) { 833c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul _mesa_printf("No texture data\n"); 84b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul return; 85b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul } 86b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul 87b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul switch (img->Format) { 88b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul case GL_ALPHA: 89b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul case GL_LUMINANCE: 90b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul case GL_INTENSITY: 91b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul case GL_COLOR_INDEX: 92b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul c = 1; 93b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul break; 94b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul case GL_LUMINANCE_ALPHA: 95b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul c = 2; 96b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul break; 97b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul case GL_RGB: 98b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul c = 3; 99b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul break; 100b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul case GL_RGBA: 101b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul c = 4; 102b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul break; 103b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul default: 104b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul _mesa_problem(NULL, "error in PrintTexture\n"); 105b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul return; 106b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul } 107b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul 108b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul for (i = 0; i < img->Height; i++) { 109b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul for (j = 0; j < img->Width; j++) { 110b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul if (c==1) 1113c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul _mesa_printf("%02x ", data[0]); 112b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul else if (c==2) 1133c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul _mesa_printf("%02x%02x ", data[0], data[1]); 114b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul else if (c==3) 1153c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul _mesa_printf("%02x%02x%02x ", data[0], data[1], data[2]); 116b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul else if (c==4) 1173c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul _mesa_printf("%02x%02x%02x%02x ", data[0], data[1], data[2], data[3]); 118681b8c9d1ba06c8c82e687a5ced369b72e6b1eb9Brian Paul data += (img->RowStride - img->Width) * c; 119b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul } 120ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul /* XXX use img->ImageStride here */ 1213c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul _mesa_printf("\n"); 122b51b0a847d7e7daaea69f77ab569086ef81c24a2Brian Paul } 123f431a3fb4dc1bf860203d79e54657e3a62bc50dfBrian Paul#endif 1244827179cc0d314f69671e97dcb016f5a3b90a213Brian Paul} 1254827179cc0d314f69671e97dcb016f5a3b90a213Brian Paul#endif 1264827179cc0d314f69671e97dcb016f5a3b90a213Brian Paul 1274827179cc0d314f69671e97dcb016f5a3b90a213Brian Paul 128f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul/* 129887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul * Compute floor(log_base_2(n)). 130973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul * If n < 0 return -1. 131afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 132fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulstatic int 133fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paullogbase2( int n ) 134afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 135afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint i = 1; 136afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg GLint log2 = 0; 137afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 138973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul if (n < 0) 139afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return -1; 140973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul 141973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul if (n == 0) 142973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul return 0; 143afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 144afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg while ( n > i ) { 145afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg i *= 2; 146afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg log2++; 147afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 148afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg if (i != n) { 149887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul return log2 - 1; 150afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 151afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 152afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return log2; 153afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 154afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 155afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 156afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 157afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1591749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * Return the simple base format for a given internal texture format. 1601749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * For example, given GL_LUMINANCE12_ALPHA4, return GL_LUMINANCE_ALPHA. 1616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 1631749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * \param internalFormat the internal texture format token or 1, 2, 3, or 4. 1646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 1656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the corresponding \u base internal format (GL_ALPHA, GL_LUMINANCE, 1666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, or GL_RGBA), or -1 if invalid enum. 16789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * 16889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the format which is used during texture application (i.e. the 16989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * texture format and env mode determine the arithmetic used. 170afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 171b132e8da5e5f2b7da1f2141e0322e66bb0608e02Brian PaulGLint 1721749a25ca889d514889b34cf6311c8014d97bf66Brian Paul_mesa_base_tex_format( GLcontext *ctx, GLint internalFormat ) 173afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1741749a25ca889d514889b34cf6311c8014d97bf66Brian Paul switch (internalFormat) { 175afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA: 176afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA4: 177afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA8: 178afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA12: 179afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA16: 180afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_ALPHA; 181afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 1: 182afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE: 183afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE4: 184afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE8: 185afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE12: 186afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE16: 187afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_LUMINANCE; 188afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 2: 189afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE_ALPHA: 190afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE4_ALPHA4: 191afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE6_ALPHA2: 192afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE8_ALPHA8: 193afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE12_ALPHA4: 194afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE12_ALPHA12: 195afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE16_ALPHA16: 196afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_LUMINANCE_ALPHA; 197afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY: 198afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY4: 199afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY8: 200afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY12: 201afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY16: 202afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_INTENSITY; 203afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 3: 204afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB: 205afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_R3_G3_B2: 206afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB4: 207afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB5: 208afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB8: 209afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB10: 210afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB12: 211afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB16: 212afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_RGB; 213afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 4: 214afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA: 215afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA2: 216afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA4: 217afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB5_A1: 218afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA8: 219afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB10_A2: 220afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA12: 221afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA16: 222afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_RGBA; 223f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 224f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ; /* fallthrough */ 225f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 227f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (ctx->Extensions.EXT_paletted_texture) { 228f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul switch (internalFormat) { 229f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COLOR_INDEX: 230f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COLOR_INDEX1_EXT: 231f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COLOR_INDEX2_EXT: 232f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COLOR_INDEX4_EXT: 233f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COLOR_INDEX8_EXT: 234f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COLOR_INDEX12_EXT: 235f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COLOR_INDEX16_EXT: 236e71654961868eac559210ced359c1af114138d8aBrian Paul return GL_COLOR_INDEX; 237f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 238f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ; /* fallthrough */ 239f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 240f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 241f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 2424618a9bfc2cd57c47ddf3590782c751ec194d362Brian Paul if (ctx->Extensions.SGIX_depth_texture || 2434618a9bfc2cd57c47ddf3590782c751ec194d362Brian Paul ctx->Extensions.ARB_depth_texture) { 244f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul switch (internalFormat) { 245f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_DEPTH_COMPONENT: 246f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_DEPTH_COMPONENT16_SGIX: 247f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_DEPTH_COMPONENT24_SGIX: 248f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_DEPTH_COMPONENT32_SGIX: 249f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul return GL_DEPTH_COMPONENT; 250f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 251f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ; /* fallthrough */ 252f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 253f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 25489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 255f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (ctx->Extensions.ARB_texture_compression) { 256f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul switch (internalFormat) { 257f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_ALPHA: 25889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_ALPHA; 259f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_LUMINANCE: 26089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_LUMINANCE; 261f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_LUMINANCE_ALPHA: 26289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_LUMINANCE_ALPHA; 263f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_INTENSITY: 26489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INTENSITY; 265f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_RGB: 26689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_RGB; 267f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_RGBA: 26889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_RGBA; 269f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 270f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ; /* fallthrough */ 271f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 272f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 273f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 274f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (ctx->Extensions.TDFX_texture_compression_FXT1) { 275f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul switch (internalFormat) { 276f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_RGB_FXT1_3DFX: 27789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_RGB; 278f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_RGBA_FXT1_3DFX: 27989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_RGBA; 280f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 281f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ; /* fallthrough */ 282f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 283f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 284f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 285f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (ctx->Extensions.EXT_texture_compression_s3tc) { 286f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul switch (internalFormat) { 2878f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 2888f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul return GL_RGB; 289f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 290f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 291f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 29240bd9d0b190e11d39350d1b08d2c2b28e3040bcaDaniel Borca return GL_RGBA; 293f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 294f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ; /* fallthrough */ 295f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 296f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 297f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 298f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (ctx->Extensions.S3_s3tc) { 299f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul switch (internalFormat) { 300f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGB_S3TC: 301f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGB4_S3TC: 302663a9e1b7ef7b8384abe2f81e1a8749b942f6d3aDaniel Borca return GL_RGB; 303f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGBA_S3TC: 304f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGBA4_S3TC: 305663a9e1b7ef7b8384abe2f81e1a8749b942f6d3aDaniel Borca return GL_RGBA; 306f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 307f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ; /* fallthrough */ 308f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 309f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 31089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 311f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (ctx->Extensions.MESA_ycbcr_texture) { 312f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (internalFormat == GL_YCBCR_MESA) 313f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_YCBCR_MESA; 314f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 3151749a25ca889d514889b34cf6311c8014d97bf66Brian Paul 316f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (ctx->Extensions.ARB_texture_float) { 317f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul switch (internalFormat) { 318f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_ALPHA16F_ARB: 319f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_ALPHA32F_ARB: 320f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_ALPHA; 321f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGBA16F_ARB: 322f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGBA32F_ARB: 323f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_RGBA; 324f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGB16F_ARB: 325f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGB32F_ARB: 326f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_RGB; 327f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_INTENSITY16F_ARB: 328f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_INTENSITY32F_ARB: 329f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_INTENSITY; 330f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_LUMINANCE16F_ARB: 331f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_LUMINANCE32F_ARB: 332f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_LUMINANCE; 333f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_LUMINANCE_ALPHA16F_ARB: 334f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_LUMINANCE_ALPHA32F_ARB: 335f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_LUMINANCE_ALPHA; 336f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 3378f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul ; /* fallthrough */ 338f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 339afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 340f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 3411ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul if (ctx->Extensions.EXT_packed_depth_stencil) { 3421ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul switch (internalFormat) { 3431ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul case GL_DEPTH_STENCIL_EXT: 3441ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul case GL_DEPTH24_STENCIL8_EXT: 3451ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul return GL_DEPTH_STENCIL_EXT; 3461ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul default: 3471ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul ; /* fallthrough */ 3481ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul } 3491ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul } 3501ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul 3510a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul#if FEATURE_EXT_texture_sRGB 3520a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul if (ctx->Extensions.EXT_texture_sRGB) { 3530a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul switch (internalFormat) { 3540a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SRGB_EXT: 3550a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SRGB8_EXT: 3560a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_EXT: 3570a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 3580a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul return GL_RGB; 3590a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SRGB_ALPHA_EXT: 3600a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SRGB8_ALPHA8_EXT: 3610a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_ALPHA_EXT: 3620a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 3630a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 3640a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 3650a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul return GL_RGBA; 3660a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SLUMINANCE_ALPHA_EXT: 3670a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SLUMINANCE8_ALPHA8_EXT: 3680a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SLUMINANCE_EXT: 3690a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 3700a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul return GL_LUMINANCE_ALPHA; 3710a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SLUMINANCE_EXT: 3720a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SLUMINANCE8_EXT: 3730a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul return GL_LUMINANCE; 3740a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul default: 3750a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul ; /* fallthrough */ 3760a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul } 3770a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul } 3780a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul 3790a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul#endif /* FEATURE_EXT_texture_sRGB */ 3800a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul 381f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return -1; /* error */ 382afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 383afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 384afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 3856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 3863405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul * Test if the given image format is a color/RGBA format (i.e., not color 3873405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul * index, depth, stencil, etc). 3883405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul * \param format the image format value (may by an internal texture format) 3891749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * \return GL_TRUE if its a color/RGBA format, GL_FALSE otherwise. 390f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul */ 391f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paulstatic GLboolean 3923405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paulis_color_format(GLenum format) 393f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul{ 3943405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul switch (format) { 395ebe8d3152d864b9f4a0501c868c54e472c9d67a4Brian Paul case GL_RED: 396ebe8d3152d864b9f4a0501c868c54e472c9d67a4Brian Paul case GL_GREEN: 397ebe8d3152d864b9f4a0501c868c54e472c9d67a4Brian Paul case GL_BLUE: 398f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_ALPHA: 399f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_ALPHA4: 400f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_ALPHA8: 401f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_ALPHA12: 402f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_ALPHA16: 403f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case 1: 404f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_LUMINANCE: 405f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_LUMINANCE4: 406f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_LUMINANCE8: 407f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_LUMINANCE12: 408f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_LUMINANCE16: 409f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case 2: 410f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_LUMINANCE_ALPHA: 411f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_LUMINANCE4_ALPHA4: 412f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_LUMINANCE6_ALPHA2: 413f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_LUMINANCE8_ALPHA8: 414f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_LUMINANCE12_ALPHA4: 415f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_LUMINANCE12_ALPHA12: 416f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_LUMINANCE16_ALPHA16: 417f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_INTENSITY: 418f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_INTENSITY4: 419f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_INTENSITY8: 420f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_INTENSITY12: 421f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_INTENSITY16: 422f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case 3: 423f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGB: 424beef59e73aad91ca52d72fd0224e696826038318Brian Paul case GL_BGR: 425f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_R3_G3_B2: 426f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGB4: 427f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGB5: 428f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGB8: 429f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGB10: 430f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGB12: 431f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGB16: 432f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case 4: 433f252f64430ccb957698fcf85e84c9d64008147ebBrian Paul case GL_ABGR_EXT: 434f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGBA: 435beef59e73aad91ca52d72fd0224e696826038318Brian Paul case GL_BGRA: 436f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGBA2: 437f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGBA4: 438f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGB5_A1: 439f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGBA8: 440f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGB10_A2: 441f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGBA12: 442f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_RGBA16: 443f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul /* float texture formats */ 444f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_ALPHA16F_ARB: 445f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_ALPHA32F_ARB: 446f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_LUMINANCE16F_ARB: 447f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_LUMINANCE32F_ARB: 448f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_LUMINANCE_ALPHA16F_ARB: 449f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_LUMINANCE_ALPHA32F_ARB: 450f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_INTENSITY16F_ARB: 451f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_INTENSITY32F_ARB: 452f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGB16F_ARB: 453f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGB32F_ARB: 454f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGBA16F_ARB: 455f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGBA32F_ARB: 4563405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul /* compressed formats */ 4573405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul case GL_COMPRESSED_ALPHA: 4583405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul case GL_COMPRESSED_LUMINANCE: 4593405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul case GL_COMPRESSED_LUMINANCE_ALPHA: 4603405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul case GL_COMPRESSED_INTENSITY: 4613405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul case GL_COMPRESSED_RGB: 4623405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul case GL_COMPRESSED_RGBA: 463997e81fe75ce32ed3d8bb4d8f73a226644cf3a2fRoland Scheidegger case GL_RGB_S3TC: 464997e81fe75ce32ed3d8bb4d8f73a226644cf3a2fRoland Scheidegger case GL_RGB4_S3TC: 465997e81fe75ce32ed3d8bb4d8f73a226644cf3a2fRoland Scheidegger case GL_RGBA_S3TC: 466997e81fe75ce32ed3d8bb4d8f73a226644cf3a2fRoland Scheidegger case GL_RGBA4_S3TC: 4673405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 4683405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 4693405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 4703405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 4713405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul case GL_COMPRESSED_RGB_FXT1_3DFX: 4723405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul case GL_COMPRESSED_RGBA_FXT1_3DFX: 4730a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul#if FEATURE_EXT_texture_sRGB 4740a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SRGB_EXT: 4750a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SRGB8_EXT: 4760a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SRGB_ALPHA_EXT: 4770a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SRGB8_ALPHA8_EXT: 4780a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SLUMINANCE_ALPHA_EXT: 4790a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SLUMINANCE8_ALPHA8_EXT: 4800a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SLUMINANCE_EXT: 4810a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SLUMINANCE8_EXT: 4820a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_EXT: 4830a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 4840a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_ALPHA_EXT: 4850a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 4860a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 4870a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 4880a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SLUMINANCE_EXT: 4890a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 4900a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul#endif /* FEATURE_EXT_texture_sRGB */ 491f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul return GL_TRUE; 492c5b995066020191982b2315fc45d05e068eee761Brian Paul case GL_YCBCR_MESA: /* not considered to be RGB */ 493f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul default: 494f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul return GL_FALSE; 495f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul } 496f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul} 497f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul 498f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul 4996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 5003405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul * Test if the given image format is a color index format. 5016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 502f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paulstatic GLboolean 5033405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paulis_index_format(GLenum format) 504f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul{ 5053405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul switch (format) { 506f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_COLOR_INDEX: 507f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_COLOR_INDEX1_EXT: 508f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_COLOR_INDEX2_EXT: 509f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_COLOR_INDEX4_EXT: 510f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_COLOR_INDEX8_EXT: 511f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_COLOR_INDEX12_EXT: 512f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul case GL_COLOR_INDEX16_EXT: 513f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul return GL_TRUE; 514f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul default: 515f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul return GL_FALSE; 516f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul } 517f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul} 518f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul 519afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 52089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 5213405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul * Test if the given image format is a depth component format. 5221749a25ca889d514889b34cf6311c8014d97bf66Brian Paul */ 5231749a25ca889d514889b34cf6311c8014d97bf66Brian Paulstatic GLboolean 5243405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paulis_depth_format(GLenum format) 5251749a25ca889d514889b34cf6311c8014d97bf66Brian Paul{ 5263405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul switch (format) { 5271749a25ca889d514889b34cf6311c8014d97bf66Brian Paul case GL_DEPTH_COMPONENT16_ARB: 5281749a25ca889d514889b34cf6311c8014d97bf66Brian Paul case GL_DEPTH_COMPONENT24_ARB: 5291749a25ca889d514889b34cf6311c8014d97bf66Brian Paul case GL_DEPTH_COMPONENT32_ARB: 5301749a25ca889d514889b34cf6311c8014d97bf66Brian Paul case GL_DEPTH_COMPONENT: 5311749a25ca889d514889b34cf6311c8014d97bf66Brian Paul return GL_TRUE; 5321749a25ca889d514889b34cf6311c8014d97bf66Brian Paul default: 5331749a25ca889d514889b34cf6311c8014d97bf66Brian Paul return GL_FALSE; 5341749a25ca889d514889b34cf6311c8014d97bf66Brian Paul } 5351749a25ca889d514889b34cf6311c8014d97bf66Brian Paul} 5361749a25ca889d514889b34cf6311c8014d97bf66Brian Paul 5371749a25ca889d514889b34cf6311c8014d97bf66Brian Paul 5381749a25ca889d514889b34cf6311c8014d97bf66Brian Paul/** 5393405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul * Test if the given image format is a YCbCr format. 5401749a25ca889d514889b34cf6311c8014d97bf66Brian Paul */ 5411749a25ca889d514889b34cf6311c8014d97bf66Brian Paulstatic GLboolean 5423405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paulis_ycbcr_format(GLenum format) 5431749a25ca889d514889b34cf6311c8014d97bf66Brian Paul{ 5443405708e21ae36ce3ea92bbaea900bacc70a0034Brian Paul switch (format) { 5451749a25ca889d514889b34cf6311c8014d97bf66Brian Paul case GL_YCBCR_MESA: 5461749a25ca889d514889b34cf6311c8014d97bf66Brian Paul return GL_TRUE; 5471749a25ca889d514889b34cf6311c8014d97bf66Brian Paul default: 5481749a25ca889d514889b34cf6311c8014d97bf66Brian Paul return GL_FALSE; 5491749a25ca889d514889b34cf6311c8014d97bf66Brian Paul } 5501749a25ca889d514889b34cf6311c8014d97bf66Brian Paul} 5511749a25ca889d514889b34cf6311c8014d97bf66Brian Paul 5521749a25ca889d514889b34cf6311c8014d97bf66Brian Paul 5531749a25ca889d514889b34cf6311c8014d97bf66Brian Paul/** 5541ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul * Test if the given image format is a Depth/Stencil format. 5551ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul */ 5561ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paulstatic GLboolean 5571ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paulis_depthstencil_format(GLenum format) 5581ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul{ 5591ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul switch (format) { 5601ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul case GL_DEPTH24_STENCIL8_EXT: 5611ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul case GL_DEPTH_STENCIL_EXT: 5621ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul return GL_TRUE; 5631ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul default: 5641ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul return GL_FALSE; 5651ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul } 5661ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul} 5671ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul 5681ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul 5691ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul 5701ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul/** 5716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Test if it is a supported compressed format. 5726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param internalFormat the internal format token provided by the user. 5746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \ret GL_TRUE if \p internalFormat is a supported compressed format, or 5766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * GL_FALSE otherwise. 5776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Currently only GL_COMPRESSED_RGB_FXT1_3DFX and GL_COMPRESSED_RGBA_FXT1_3DFX 5796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * are supported. 580aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul */ 581aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paulstatic GLboolean 58240bd9d0b190e11d39350d1b08d2c2b28e3040bcaDaniel Borcais_compressed_format(GLcontext *ctx, GLenum internalFormat) 583aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul{ 584c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul GLint supported[100]; /* 100 should be plenty */ 585c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul GLuint i, n; 586c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul 587008ed1df83735c72c2731c509a3665938d3c7209Brian Paul n = _mesa_get_compressed_formats(ctx, supported, GL_TRUE); 588c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul ASSERT(n < 100); 589c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul for (i = 0; i < n; i++) { 590c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul if ((GLint) internalFormat == supported[i]) { 591e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul return GL_TRUE; 592c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul } 593e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul } 594c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul return GL_FALSE; 595aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul} 596aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 597aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 598519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paulstatic GLuint 599519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paultexture_face(GLenum target) 600519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul{ 601519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB && 602519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) 603519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul return (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X; 604519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul else 605519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul return 0; 606519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul} 607519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 608519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 609519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 6106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 6118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Store a gl_texture_image pointer in a gl_texture_object structure 6128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * according to the target and level parameters. 6136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 6146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param tObj texture object. 6156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target. 6166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level. 6176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texImage texture image. 6186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 6198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * This was basically prompted by the introduction of cube maps. 620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 6213893e638e6521b9c070e01c0b31d22754ff97a88Brian Paulvoid 6223893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul_mesa_set_tex_image(struct gl_texture_object *tObj, 6233893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul GLenum target, GLint level, 6243893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul struct gl_texture_image *texImage) 625fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul{ 626fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul ASSERT(tObj); 627fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul ASSERT(texImage); 628fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul switch (target) { 6299228e17bb5bf219269daeed5cbfdd912c118e926Brian Paul case GL_TEXTURE_1D: 630fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_2D: 6319228e17bb5bf219269daeed5cbfdd912c118e926Brian Paul case GL_TEXTURE_3D: 63218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell tObj->Image[0][level] = texImage; 633a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul break; 634fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 635fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 636fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 637fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 638fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 6390d22b9054094c863062c7787b45e1fb4d3834a67Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 6400d22b9054094c863062c7787b45e1fb4d3834a67Brian Paul { 6410d22b9054094c863062c7787b45e1fb4d3834a67Brian Paul GLuint face = ((GLuint) target - 6420d22b9054094c863062c7787b45e1fb4d3834a67Brian Paul (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X); 6430d22b9054094c863062c7787b45e1fb4d3834a67Brian Paul tObj->Image[face][level] = texImage; 6440d22b9054094c863062c7787b45e1fb4d3834a67Brian Paul } 6450d22b9054094c863062c7787b45e1fb4d3834a67Brian Paul break; 6468afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul case GL_TEXTURE_RECTANGLE_NV: 6478afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul ASSERT(level == 0); 64818fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell tObj->Image[0][level] = texImage; 649a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul break; 650fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul default: 6513893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul _mesa_problem(NULL, "bad target in _mesa_set_tex_image()"); 652fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul return; 653fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 654a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* Set the 'back' pointer */ 655a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul texImage->TexObject = tObj; 656fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul} 657fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul 658fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul 659a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/** 6606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Allocate a texture image structure. 6616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 662a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * Called via ctx->Driver.NewTextureImage() unless overriden by a device 663a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * driver. 6646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 6656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return a pointer to gl_texture_image struct with all fields initialized to 6666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * zero. 66777ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul */ 66877ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paulstruct gl_texture_image * 669a3f137094cd965d27e1b088499dd609b81a91906Brian Paul_mesa_new_texture_image( GLcontext *ctx ) 67077ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul{ 671a3f137094cd965d27e1b088499dd609b81a91906Brian Paul (void) ctx; 67277ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul return CALLOC_STRUCT(gl_texture_image); 67377ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul} 67477ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul 67577ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul 676a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/** 6773e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell * Free texture image data. 6784cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul * This function is a fallback called via ctx->Driver.FreeTexImageData(). 6793e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell * 6803e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell * \param teximage texture image. 6813e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell * 6823e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell * Free the texture image data if it's not marked as client data. 6833e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell */ 6843e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwellvoid 6854cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul_mesa_free_texture_image_data(GLcontext *ctx, 6864cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul struct gl_texture_image *texImage) 6873e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell{ 688c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul (void) ctx; 689c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul 6903e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell if (texImage->Data && !texImage->IsClientData) { 6913e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell /* free the old texture data */ 6924cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul _mesa_free_texmemory(texImage->Data); 6933e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell } 6943e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell 6953e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell texImage->Data = NULL; 6963e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell} 6973e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell 6983e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell 6993e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell/** 7006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Free texture image. 7016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param teximage texture image. 7036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7043e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell * Free the texture image structure and the associated image data. 705a3f137094cd965d27e1b088499dd609b81a91906Brian Paul */ 70677ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paulvoid 7073e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell_mesa_delete_texture_image( GLcontext *ctx, struct gl_texture_image *texImage ) 70877ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul{ 7095ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* Free texImage->Data and/or any other driver-specific texture 7105ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell * image storage. 7115ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell */ 7125ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.FreeTexImageData); 7135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->Driver.FreeTexImageData( ctx, texImage ); 7145ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 7153e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell ASSERT(texImage->Data == NULL); 716b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul if (texImage->ImageOffsets) 717b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul _mesa_free(texImage->ImageOffsets); 718b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul _mesa_free(texImage); 71977ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul} 72077ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul 72177ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul 7226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 7236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Test if a target is a proxy target. 7246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target. 7266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if the target is a proxy target, GL_FALSE otherwise. 728aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul */ 72977ee31930a1b0cc7766939415f4f04ed6a1fa4acBrian PaulGLboolean 73077ee31930a1b0cc7766939415f4f04ed6a1fa4acBrian Paul_mesa_is_proxy_texture(GLenum target) 731aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul{ 7328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul return (target == GL_PROXY_TEXTURE_1D || 7338e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul target == GL_PROXY_TEXTURE_2D || 7348e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul target == GL_PROXY_TEXTURE_3D || 73527f4484fb73ac7bf4f790ca2d3efd50b6bea25c3Brian Paul target == GL_PROXY_TEXTURE_CUBE_MAP_ARB || 73627f4484fb73ac7bf4f790ca2d3efd50b6bea25c3Brian Paul target == GL_PROXY_TEXTURE_RECTANGLE_NV); 737aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul} 738aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 739aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 7406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 7416dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the texture object that corresponds to the target of the given texture unit. 7426dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 7446dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texUnit texture unit. 7456dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target. 7466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return pointer to the texture object on success, or NULL on failure. 7486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_texture_unit. 75035d5301a54153930ee6fd60dff1010ce9f901397Brian Paul */ 75135d5301a54153930ee6fd60dff1010ce9f901397Brian Paulstruct gl_texture_object * 75201e54753ff2bc1831359b04a1906f462d39f33e1Brian Paul_mesa_select_tex_object(GLcontext *ctx, const struct gl_texture_unit *texUnit, 75335d5301a54153930ee6fd60dff1010ce9f901397Brian Paul GLenum target) 75435d5301a54153930ee6fd60dff1010ce9f901397Brian Paul{ 75535d5301a54153930ee6fd60dff1010ce9f901397Brian Paul switch (target) { 75635d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_1D: 757a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul return texUnit->Current1D; 75835d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_PROXY_TEXTURE_1D: 75935d5301a54153930ee6fd60dff1010ce9f901397Brian Paul return ctx->Texture.Proxy1D; 76035d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_2D: 761a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul return texUnit->Current2D; 76235d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_PROXY_TEXTURE_2D: 76335d5301a54153930ee6fd60dff1010ce9f901397Brian Paul return ctx->Texture.Proxy2D; 76435d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_3D: 765a852378a6289d154364dde440f89a39bbfc33e2dBrian Paul return texUnit->Current3D; 76635d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_PROXY_TEXTURE_3D: 76735d5301a54153930ee6fd60dff1010ce9f901397Brian Paul return ctx->Texture.Proxy3D; 76835d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 76935d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 77035d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 77135d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 77235d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 77335d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 7745ff4075a6961b26042dc2d7f4adcf333439823f4Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 775a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell return ctx->Extensions.ARB_texture_cube_map 77635d5301a54153930ee6fd60dff1010ce9f901397Brian Paul ? texUnit->CurrentCubeMap : NULL; 77735d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_PROXY_TEXTURE_CUBE_MAP_ARB: 778a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell return ctx->Extensions.ARB_texture_cube_map 77935d5301a54153930ee6fd60dff1010ce9f901397Brian Paul ? ctx->Texture.ProxyCubeMap : NULL; 7808afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul case GL_TEXTURE_RECTANGLE_NV: 7818afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul return ctx->Extensions.NV_texture_rectangle 7828afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul ? texUnit->CurrentRect : NULL; 7838afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul case GL_PROXY_TEXTURE_RECTANGLE_NV: 7848afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul return ctx->Extensions.NV_texture_rectangle 7858afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul ? ctx->Texture.ProxyRect : NULL; 78635d5301a54153930ee6fd60dff1010ce9f901397Brian Paul default: 78708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad target in _mesa_select_tex_object()"); 78835d5301a54153930ee6fd60dff1010ce9f901397Brian Paul return NULL; 78935d5301a54153930ee6fd60dff1010ce9f901397Brian Paul } 79035d5301a54153930ee6fd60dff1010ce9f901397Brian Paul} 79135d5301a54153930ee6fd60dff1010ce9f901397Brian Paul 79235d5301a54153930ee6fd60dff1010ce9f901397Brian Paul 7936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 7946dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the texture image struct which corresponds to target and level 7956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * of the given texture unit. 7966dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7976dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 7986dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texUnit texture unit. 7996dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target. 8006dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level. 8016dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 8026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return pointer to the texture image structure on success, or NULL on failure. 8036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 8046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_texture_unit. 805fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul */ 806fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paulstruct gl_texture_image * 8075ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell_mesa_select_tex_image(GLcontext *ctx, const struct gl_texture_object *texObj, 8085ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLenum target, GLint level) 809fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul{ 8105ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texObj); 8115ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 8125ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (level < 0 || level >= MAX_TEXTURE_LEVELS) 8135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return NULL; 8145ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 815fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul switch (target) { 816fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_1D: 817fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_PROXY_TEXTURE_1D: 818fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_2D: 819fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_PROXY_TEXTURE_2D: 820fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_3D: 821fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_PROXY_TEXTURE_3D: 8225ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return texObj->Image[0][level]; 8235ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 824fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 825fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 826fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 827fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 828fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 82918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 83018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell if (ctx->Extensions.ARB_texture_cube_map) { 83118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell GLuint face = ((GLuint) target - 83218fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X); 8335ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return texObj->Image[face][level]; 83418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell } 835fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul else 836fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul return NULL; 8375ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 838fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul case GL_PROXY_TEXTURE_CUBE_MAP_ARB: 839a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell if (ctx->Extensions.ARB_texture_cube_map) 8405ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return texObj->Image[0][level]; 841fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul else 842fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul return NULL; 8435ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 8448afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul case GL_TEXTURE_RECTANGLE_NV: 8458afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul case GL_PROXY_TEXTURE_RECTANGLE_NV: 8465ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (ctx->Extensions.NV_texture_rectangle && level == 0) 8475ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return texObj->Image[0][level]; 8485ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell else 8498afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul return NULL; 8505ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 851fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul default: 852fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul return NULL; 853fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 854fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul} 855fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul 856fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul 857a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/** 858a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * Like _mesa_select_tex_image() but if the image doesn't exist, allocate 859a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * it and install it. Only return NULL if passed a bad parameter or run 860a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * out of memory. 861a3f137094cd965d27e1b088499dd609b81a91906Brian Paul */ 862a3f137094cd965d27e1b088499dd609b81a91906Brian Paulstruct gl_texture_image * 8635ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell_mesa_get_tex_image(GLcontext *ctx, struct gl_texture_object *texObj, 864a3f137094cd965d27e1b088499dd609b81a91906Brian Paul GLenum target, GLint level) 865a3f137094cd965d27e1b088499dd609b81a91906Brian Paul{ 866a3f137094cd965d27e1b088499dd609b81a91906Brian Paul struct gl_texture_image *texImage; 8675ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 8685ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texObj) 8695ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return NULL; 8705ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 8715ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 872a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 873a3f137094cd965d27e1b088499dd609b81a91906Brian Paul texImage = ctx->Driver.NewTextureImage(ctx); 874a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 875a3f137094cd965d27e1b088499dd609b81a91906Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "texture image allocation"); 876a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 877a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 8785ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 879a3f137094cd965d27e1b088499dd609b81a91906Brian Paul _mesa_set_tex_image(texObj, target, level, texImage); 880a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 8815ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 882a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return texImage; 883a3f137094cd965d27e1b088499dd609b81a91906Brian Paul} 884a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 885a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 886a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/** 887a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * Return pointer to the specified proxy texture image. 888a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * Note that proxy textures are per-context, not per-texture unit. 889a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * \return pointer to texture image or NULL if invalid target, invalid 890a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * level, or out of memory. 891a3f137094cd965d27e1b088499dd609b81a91906Brian Paul */ 892a3f137094cd965d27e1b088499dd609b81a91906Brian Paulstruct gl_texture_image * 893a3f137094cd965d27e1b088499dd609b81a91906Brian Paul_mesa_get_proxy_tex_image(GLcontext *ctx, GLenum target, GLint level) 894a3f137094cd965d27e1b088499dd609b81a91906Brian Paul{ 895a3f137094cd965d27e1b088499dd609b81a91906Brian Paul struct gl_texture_image *texImage; 896a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 897a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (level < 0 ) 898a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 899a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 900a3f137094cd965d27e1b088499dd609b81a91906Brian Paul switch (target) { 901a3f137094cd965d27e1b088499dd609b81a91906Brian Paul case GL_PROXY_TEXTURE_1D: 902a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (level >= ctx->Const.MaxTextureLevels) 903a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 90418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell texImage = ctx->Texture.Proxy1D->Image[0][level]; 905a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 906a3f137094cd965d27e1b088499dd609b81a91906Brian Paul texImage = ctx->Driver.NewTextureImage(ctx); 907a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 908a3f137094cd965d27e1b088499dd609b81a91906Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "proxy texture allocation"); 909a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 910a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 91118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell ctx->Texture.Proxy1D->Image[0][level] = texImage; 912a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* Set the 'back' pointer */ 913a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul texImage->TexObject = ctx->Texture.Proxy1D; 914a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 915a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return texImage; 916a3f137094cd965d27e1b088499dd609b81a91906Brian Paul case GL_PROXY_TEXTURE_2D: 917a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (level >= ctx->Const.MaxTextureLevels) 918a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 91918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell texImage = ctx->Texture.Proxy2D->Image[0][level]; 920a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 921a3f137094cd965d27e1b088499dd609b81a91906Brian Paul texImage = ctx->Driver.NewTextureImage(ctx); 922a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 923a3f137094cd965d27e1b088499dd609b81a91906Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "proxy texture allocation"); 924a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 925a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 92618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell ctx->Texture.Proxy2D->Image[0][level] = texImage; 927a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* Set the 'back' pointer */ 928a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul texImage->TexObject = ctx->Texture.Proxy2D; 929a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 930a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return texImage; 931a3f137094cd965d27e1b088499dd609b81a91906Brian Paul case GL_PROXY_TEXTURE_3D: 932a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (level >= ctx->Const.Max3DTextureLevels) 933a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 93418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell texImage = ctx->Texture.Proxy3D->Image[0][level]; 935a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 936a3f137094cd965d27e1b088499dd609b81a91906Brian Paul texImage = ctx->Driver.NewTextureImage(ctx); 937a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 938a3f137094cd965d27e1b088499dd609b81a91906Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "proxy texture allocation"); 939a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 940a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 94118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell ctx->Texture.Proxy3D->Image[0][level] = texImage; 942a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* Set the 'back' pointer */ 943a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul texImage->TexObject = ctx->Texture.Proxy3D; 944a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 945a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return texImage; 946a3f137094cd965d27e1b088499dd609b81a91906Brian Paul case GL_PROXY_TEXTURE_CUBE_MAP: 947a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (level >= ctx->Const.MaxCubeTextureLevels) 948a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 94918fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell texImage = ctx->Texture.ProxyCubeMap->Image[0][level]; 950a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 951a3f137094cd965d27e1b088499dd609b81a91906Brian Paul texImage = ctx->Driver.NewTextureImage(ctx); 952a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 953a3f137094cd965d27e1b088499dd609b81a91906Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "proxy texture allocation"); 954a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 955a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 95618fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell ctx->Texture.ProxyCubeMap->Image[0][level] = texImage; 957a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* Set the 'back' pointer */ 958a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul texImage->TexObject = ctx->Texture.ProxyCubeMap; 959a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 960a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return texImage; 961a3f137094cd965d27e1b088499dd609b81a91906Brian Paul case GL_PROXY_TEXTURE_RECTANGLE_NV: 962a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (level > 0) 963a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 96418fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell texImage = ctx->Texture.ProxyRect->Image[0][level]; 965a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 966a3f137094cd965d27e1b088499dd609b81a91906Brian Paul texImage = ctx->Driver.NewTextureImage(ctx); 967a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 968a3f137094cd965d27e1b088499dd609b81a91906Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "proxy texture allocation"); 969a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 970a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 97118fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell ctx->Texture.ProxyRect->Image[0][level] = texImage; 972a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* Set the 'back' pointer */ 973a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul texImage->TexObject = ctx->Texture.ProxyRect; 974a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 975a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return texImage; 976a3f137094cd965d27e1b088499dd609b81a91906Brian Paul default: 977a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 978a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 979a3f137094cd965d27e1b088499dd609b81a91906Brian Paul} 980a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 981a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 9826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 9836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the maximum number of allowed mipmap levels. 9846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 9856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 9866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target. 9876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 9886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the maximum number of allowed mipmap levels for the given 9896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * texture target, or zero if passed a bad target. 9906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 9916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_constants. 992ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul */ 993ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian PaulGLint 994ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul_mesa_max_texture_levels(GLcontext *ctx, GLenum target) 995ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul{ 996ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul switch (target) { 997ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_1D: 998ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_PROXY_TEXTURE_1D: 999ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_2D: 1000ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_PROXY_TEXTURE_2D: 1001ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul return ctx->Const.MaxTextureLevels; 1002ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_3D: 1003ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_PROXY_TEXTURE_3D: 1004ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul return ctx->Const.Max3DTextureLevels; 1005ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 1006ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 1007ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 1008ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 1009ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 1010ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 1011add9f2168a5d6b15eb9955ee761246c4f4cf8458Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 1012ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_PROXY_TEXTURE_CUBE_MAP_ARB: 1013ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul return ctx->Const.MaxCubeTextureLevels; 1014ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_RECTANGLE_NV: 1015ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_PROXY_TEXTURE_RECTANGLE_NV: 1016ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul return 1; 1017ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul default: 1018ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul return 0; /* bad target */ 1019ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul } 1020ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul} 1021ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul 1022ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul 1023fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul 102462c734f49948df7aeef55ad23a6664cbf3e11533Brian Paul#if 000 /* not used anymore */ 1025f93b3dd69e744cf1dd6b102a11cdb07c2df4a967Brian Paul/* 1026afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * glTexImage[123]D can accept a NULL image pointer. In this case we 1027afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * create a texture image with unspecified image contents per the OpenGL 10288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * spec. 1029afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 10308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulstatic GLubyte * 10318e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulmake_null_texture(GLint width, GLint height, GLint depth, GLenum format) 1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 10338e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const GLint components = _mesa_components_in_format(format); 10348e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const GLint numPixels = width * height * depth; 10358e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLubyte *data = (GLubyte *) MALLOC(numPixels * components * sizeof(GLubyte)); 1036afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1037a1503b00f863a48a517939a42d512f9cfe77f79cBrian Paul#ifdef DEBUG 1038afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 1039afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Let's see if anyone finds this. If glTexImage2D() is called with 1040afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * a NULL image pointer then load the texture image with something 1041afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * interesting instead of leaving it indeterminate. 1042afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 10438e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul if (data) { 104465d54604c387dca986c876e811362d8e8517dcacBrian Paul static const char message[8][32] = { 1045afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X XXXXX XXX X ", 1046afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " XX XX X X X X X ", 1047afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X X X X X X ", 1048afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X XXXX XXX XXXXX ", 1049afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X X X X X ", 1050afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X X X X X X ", 1051afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X XXXXX XXX X X ", 1052afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " " 1053afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg }; 1054afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 10558e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLubyte *imgPtr = data; 10568e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint h, i, j, k; 10578e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul for (h = 0; h < depth; h++) { 10588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul for (i = 0; i < height; i++) { 10598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint srcRow = 7 - (i % 8); 10608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul for (j = 0; j < width; j++) { 10618e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint srcCol = j % 32; 10628e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLubyte texel = (message[srcRow][srcCol]=='X') ? 255 : 70; 10638e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul for (k = 0; k < components; k++) { 10648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *imgPtr++ = texel; 10658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul } 1066afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1067afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1068afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1069afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1070a1503b00f863a48a517939a42d512f9cfe77f79cBrian Paul#endif 10718e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 10728e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul return data; 1073afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 107462c734f49948df7aeef55ad23a6664cbf3e11533Brian Paul#endif 1075afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1076afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1077afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1078738318bb75dea8dac4465f53850987f6062a732dBrian Paul/** 1079f378ab825c0c74aab263e7dec30194eead22c288Brian Paul * Reset the fields of a gl_texture_image struct to zero. 10806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param img texture image structure. 10826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10839c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul * This is called when a proxy texture test fails, we set all the 10849c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul * image members (except DriverData) to zero. 1085f378ab825c0c74aab263e7dec30194eead22c288Brian Paul * It's also used in glTexImage[123]D as a safeguard to be sure all 1086f378ab825c0c74aab263e7dec30194eead22c288Brian Paul * required fields get initialized properly by the Driver.TexImage[123]D 1087f378ab825c0c74aab263e7dec30194eead22c288Brian Paul * functions. 10889c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul */ 10899c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paulstatic void 1090f378ab825c0c74aab263e7dec30194eead22c288Brian Paulclear_teximage_fields(struct gl_texture_image *img) 10919c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul{ 10929c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul ASSERT(img); 1093a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul img->_BaseFormat = 0; 1094a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul img->InternalFormat = 0; 10959c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Border = 0; 10969c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Width = 0; 10979c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Height = 0; 10989c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Depth = 0; 1099681b8c9d1ba06c8c82e687a5ced369b72e6b1eb9Brian Paul img->RowStride = 0; 1100b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul if (img->ImageOffsets) { 1101b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul _mesa_free(img->ImageOffsets); 1102b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul img->ImageOffsets = NULL; 1103b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul } 11049c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Width2 = 0; 11059c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Height2 = 0; 11069c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Depth2 = 0; 11079c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->WidthLog2 = 0; 11089c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->HeightLog2 = 0; 11099c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->DepthLog2 = 0; 11109c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Data = NULL; 11112c3d34c905fa6b831a066afae83b938de05eb241Gareth Hughes img->TexFormat = &_mesa_null_texformat; 11124f295cee73bae1f687efe2dc062522b40d90b1e4Brian Paul img->FetchTexelc = NULL; 11134f295cee73bae1f687efe2dc062522b40d90b1e4Brian Paul img->FetchTexelf = NULL; 11149c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->IsCompressed = 0; 11159c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->CompressedSize = 0; 11169c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul} 11179c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul 11189c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul 11196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 11206628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul * Initialize basic fields of the gl_texture_image struct. 11216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 11226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 1123b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * \param target texture target (GL_TEXTURE_1D, GL_TEXTURE_RECTANGLE, etc). 11246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param img texture image structure to be initialized. 11256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width. 11266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height. 11276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param depth image depth. 11286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param border image border. 11296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param internalFormat internal format. 11306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 11316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Fills in the fields of \p img with the given information. 1132887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul * Note: width, height and depth include the border. 11336628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul */ 11343893e638e6521b9c070e01c0b31d22754ff97a88Brian Paulvoid 11358afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul_mesa_init_teximage_fields(GLcontext *ctx, GLenum target, 11363893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul struct gl_texture_image *img, 11373893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul GLsizei width, GLsizei height, GLsizei depth, 11383893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul GLint border, GLenum internalFormat) 11396628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul{ 1140b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul GLint i; 1141b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul 11426628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul ASSERT(img); 11438bc00c2047f69d8cd37d4fd70256850445b0fa1dBrian Paul ASSERT(width >= 0); 11448bc00c2047f69d8cd37d4fd70256850445b0fa1dBrian Paul ASSERT(height >= 0); 11458bc00c2047f69d8cd37d4fd70256850445b0fa1dBrian Paul ASSERT(depth >= 0); 1146b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul 1147a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul img->_BaseFormat = _mesa_base_tex_format( ctx, internalFormat ); 1148a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul ASSERT(img->_BaseFormat > 0); 1149a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul img->InternalFormat = internalFormat; 11506628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->Border = border; 11516628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->Width = width; 11526628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->Height = height; 11536628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->Depth = depth; 11544d0b7618cb3ada3b13e9e9b650ace34f5131e318Brian Paul img->Width2 = width - 2 * border; /* == 1 << img->WidthLog2; */ 11554d0b7618cb3ada3b13e9e9b650ace34f5131e318Brian Paul img->Height2 = height - 2 * border; /* == 1 << img->HeightLog2; */ 11564d0b7618cb3ada3b13e9e9b650ace34f5131e318Brian Paul img->Depth2 = depth - 2 * border; /* == 1 << img->DepthLog2; */ 11574d0b7618cb3ada3b13e9e9b650ace34f5131e318Brian Paul img->WidthLog2 = logbase2(img->Width2); 11586628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul if (height == 1) /* 1-D texture */ 11596628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->HeightLog2 = 0; 11606628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul else 11614d0b7618cb3ada3b13e9e9b650ace34f5131e318Brian Paul img->HeightLog2 = logbase2(img->Height2); 11626628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul if (depth == 1) /* 2-D texture */ 11636628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->DepthLog2 = 0; 11646628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul else 11654d0b7618cb3ada3b13e9e9b650ace34f5131e318Brian Paul img->DepthLog2 = logbase2(img->Depth2); 11666628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->MaxLog2 = MAX2(img->WidthLog2, img->HeightLog2); 11675999c5b620236fb6a996cf56759aec31f01c126bBrian Paul img->IsCompressed = GL_FALSE; 11685999c5b620236fb6a996cf56759aec31f01c126bBrian Paul img->CompressedSize = 0; 116989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 11704d0b7618cb3ada3b13e9e9b650ace34f5131e318Brian Paul if ((width == 1 || _mesa_bitcount(img->Width2) == 1) && 11714d0b7618cb3ada3b13e9e9b650ace34f5131e318Brian Paul (height == 1 || _mesa_bitcount(img->Height2) == 1) && 11724d0b7618cb3ada3b13e9e9b650ace34f5131e318Brian Paul (depth == 1 || _mesa_bitcount(img->Depth2) == 1)) 1173887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul img->_IsPowerOfTwo = GL_TRUE; 1174887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul else 1175887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul img->_IsPowerOfTwo = GL_FALSE; 1176887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul 1177b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* RowStride and ImageOffsets[] describe how to address texels in 'Data' */ 1178b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul img->RowStride = width; 1179b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul /* Allocate the ImageOffsets array and initialize to typical values. 1180b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * We allocate the array for 1D/2D textures too in order to avoid special- 1181b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * case code in the texstore routines. 1182b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul */ 1183b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul img->ImageOffsets = (GLuint *) _mesa_malloc(depth * sizeof(GLuint)); 1184b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul for (i = 0; i < depth; i++) { 1185b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul img->ImageOffsets[i] = i * width * height; 1186b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul } 1187b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul 11888afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul /* Compute Width/Height/DepthScale for mipmap lod computation */ 11898afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (target == GL_TEXTURE_RECTANGLE_NV) { 11908afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul /* scale = 1.0 since texture coords directly map to texels */ 11918afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul img->WidthScale = 1.0; 11928afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul img->HeightScale = 1.0; 11938afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul img->DepthScale = 1.0; 11948afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 11958afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else { 11968afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul img->WidthScale = (GLfloat) img->Width; 11978afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul img->HeightScale = (GLfloat) img->Height; 11988afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul img->DepthScale = (GLfloat) img->Depth; 11998afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 12006628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul} 12016628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul 12026628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul 1203738318bb75dea8dac4465f53850987f6062a732dBrian Paul/** 1204738318bb75dea8dac4465f53850987f6062a732dBrian Paul * This is the fallback for Driver.TestProxyTexImage(). Test the texture 1205738318bb75dea8dac4465f53850987f6062a732dBrian Paul * level, width, height and depth against the ctx->Const limits for textures. 1206738318bb75dea8dac4465f53850987f6062a732dBrian Paul * 1207738318bb75dea8dac4465f53850987f6062a732dBrian Paul * A hardware driver might override this function if, for example, the 1208738318bb75dea8dac4465f53850987f6062a732dBrian Paul * max 3D texture size is 512x512x64 (i.e. not a cube). 1209738318bb75dea8dac4465f53850987f6062a732dBrian Paul * 1210738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param target one of GL_PROXY_TEXTURE_1D, GL_PROXY_TEXTURE_2D, 1211738318bb75dea8dac4465f53850987f6062a732dBrian Paul * GL_PROXY_TEXTURE_3D, GL_PROXY_TEXTURE_RECTANGLE_NV, 1212738318bb75dea8dac4465f53850987f6062a732dBrian Paul * GL_PROXY_TEXTURE_CUBE_MAP_ARB. 1213738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param level as passed to glTexImage 1214738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param internalFormat as passed to glTexImage 1215738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param format as passed to glTexImage 1216738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param type as passed to glTexImage 1217738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param width as passed to glTexImage 1218738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param height as passed to glTexImage 1219738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param depth as passed to glTexImage 1220738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param border as passed to glTexImage 1221738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \return GL_TRUE if the image is acceptable, GL_FALSE if not acceptable. 1222738318bb75dea8dac4465f53850987f6062a732dBrian Paul */ 1223738318bb75dea8dac4465f53850987f6062a732dBrian PaulGLboolean 1224738318bb75dea8dac4465f53850987f6062a732dBrian Paul_mesa_test_proxy_teximage(GLcontext *ctx, GLenum target, GLint level, 1225738318bb75dea8dac4465f53850987f6062a732dBrian Paul GLint internalFormat, GLenum format, GLenum type, 1226738318bb75dea8dac4465f53850987f6062a732dBrian Paul GLint width, GLint height, GLint depth, GLint border) 1227738318bb75dea8dac4465f53850987f6062a732dBrian Paul{ 1228738318bb75dea8dac4465f53850987f6062a732dBrian Paul GLint maxSize; 12299c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul 1230738318bb75dea8dac4465f53850987f6062a732dBrian Paul (void) internalFormat; 1231738318bb75dea8dac4465f53850987f6062a732dBrian Paul (void) format; 1232738318bb75dea8dac4465f53850987f6062a732dBrian Paul (void) type; 1233738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1234738318bb75dea8dac4465f53850987f6062a732dBrian Paul switch (target) { 1235738318bb75dea8dac4465f53850987f6062a732dBrian Paul case GL_PROXY_TEXTURE_1D: 1236738318bb75dea8dac4465f53850987f6062a732dBrian Paul maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); 1237738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (width < 2 * border || width > 2 + maxSize || 1238887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul (!ctx->Extensions.ARB_texture_non_power_of_two && 1239887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul _mesa_bitcount(width - 2 * border) != 1) || 1240738318bb75dea8dac4465f53850987f6062a732dBrian Paul level >= ctx->Const.MaxTextureLevels) { 1241738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* bad width or level */ 1242738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_FALSE; 1243738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1244738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1245738318bb75dea8dac4465f53850987f6062a732dBrian Paul case GL_PROXY_TEXTURE_2D: 1246738318bb75dea8dac4465f53850987f6062a732dBrian Paul maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); 1247738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (width < 2 * border || width > 2 + maxSize || 1248887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul (!ctx->Extensions.ARB_texture_non_power_of_two && 1249887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul _mesa_bitcount(width - 2 * border) != 1) || 1250738318bb75dea8dac4465f53850987f6062a732dBrian Paul height < 2 * border || height > 2 + maxSize || 1251887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul (!ctx->Extensions.ARB_texture_non_power_of_two && 1252887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul _mesa_bitcount(height - 2 * border) != 1) || 1253738318bb75dea8dac4465f53850987f6062a732dBrian Paul level >= ctx->Const.MaxTextureLevels) { 1254738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* bad width or height or level */ 1255738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_FALSE; 1256738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1257738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1258738318bb75dea8dac4465f53850987f6062a732dBrian Paul case GL_PROXY_TEXTURE_3D: 1259738318bb75dea8dac4465f53850987f6062a732dBrian Paul maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1); 1260738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (width < 2 * border || width > 2 + maxSize || 1261887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul (!ctx->Extensions.ARB_texture_non_power_of_two && 1262887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul _mesa_bitcount(width - 2 * border) != 1) || 1263738318bb75dea8dac4465f53850987f6062a732dBrian Paul height < 2 * border || height > 2 + maxSize || 1264887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul (!ctx->Extensions.ARB_texture_non_power_of_two && 1265887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul _mesa_bitcount(height - 2 * border) != 1) || 1266738318bb75dea8dac4465f53850987f6062a732dBrian Paul depth < 2 * border || depth > 2 + maxSize || 1267887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul (!ctx->Extensions.ARB_texture_non_power_of_two && 1268887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul _mesa_bitcount(depth - 2 * border) != 1) || 1269738318bb75dea8dac4465f53850987f6062a732dBrian Paul level >= ctx->Const.Max3DTextureLevels) { 1270738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* bad width or height or depth or level */ 1271738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_FALSE; 1272738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1273738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1274738318bb75dea8dac4465f53850987f6062a732dBrian Paul case GL_PROXY_TEXTURE_RECTANGLE_NV: 1275738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (width < 1 || width > ctx->Const.MaxTextureRectSize || 1276738318bb75dea8dac4465f53850987f6062a732dBrian Paul height < 1 || height > ctx->Const.MaxTextureRectSize || 1277738318bb75dea8dac4465f53850987f6062a732dBrian Paul level != 0) { 1278738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* bad width or height or level */ 1279738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_FALSE; 1280738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1281738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1282738318bb75dea8dac4465f53850987f6062a732dBrian Paul case GL_PROXY_TEXTURE_CUBE_MAP_ARB: 1283738318bb75dea8dac4465f53850987f6062a732dBrian Paul maxSize = 1 << (ctx->Const.MaxCubeTextureLevels - 1); 1284738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (width < 2 * border || width > 2 + maxSize || 1285887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul (!ctx->Extensions.ARB_texture_non_power_of_two && 1286887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul _mesa_bitcount(width - 2 * border) != 1) || 1287738318bb75dea8dac4465f53850987f6062a732dBrian Paul height < 2 * border || height > 2 + maxSize || 1288887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul (!ctx->Extensions.ARB_texture_non_power_of_two && 1289887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul _mesa_bitcount(height - 2 * border) != 1) || 1290738318bb75dea8dac4465f53850987f6062a732dBrian Paul level >= ctx->Const.MaxCubeTextureLevels) { 1291738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* bad width or height */ 1292738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_FALSE; 1293738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1294738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1295738318bb75dea8dac4465f53850987f6062a732dBrian Paul default: 1296738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_problem(ctx, "Invalid target in _mesa_test_proxy_teximage"); 1297738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_FALSE; 1298738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1299738318bb75dea8dac4465f53850987f6062a732dBrian Paul} 1300738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1301738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1302738318bb75dea8dac4465f53850987f6062a732dBrian Paul/** 13036dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Test the glTexImage[123]D() parameters for errors. 13046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 13056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 13066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target given by the user. 13076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level given by the user. 13086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param internalFormat internal format given by the user. 13096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel data format given by the user. 13106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type given by the user. 13116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dimensions texture image dimensions (must be 1, 2 or 3). 13126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width given by the user. 13136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height given by the user. 13146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param depth image depth given by the user. 13156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param border image border given by the user. 13166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 13176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if an error was detected, or GL_FALSE if no errors. 13186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 13196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies each of the parameters against the constants specified in 13206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * __GLcontextRec::Const and the supported extensions, and according to the 13216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * OpenGL specification. 1322afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1323c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean 1324c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paultexture_error_check( GLcontext *ctx, GLenum target, 1325c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint level, GLint internalFormat, 1326c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum format, GLenum type, 13275b37c322741f019118a618bc6220f37adba4fbcdBrian Paul GLuint dimensions, 1328c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint width, GLint height, 1329c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint depth, GLint border ) 1330afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 133177ee31930a1b0cc7766939415f4f04ed6a1fa4acBrian Paul const GLboolean isProxy = _mesa_is_proxy_texture(target); 1332738318bb75dea8dac4465f53850987f6062a732dBrian Paul GLboolean sizeOK; 1333714c36c1202cd49c58cf6462afd391fd059b96c2Daniel Borca GLboolean colorFormat, indexFormat; 1334afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1335738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Basic level check (more checking in ctx->Driver.TestProxyTexImage) */ 1336738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (level < 0 || level >= MAX_TEXTURE_LEVELS) { 1337738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (!isProxy) { 1338738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1339738318bb75dea8dac4465f53850987f6062a732dBrian Paul "glTexImage%dD(level=%d)", dimensions, level); 13408afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 1341738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1342738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1343738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1344738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check border */ 1345738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (border < 0 || border > 1 || 1346738318bb75dea8dac4465f53850987f6062a732dBrian Paul ((target == GL_TEXTURE_RECTANGLE_NV || 1347738318bb75dea8dac4465f53850987f6062a732dBrian Paul target == GL_PROXY_TEXTURE_RECTANGLE_NV) && border != 0)) { 1348738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (!isProxy) { 1349738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1350738318bb75dea8dac4465f53850987f6062a732dBrian Paul "glTexImage%dD(border=%d)", dimensions, border); 1351738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1352738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1353738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1354738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1355973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul if (width < 0 || height < 0 || depth < 0) { 1356f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul if (!isProxy) { 1357f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1358973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul "glTexImage%dD(width, height or depth < 0)", dimensions); 1359f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul } 1360f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul return GL_TRUE; 1361f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul } 1362f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul 1363738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check target and call ctx->Driver.TestProxyTexImage() to check the 1364738318bb75dea8dac4465f53850987f6062a732dBrian Paul * level, width, height and depth. 1365738318bb75dea8dac4465f53850987f6062a732dBrian Paul */ 1366738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (dimensions == 1) { 1367738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (target == GL_PROXY_TEXTURE_1D || target == GL_TEXTURE_1D) { 1368738318bb75dea8dac4465f53850987f6062a732dBrian Paul sizeOK = ctx->Driver.TestProxyTexImage(ctx, GL_PROXY_TEXTURE_1D, 1369738318bb75dea8dac4465f53850987f6062a732dBrian Paul level, internalFormat, 1370738318bb75dea8dac4465f53850987f6062a732dBrian Paul format, type, 1371738318bb75dea8dac4465f53850987f6062a732dBrian Paul width, 1, 1, border); 13728afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 13738afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else { 137408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexImage1D(target)" ); 1375afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 1376afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1377afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1378afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (dimensions == 2) { 1379738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (target == GL_PROXY_TEXTURE_2D || target == GL_TEXTURE_2D) { 1380738318bb75dea8dac4465f53850987f6062a732dBrian Paul sizeOK = ctx->Driver.TestProxyTexImage(ctx, GL_PROXY_TEXTURE_2D, 1381738318bb75dea8dac4465f53850987f6062a732dBrian Paul level, internalFormat, 1382738318bb75dea8dac4465f53850987f6062a732dBrian Paul format, type, 1383738318bb75dea8dac4465f53850987f6062a732dBrian Paul width, height, 1, border); 1384738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1385738318bb75dea8dac4465f53850987f6062a732dBrian Paul else if (target == GL_PROXY_TEXTURE_CUBE_MAP_ARB || 1386738318bb75dea8dac4465f53850987f6062a732dBrian Paul (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB && 1387738318bb75dea8dac4465f53850987f6062a732dBrian Paul target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB)) { 13888afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (!ctx->Extensions.ARB_texture_cube_map) { 13898afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexImage2D(target)"); 13908afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul return GL_TRUE; 13918afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 1392738318bb75dea8dac4465f53850987f6062a732dBrian Paul sizeOK = (width == height) && 1393738318bb75dea8dac4465f53850987f6062a732dBrian Paul ctx->Driver.TestProxyTexImage(ctx, GL_PROXY_TEXTURE_CUBE_MAP_ARB, 1394738318bb75dea8dac4465f53850987f6062a732dBrian Paul level, internalFormat, format, type, 1395738318bb75dea8dac4465f53850987f6062a732dBrian Paul width, height, 1, border); 13968afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 1397738318bb75dea8dac4465f53850987f6062a732dBrian Paul else if (target == GL_PROXY_TEXTURE_RECTANGLE_NV || 1398738318bb75dea8dac4465f53850987f6062a732dBrian Paul target == GL_TEXTURE_RECTANGLE_NV) { 13998afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (!ctx->Extensions.NV_texture_rectangle) { 14008afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexImage2D(target)"); 14018afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul return GL_TRUE; 14028afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 1403738318bb75dea8dac4465f53850987f6062a732dBrian Paul sizeOK = ctx->Driver.TestProxyTexImage(ctx, 1404738318bb75dea8dac4465f53850987f6062a732dBrian Paul GL_PROXY_TEXTURE_RECTANGLE_NV, 1405738318bb75dea8dac4465f53850987f6062a732dBrian Paul level, internalFormat, 1406738318bb75dea8dac4465f53850987f6062a732dBrian Paul format, type, 1407738318bb75dea8dac4465f53850987f6062a732dBrian Paul width, height, 1, border); 14088afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 14098afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else { 14108afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexImage2D(target)"); 14118afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul return GL_TRUE; 14128afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 1413afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1414afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else if (dimensions == 3) { 1415738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (target == GL_PROXY_TEXTURE_3D || target == GL_TEXTURE_3D) { 1416738318bb75dea8dac4465f53850987f6062a732dBrian Paul sizeOK = ctx->Driver.TestProxyTexImage(ctx, GL_PROXY_TEXTURE_3D, 1417738318bb75dea8dac4465f53850987f6062a732dBrian Paul level, internalFormat, 1418738318bb75dea8dac4465f53850987f6062a732dBrian Paul format, type, 1419738318bb75dea8dac4465f53850987f6062a732dBrian Paul width, height, depth, border); 14208afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 14218afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else { 142208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexImage3D(target)" ); 1423afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 1424afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1425afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1426afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 142708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem( ctx, "bad dims in texture_error_check" ); 1428afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 1429afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1430afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1431738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (!sizeOK) { 1432c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!isProxy) { 14334e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1434738318bb75dea8dac4465f53850987f6062a732dBrian Paul "glTexImage%dD(level=%d, width=%d, height=%d, depth=%d)", 1435738318bb75dea8dac4465f53850987f6062a732dBrian Paul dimensions, level, width, height, depth); 1436c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1437afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 1438afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1439afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1440738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check internalFormat */ 144189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (_mesa_base_tex_format(ctx, internalFormat) < 0) { 1442c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!isProxy) { 14434e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 14444e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glTexImage%dD(internalFormat=0x%x)", 14454e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul dimensions, internalFormat); 1446c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1447afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 1448afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1449afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1450738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check incoming image format and type */ 1451f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!_mesa_is_legal_format_and_type(ctx, format, type)) { 145238f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes /* Yes, generate GL_INVALID_OPERATION, not GL_INVALID_ENUM, if there 145338f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes * is a type/format mismatch. See 1.2 spec page 94, sec 3.6.4. 145438f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes */ 145538f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes if (!isProxy) { 145689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 14574e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glTexImage%dD(format or type)", dimensions); 1458c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 145938f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes return GL_TRUE; 1460afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1461afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1462601df9c742939c1f77de489561fe3e1d02f49618Brian Paul /* make sure internal format and format basically agree */ 1463714c36c1202cd49c58cf6462afd391fd059b96c2Daniel Borca colorFormat = is_color_format(format); 1464714c36c1202cd49c58cf6462afd391fd059b96c2Daniel Borca indexFormat = is_index_format(format); 1465714c36c1202cd49c58cf6462afd391fd059b96c2Daniel Borca if ((is_color_format(internalFormat) && !colorFormat && !indexFormat) || 1466714c36c1202cd49c58cf6462afd391fd059b96c2Daniel Borca (is_index_format(internalFormat) && !indexFormat) || 1467601df9c742939c1f77de489561fe3e1d02f49618Brian Paul (is_depth_format(internalFormat) != is_depth_format(format)) || 14681ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul (is_ycbcr_format(internalFormat) != is_ycbcr_format(format)) || 14691ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul (is_depthstencil_format(internalFormat) != is_depthstencil_format(format))) { 1470601df9c742939c1f77de489561fe3e1d02f49618Brian Paul if (!isProxy) 1471601df9c742939c1f77de489561fe3e1d02f49618Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 1472601df9c742939c1f77de489561fe3e1d02f49618Brian Paul "glTexImage(internalFormat/format)"); 1473601df9c742939c1f77de489561fe3e1d02f49618Brian Paul return GL_TRUE; 1474601df9c742939c1f77de489561fe3e1d02f49618Brian Paul } 1475601df9c742939c1f77de489561fe3e1d02f49618Brian Paul 1476601df9c742939c1f77de489561fe3e1d02f49618Brian Paul /* additional checks for ycbcr textures */ 1477601df9c742939c1f77de489561fe3e1d02f49618Brian Paul if (internalFormat == GL_YCBCR_MESA) { 1478c5b995066020191982b2315fc45d05e068eee761Brian Paul ASSERT(ctx->Extensions.MESA_ycbcr_texture); 1479601df9c742939c1f77de489561fe3e1d02f49618Brian Paul if (type != GL_UNSIGNED_SHORT_8_8_MESA && 1480601df9c742939c1f77de489561fe3e1d02f49618Brian Paul type != GL_UNSIGNED_SHORT_8_8_REV_MESA) { 1481c5b995066020191982b2315fc45d05e068eee761Brian Paul char message[100]; 148236b518a7ca98e49d95c3fe54544700004716cdefBrian Paul _mesa_sprintf(message, 1483601df9c742939c1f77de489561fe3e1d02f49618Brian Paul "glTexImage%d(format/type YCBCR mismatch", dimensions); 1484c5b995066020191982b2315fc45d05e068eee761Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, message); 1485c5b995066020191982b2315fc45d05e068eee761Brian Paul return GL_TRUE; /* error */ 1486c5b995066020191982b2315fc45d05e068eee761Brian Paul } 1487d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul if (target != GL_TEXTURE_2D && 1488d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul target != GL_PROXY_TEXTURE_2D && 1489d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul target != GL_TEXTURE_RECTANGLE_NV && 1490d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul target != GL_PROXY_TEXTURE_RECTANGLE_NV) { 1491d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul if (!isProxy) 1492d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexImage(target)"); 1493d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul return GL_TRUE; 1494d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul } 1495d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul if (border != 0) { 1496d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul if (!isProxy) { 1497d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul char message[100]; 149836b518a7ca98e49d95c3fe54544700004716cdefBrian Paul _mesa_sprintf(message, 1499d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul "glTexImage%d(format=GL_YCBCR_MESA and border=%d)", 1500d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul dimensions, border); 1501d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, message); 1502d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul } 1503d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul return GL_TRUE; 1504d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul } 1505c5b995066020191982b2315fc45d05e068eee761Brian Paul } 1506c5b995066020191982b2315fc45d05e068eee761Brian Paul 1507601df9c742939c1f77de489561fe3e1d02f49618Brian Paul /* additional checks for depth textures */ 1508601df9c742939c1f77de489561fe3e1d02f49618Brian Paul if (_mesa_base_tex_format(ctx, internalFormat) == GL_DEPTH_COMPONENT) { 15092b04dd9d2cba6ec3506e78016e64cffce6e8abf7Brian Paul /* Only 1D, 2D and rectangular textures supported, not 3D or cubes */ 1510601df9c742939c1f77de489561fe3e1d02f49618Brian Paul if (target != GL_TEXTURE_1D && 1511601df9c742939c1f77de489561fe3e1d02f49618Brian Paul target != GL_PROXY_TEXTURE_1D && 1512601df9c742939c1f77de489561fe3e1d02f49618Brian Paul target != GL_TEXTURE_2D && 15132b04dd9d2cba6ec3506e78016e64cffce6e8abf7Brian Paul target != GL_PROXY_TEXTURE_2D && 15142b04dd9d2cba6ec3506e78016e64cffce6e8abf7Brian Paul target != GL_TEXTURE_RECTANGLE_ARB && 15152b04dd9d2cba6ec3506e78016e64cffce6e8abf7Brian Paul target != GL_PROXY_TEXTURE_RECTANGLE_ARB) { 1516601df9c742939c1f77de489561fe3e1d02f49618Brian Paul if (!isProxy) 1517601df9c742939c1f77de489561fe3e1d02f49618Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, 1518601df9c742939c1f77de489561fe3e1d02f49618Brian Paul "glTexImage(target/internalFormat)"); 1519601df9c742939c1f77de489561fe3e1d02f49618Brian Paul return GL_TRUE; 1520601df9c742939c1f77de489561fe3e1d02f49618Brian Paul } 1521601df9c742939c1f77de489561fe3e1d02f49618Brian Paul } 1522601df9c742939c1f77de489561fe3e1d02f49618Brian Paul 1523601df9c742939c1f77de489561fe3e1d02f49618Brian Paul /* additional checks for compressed textures */ 152440bd9d0b190e11d39350d1b08d2c2b28e3040bcaDaniel Borca if (is_compressed_format(ctx, internalFormat)) { 152589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (target == GL_TEXTURE_2D || target == GL_PROXY_TEXTURE_2D) { 152689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* OK */ 152789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 152889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (ctx->Extensions.ARB_texture_cube_map && 152989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul (target == GL_PROXY_TEXTURE_CUBE_MAP || 153089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && 153189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z))) { 153289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* OK */ 153389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 153489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else { 153589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (!isProxy) { 153689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, 153789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul "glTexImage%d(target)", dimensions); 153889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_TRUE; 153989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 154089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 154189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (border != 0) { 154289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (!isProxy) { 154389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 154489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul "glTexImage%D(border!=0)", dimensions); 154589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 154689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_TRUE; 154789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 154889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 154989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 1550afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* if we get here, the parameters are OK */ 1551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 1552afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1554afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 15556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1556c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Test glTexSubImage[123]D() parameters for errors. 15576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 15586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 15596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dimensions texture image dimensions (must be 1, 2 or 3). 15606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target given by the user. 15616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level given by the user. 15626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param xoffset sub-image x offset given by the user. 15636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param yoffset sub-image y offset given by the user. 15646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param zoffset sub-image z offset given by the user. 15656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel data format given by the user. 15666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type given by the user. 15676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width given by the user. 15686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height given by the user. 15696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param depth image depth given by the user. 15706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 15716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if an error was detected, or GL_FALSE if no errors. 15726dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 15736dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies each of the parameters against the constants specified in 15746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * __GLcontextRec::Const and the supported extensions, and according to the 15756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * OpenGL specification. 1576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1577c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean 1578fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulsubtexture_error_check( GLcontext *ctx, GLuint dimensions, 1579c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum target, GLint level, 1580c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint xoffset, GLint yoffset, GLint zoffset, 1581c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint width, GLint height, GLint depth, 1582c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum format, GLenum type ) 1583afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1584738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check target */ 1585c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions == 1) { 1586738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (target != GL_TEXTURE_1D) { 158708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage1D(target)" ); 1588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1589afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1590c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1591c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (dimensions == 2) { 1592738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB && 1593da62bcecfb92978d7243928cfa0fb076b3de762dBrian Paul target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) { 1594738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (!ctx->Extensions.ARB_texture_cube_map) { 1595738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage2D(target)" ); 1596738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1597738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1598fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 15995ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell else if (target == GL_TEXTURE_RECTANGLE_NV) { 1600738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (!ctx->Extensions.NV_texture_rectangle) { 1601738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage2D(target)" ); 1602738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1603738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1604d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul } 1605738318bb75dea8dac4465f53850987f6062a732dBrian Paul else if (target != GL_TEXTURE_2D) { 160608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage2D(target)" ); 1607c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1608afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1609c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1610c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else if (dimensions == 3) { 1611738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (target != GL_TEXTURE_3D) { 161208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexSubImage3D(target)" ); 1613c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1614afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1615c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1616c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 1617738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_problem( ctx, "invalid dims in texture_error_check" ); 1618c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1619c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1620afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1621738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Basic level check */ 1622738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (level < 0 || level >= MAX_TEXTURE_LEVELS) { 16234e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexSubImage2D(level=%d)", level); 1624c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1625c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1626afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1627c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width < 0) { 16284e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 16294e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glTexSubImage%dD(width=%d)", dimensions, width); 1630c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1631c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1632c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (height < 0 && dimensions > 1) { 16334e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 16344e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glTexSubImage%dD(height=%d)", dimensions, height); 1635c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1636c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1637c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (depth < 0 && dimensions > 2) { 1638738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1639738318bb75dea8dac4465f53850987f6062a732dBrian Paul "glTexSubImage%dD(depth=%d)", dimensions, depth); 1640c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1641c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1642afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 16435ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!_mesa_is_legal_format_and_type(ctx, format, type)) { 16445ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_ENUM, 16455ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell "glTexSubImage%dD(format or type)", dimensions); 16465ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return GL_TRUE; 16475ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 16485ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 16495ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return GL_FALSE; 16505ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell} 1651f2718b0966f54049056e16e7cca08718341557b2Brian Paul 16525ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwellstatic GLboolean 16535ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwellsubtexture_error_check2( GLcontext *ctx, GLuint dimensions, 16545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLenum target, GLint level, 16555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLint xoffset, GLint yoffset, GLint zoffset, 16565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLint width, GLint height, GLint depth, 16575ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLenum format, GLenum type, 16585ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell const struct gl_texture_image *destTex ) 16595ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell{ 1660c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!destTex) { 1661738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* undefined image level */ 1662738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glTexSubImage%dD", dimensions); 1663c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1664c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1665afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1666c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (xoffset < -((GLint)destTex->Border)) { 1667738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(xoffset)", 1668738318bb75dea8dac4465f53850987f6062a732dBrian Paul dimensions); 1669c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (xoffset + width > (GLint) (destTex->Width + destTex->Border)) { 1672738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(xoffset+width)", 1673738318bb75dea8dac4465f53850987f6062a732dBrian Paul dimensions); 1674c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1675c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1676c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 1) { 1677c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (yoffset < -((GLint)destTex->Border)) { 1678738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(yoffset)", 1679738318bb75dea8dac4465f53850987f6062a732dBrian Paul dimensions); 1680c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1682c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (yoffset + height > (GLint) (destTex->Height + destTex->Border)) { 1683738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(yoffset+height)", 1684738318bb75dea8dac4465f53850987f6062a732dBrian Paul dimensions); 1685c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1686afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1688c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 2) { 1689c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (zoffset < -((GLint)destTex->Border)) { 169008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset)"); 1691c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1692c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 169338f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes if (zoffset + depth > (GLint) (destTex->Depth + destTex->Border)) { 169408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset+depth)"); 1695c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1696c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 16990a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul#if FEATURE_EXT_texture_sRGB 17000a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul if (destTex->InternalFormat == GL_COMPRESSED_SRGB_S3TC_DXT1_EXT || 17010a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul destTex->InternalFormat == GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT || 17020a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul destTex->InternalFormat == GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT || 17030a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul destTex->InternalFormat == GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT) { 17040a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul if ((width & 0x3) || (height & 0x3) || 17050a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul (xoffset & 0x3) || (yoffset & 0x3)) 17060a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 17070a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul "glTexSubImage%dD(size or offset not multiple of 4)", 17080a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul dimensions); 17090a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul return GL_TRUE; 17100a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul } 17110a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul#endif 17120a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul 171389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (destTex->IsCompressed) { 171489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (target == GL_TEXTURE_2D || target == GL_PROXY_TEXTURE_2D) { 171589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* OK */ 171689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 171789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (ctx->Extensions.ARB_texture_cube_map && 171889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul (target == GL_PROXY_TEXTURE_CUBE_MAP || 171989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X && 172089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z))) { 172189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* OK */ 172289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 172389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else { 172489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, 172589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul "glTexSubImage%D(target)", dimensions); 1726e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul return GL_TRUE; 1727e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul } 172889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* offset must be multiple of 4 */ 172989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if ((xoffset & 3) || (yoffset & 3)) { 1730e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 173189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul "glTexSubImage%D(xoffset or yoffset)", dimensions); 1732e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul return GL_TRUE; 1733e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul } 173489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* size must be multiple of 4 or equal to whole texture size */ 17355ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if ((width & 3) && (GLuint) width != destTex->Width) { 1736e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 173789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul "glTexSubImage%D(width)", dimensions); 1738e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul return GL_TRUE; 173989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 17405ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if ((height & 3) && (GLuint) height != destTex->Height) { 174189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 174289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul "glTexSubImage%D(width)", dimensions); 174389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_TRUE; 174489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 1745e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul } 1746e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 1747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_FALSE; 1748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 1749afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1750afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 17516dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Test glCopyTexImage[12]D() parameters for errors. 17536dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 17546dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 17556dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dimensions texture image dimensions (must be 1, 2 or 3). 17566dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target given by the user. 17576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level given by the user. 17586dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param internalFormat internal format given by the user. 17596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width given by the user. 17606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height given by the user. 17616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param depth image depth given by the user. 17626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param border texture border. 17636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 17646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if an error was detected, or GL_FALSE if no errors. 17656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 17666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies each of the parameters against the constants specified in 17676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * __GLcontextRec::Const and the supported extensions, and according to the 17686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * OpenGL specification. 1769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1770c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean 1771fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcopytexture_error_check( GLcontext *ctx, GLuint dimensions, 1772c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum target, GLint level, GLint internalFormat, 1773c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint width, GLint height, GLint border ) 1774afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 17750899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul GLenum type; 1776738318bb75dea8dac4465f53850987f6062a732dBrian Paul GLboolean sizeOK; 17770899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul GLint format; 1778afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1779738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Basic level check (more checking in ctx->Driver.TestProxyTexImage) */ 1780738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (level < 0 || level >= MAX_TEXTURE_LEVELS) { 17815ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_VALUE, 17825ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell "glCopyTexImage%dD(level=%d)", dimensions, level); 17835ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return GL_TRUE; 17845ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 17855ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 178634bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul /* Check that the source buffer is complete */ 178734bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul if (ctx->ReadBuffer->Name) { 178834bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul _mesa_test_framebuffer_completeness(ctx, ctx->ReadBuffer); 178934bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) { 179034bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT, 179134bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul "glCopyTexImage%dD(invalid readbuffer)", dimensions); 179234bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul return GL_TRUE; 179334bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul } 179434bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul } 179534bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul 1796738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check border */ 1797738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (border < 0 || border > 1 || 1798738318bb75dea8dac4465f53850987f6062a732dBrian Paul ((target == GL_TEXTURE_RECTANGLE_NV || 1799738318bb75dea8dac4465f53850987f6062a732dBrian Paul target == GL_PROXY_TEXTURE_RECTANGLE_NV) && border != 0)) { 1800738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1801738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1802738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1803738318bb75dea8dac4465f53850987f6062a732dBrian Paul format = _mesa_base_tex_format(ctx, internalFormat); 18040899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul if (format < 0) { 18050899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 18060899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul "glCopyTexImage%dD(internalFormat)", dimensions); 18070899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul return GL_TRUE; 18080899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul } 18090899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul 18100899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul /* NOTE: the format and type aren't really significant for 18110899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul * TestProxyTexImage(). Only the internalformat really matters. 181234bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul if (!_mesa_source_buffer_exists(ctx, format)) { 181334bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 181434bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul "glCopyTexImage%dD(missing readbuffer)", dimensions); 181534bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul return GL_TRUE; 181634bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul } 181734bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul 18180899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul */ 1819738318bb75dea8dac4465f53850987f6062a732dBrian Paul type = GL_FLOAT; 1820738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1821738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check target and call ctx->Driver.TestProxyTexImage() to check the 1822738318bb75dea8dac4465f53850987f6062a732dBrian Paul * level, width, height and depth. 1823738318bb75dea8dac4465f53850987f6062a732dBrian Paul */ 1824fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul if (dimensions == 1) { 1825738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (target == GL_TEXTURE_1D) { 1826738318bb75dea8dac4465f53850987f6062a732dBrian Paul sizeOK = ctx->Driver.TestProxyTexImage(ctx, GL_PROXY_TEXTURE_1D, 1827738318bb75dea8dac4465f53850987f6062a732dBrian Paul level, internalFormat, 1828738318bb75dea8dac4465f53850987f6062a732dBrian Paul format, type, 1829738318bb75dea8dac4465f53850987f6062a732dBrian Paul width, 1, 1, border); 1830738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1831738318bb75dea8dac4465f53850987f6062a732dBrian Paul else { 183208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexImage1D(target)" ); 1833fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul return GL_TRUE; 1834fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 1835c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1836fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul else if (dimensions == 2) { 1837738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (target == GL_TEXTURE_2D) { 1838738318bb75dea8dac4465f53850987f6062a732dBrian Paul sizeOK = ctx->Driver.TestProxyTexImage(ctx, GL_PROXY_TEXTURE_2D, 1839738318bb75dea8dac4465f53850987f6062a732dBrian Paul level, internalFormat, 1840738318bb75dea8dac4465f53850987f6062a732dBrian Paul format, type, 1841738318bb75dea8dac4465f53850987f6062a732dBrian Paul width, height, 1, border); 1842738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1843738318bb75dea8dac4465f53850987f6062a732dBrian Paul else if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB && 1844738318bb75dea8dac4465f53850987f6062a732dBrian Paul target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) { 18458afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (!ctx->Extensions.ARB_texture_cube_map) { 18468afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexImage2D(target)" ); 18478afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul return GL_TRUE; 18488afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 1849738318bb75dea8dac4465f53850987f6062a732dBrian Paul sizeOK = (width == height) && 1850738318bb75dea8dac4465f53850987f6062a732dBrian Paul ctx->Driver.TestProxyTexImage(ctx, GL_PROXY_TEXTURE_CUBE_MAP_ARB, 1851738318bb75dea8dac4465f53850987f6062a732dBrian Paul level, internalFormat, format, type, 1852738318bb75dea8dac4465f53850987f6062a732dBrian Paul width, height, 1, border); 18538afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 18548afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul else if (target == GL_TEXTURE_RECTANGLE_NV) { 18558afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul if (!ctx->Extensions.NV_texture_rectangle) { 185608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexImage2D(target)" ); 1857fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul return GL_TRUE; 1858fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 1859738318bb75dea8dac4465f53850987f6062a732dBrian Paul sizeOK = ctx->Driver.TestProxyTexImage(ctx, 1860738318bb75dea8dac4465f53850987f6062a732dBrian Paul GL_PROXY_TEXTURE_RECTANGLE_NV, 1861738318bb75dea8dac4465f53850987f6062a732dBrian Paul level, internalFormat, 1862738318bb75dea8dac4465f53850987f6062a732dBrian Paul format, type, 1863738318bb75dea8dac4465f53850987f6062a732dBrian Paul width, height, 1, border); 1864fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 1865738318bb75dea8dac4465f53850987f6062a732dBrian Paul else { 186608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexImage2D(target)" ); 1867fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul return GL_TRUE; 1868fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 1869c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1870738318bb75dea8dac4465f53850987f6062a732dBrian Paul else { 1871738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_problem(ctx, "invalid dimensions in copytexture_error_check"); 1872c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1873c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1874c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1875738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (!sizeOK) { 1876738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (dimensions == 1) { 18774e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1878738318bb75dea8dac4465f53850987f6062a732dBrian Paul "glCopyTexImage1D(width=%d)", width); 1879c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1880738318bb75dea8dac4465f53850987f6062a732dBrian Paul else { 1881738318bb75dea8dac4465f53850987f6062a732dBrian Paul ASSERT(dimensions == 2); 1882738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1883738318bb75dea8dac4465f53850987f6062a732dBrian Paul "glCopyTexImage2D(width=%d, height=%d)", width, height); 1884ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 1885c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1886c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1887c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 188840bd9d0b190e11d39350d1b08d2c2b28e3040bcaDaniel Borca if (is_compressed_format(ctx, internalFormat)) { 188989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (target != GL_TEXTURE_2D) { 189089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, 189189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul "glCopyTexImage%d(target)", dimensions); 189289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_TRUE; 189389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 189489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (border != 0) { 189589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 189689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul "glCopyTexImage%D(border!=0)", dimensions); 189789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_TRUE; 189889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 189989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 19000899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul else if (is_depth_format(internalFormat)) { 19010899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul /* make sure we have depth/stencil buffers */ 19021a5f1bdb428ea3ded1e77796590014f89fe78f77Brian Paul if (!ctx->ReadBuffer->_DepthBuffer) { 19030899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 19040899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul "glCopyTexImage%D(no depth)", dimensions); 19050899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul return GL_TRUE; 19060899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul } 19070899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul } 19080899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul else if (is_depthstencil_format(internalFormat)) { 19090899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul /* make sure we have depth/stencil buffers */ 19101a5f1bdb428ea3ded1e77796590014f89fe78f77Brian Paul if (!ctx->ReadBuffer->_DepthBuffer || !ctx->ReadBuffer->_StencilBuffer) { 19110899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 19120899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul "glCopyTexImage%D(no depth/stencil buffer)", dimensions); 19130899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul return GL_TRUE; 19140899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul } 19150899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul } 191689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 1917c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* if we get here, the parameters are OK */ 1918c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_FALSE; 1919c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 1920c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1921c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 19226dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 192334bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul * Test glCopyTexSubImage[12]D() parameters for errors. 19246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 19256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 19266dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dimensions texture image dimensions (must be 1, 2 or 3). 19276dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target given by the user. 19286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level given by the user. 19296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param xoffset sub-image x offset given by the user. 19306dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param yoffset sub-image y offset given by the user. 19316dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param zoffset sub-image z offset given by the user. 19326dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width given by the user. 19336dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height given by the user. 19346dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 19356dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if an error was detected, or GL_FALSE if no errors. 19366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 19376dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies each of the parameters against the constants specified in 19386dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * __GLcontextRec::Const and the supported extensions, and according to the 19396dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * OpenGL specification. 19406dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 1941c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean 1942fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paulcopytexsubimage_error_check( GLcontext *ctx, GLuint dimensions, 1943c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum target, GLint level, 1944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint xoffset, GLint yoffset, GLint zoffset, 19455ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLsizei width, GLsizei height) 1946c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 1947738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check target */ 194834bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul /* Check that the source buffer is complete */ 194934bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul if (ctx->ReadBuffer->Name) { 195034bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul _mesa_test_framebuffer_completeness(ctx, ctx->ReadBuffer); 195134bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) { 195234bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT, 195334bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul "glCopyTexImage%dD(invalid readbuffer)", dimensions); 195434bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul return GL_TRUE; 195534bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul } 195634bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul } 195734bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul 1958fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul if (dimensions == 1) { 1959fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul if (target != GL_TEXTURE_1D) { 196008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage1D(target)" ); 1961fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul return GL_TRUE; 1962fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 1963c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1964fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul else if (dimensions == 2) { 1965fa268adc9df30c8e3413990ee0e68c139ca0c069Brian Paul if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB && 1966fa268adc9df30c8e3413990ee0e68c139ca0c069Brian Paul target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) { 1967fa268adc9df30c8e3413990ee0e68c139ca0c069Brian Paul if (!ctx->Extensions.ARB_texture_cube_map) { 1968fa268adc9df30c8e3413990ee0e68c139ca0c069Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage2D(target)" ); 1969fa268adc9df30c8e3413990ee0e68c139ca0c069Brian Paul return GL_TRUE; 1970fa268adc9df30c8e3413990ee0e68c139ca0c069Brian Paul } 1971fa268adc9df30c8e3413990ee0e68c139ca0c069Brian Paul } 1972fa268adc9df30c8e3413990ee0e68c139ca0c069Brian Paul else if (target == GL_TEXTURE_RECTANGLE_NV) { 1973fa268adc9df30c8e3413990ee0e68c139ca0c069Brian Paul if (!ctx->Extensions.NV_texture_rectangle) { 197408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage2D(target)" ); 1975fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul return GL_TRUE; 1976fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 1977fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 1978fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul else if (target != GL_TEXTURE_2D) { 197908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage2D(target)" ); 1980fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul return GL_TRUE; 1981fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 1982c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1983fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul else if (dimensions == 3) { 1984fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul if (target != GL_TEXTURE_3D) { 198508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glCopyTexSubImage3D(target)" ); 1986fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul return GL_TRUE; 1987fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul } 1988c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1989c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1990738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check level */ 1991738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (level < 0 || level >= MAX_TEXTURE_LEVELS) { 19924e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 19934e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(level=%d)", dimensions, level); 1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1995c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1996c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1997738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check size */ 1998c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width < 0) { 19994e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20004e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(width=%d)", dimensions, width); 2001c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2002c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2003c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 1 && height < 0) { 20044e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20054e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(height=%d)", dimensions, height); 2006c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2007c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2008c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 20095ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return GL_FALSE; 20105ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell} 20115ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 20125ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwellstatic GLboolean 20135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwellcopytexsubimage_error_check2( GLcontext *ctx, GLuint dimensions, 20145ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLenum target, GLint level, 20155ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLint xoffset, GLint yoffset, GLint zoffset, 20165ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLsizei width, GLsizei height, 20175ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell const struct gl_texture_image *teximage ) 20185ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell{ 2019c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!teximage) { 20204e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 2021b9f75444e60477e7a523e7eec1bb49a8232fd4e7Brian Paul "glCopyTexSubImage%dD(undefined texture level: %d)", 2022b9f75444e60477e7a523e7eec1bb49a8232fd4e7Brian Paul dimensions, level); 2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2024c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2025c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2026c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (xoffset < -((GLint)teximage->Border)) { 20274e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20284e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(xoffset=%d)", dimensions, xoffset); 2029c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2030c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 203138f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes if (xoffset + width > (GLint) (teximage->Width + teximage->Border)) { 20324e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20334e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(xoffset+width)", dimensions); 2034c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2035c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2036c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 1) { 2037c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (yoffset < -((GLint)teximage->Border)) { 20384e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20394e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(yoffset=%d)", dimensions, yoffset); 2040c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2041c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2042c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* NOTE: we're adding the border here, not subtracting! */ 204338f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes if (yoffset + height > (GLint) (teximage->Height + teximage->Border)) { 20444e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20454e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(yoffset+height)", dimensions); 2046c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2047c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 2) { 2051c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (zoffset < -((GLint)teximage->Border)) { 20524e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20534e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(zoffset)", dimensions); 2054c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2055c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 205638f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes if (zoffset > (GLint) (teximage->Depth + teximage->Border)) { 20574e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20584e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(zoffset+depth)", dimensions); 2059c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2060c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2061c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2062c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 206389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (teximage->IsCompressed) { 2064114ecb9d67b1254d0929bfeec80dee8015834425Brian Paul if (!_mesa_source_buffer_exists(ctx, teximage->_BaseFormat)) { 2065114ecb9d67b1254d0929bfeec80dee8015834425Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 2066114ecb9d67b1254d0929bfeec80dee8015834425Brian Paul "glCopyTexSubImage%dD(missing readbuffer)", dimensions); 2067114ecb9d67b1254d0929bfeec80dee8015834425Brian Paul return GL_TRUE; 2068114ecb9d67b1254d0929bfeec80dee8015834425Brian Paul } 206934bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul 207089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (target != GL_TEXTURE_2D) { 207189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, 207289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul "glCopyTexSubImage%d(target)", dimensions); 2073e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul return GL_TRUE; 2074e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul } 207589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* offset must be multiple of 4 */ 207689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if ((xoffset & 3) || (yoffset & 3)) { 207789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 207889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul "glCopyTexSubImage%D(xoffset or yoffset)", dimensions); 2079e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul return GL_TRUE; 2080e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul } 208189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* size must be multiple of 4 */ 2082798d83cf67098a7df293c711e0d2c8c296fc4c8fKarl Schultz if ((width & 3) != 0 && (GLuint) width != teximage->Width) { 208389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 208489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul "glCopyTexSubImage%D(width)", dimensions); 2085e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul return GL_TRUE; 208689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 2087798d83cf67098a7df293c711e0d2c8c296fc4c8fKarl Schultz if ((height & 3) != 0 && (GLuint) height != teximage->Height) { 208889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 208989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul "glCopyTexSubImage%D(height)", dimensions); 209089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_TRUE; 209189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 2092e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul } 2093e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 2094a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul if (teximage->InternalFormat == GL_YCBCR_MESA) { 2095d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glCopyTexSubImage2D"); 2096d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul return GL_TRUE; 2097d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul } 2098d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul 2099a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul if (teximage->_BaseFormat == GL_DEPTH_COMPONENT) { 21001a5f1bdb428ea3ded1e77796590014f89fe78f77Brian Paul if (!ctx->ReadBuffer->_DepthBuffer) { 21010899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 21020899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul "glCopyTexSubImage%D(no depth buffer)", 21030899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul dimensions); 21040899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul return GL_TRUE; 21050899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul } 21060899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul } 2107a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul else if (teximage->_BaseFormat == GL_DEPTH_STENCIL_EXT) { 21081a5f1bdb428ea3ded1e77796590014f89fe78f77Brian Paul if (!ctx->ReadBuffer->_DepthBuffer || !ctx->ReadBuffer->_StencilBuffer) { 21090899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 21100899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul "glCopyTexSubImage%D(no depth/stencil buffer)", 21110899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul dimensions); 21120899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul return GL_TRUE; 21130899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul } 21140899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul } 21150899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul 2116c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* if we get here, the parameters are OK */ 2117c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_FALSE; 2118c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2119c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2120c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 21216dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 21221749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * Get texture image. Called by glGetTexImage. 21236dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 21246dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target. 21256dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level. 21261749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * \param format pixel data format for returned image. 21271749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * \param type pixel data type for returned image. 21281749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * \param pixels returned pixel data. 21296dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 2130c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 21318e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul_mesa_GetTexImage( GLenum target, GLint level, GLenum format, 21328e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLenum type, GLvoid *pixels ) 2133289d47eee5342bd7ec1c25a29d9bdc8d6f9dc4edBrian Paul{ 21348e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_texture_unit *texUnit; 2135ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_object *texObj; 2136ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul struct gl_texture_image *texImage; 2137cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul GLint maxLevels = 0; 21382c3d34c905fa6b831a066afae83b938de05eb241Gareth Hughes GET_CURRENT_CONTEXT(ctx); 21398e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 21408e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 2141cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul texUnit = &(ctx->Texture.Unit[ctx->Texture.CurrentUnit]); 2142cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 214377ee31930a1b0cc7766939415f4f04ed6a1fa4acBrian Paul if (!texObj || _mesa_is_proxy_texture(target)) { 2144cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(target)"); 2145cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul return; 2146cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul } 2147cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul 2148ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul maxLevels = _mesa_max_texture_levels(ctx, target); 2149ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul ASSERT(maxLevels > 0); /* 0 indicates bad target, caught above */ 2150cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul 2151cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul if (level < 0 || level >= maxLevels) { 215208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_VALUE, "glGetTexImage(level)" ); 21538e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul return; 2154289d47eee5342bd7ec1c25a29d9bdc8d6f9dc4edBrian Paul } 2155289d47eee5342bd7ec1c25a29d9bdc8d6f9dc4edBrian Paul 215662c36a2ff39d775c1f1bc377b9ddbc69e2340799Brian Paul if (_mesa_sizeof_packed_type(type) <= 0) { 215708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexImage(type)" ); 21588e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul return; 21598e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul } 21608e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 2161f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul if (_mesa_components_in_format(format) <= 0 || 2162f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul format == GL_STENCIL_INDEX) { 216308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glGetTexImage(format)" ); 21648e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul return; 21658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul } 21668e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 2167f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul if (!ctx->Extensions.EXT_paletted_texture && is_index_format(format)) { 216808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)"); 2169df926955be59a0128eea44141eb46fc52556dc05Brian Paul return; 2170f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul } 2171f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul 21724618a9bfc2cd57c47ddf3590782c751ec194d362Brian Paul if (!ctx->Extensions.SGIX_depth_texture && 21734618a9bfc2cd57c47ddf3590782c751ec194d362Brian Paul !ctx->Extensions.ARB_depth_texture && is_depth_format(format)) { 217408836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)"); 2175df926955be59a0128eea44141eb46fc52556dc05Brian Paul return; 2176f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul } 2177f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul 21781749a25ca889d514889b34cf6311c8014d97bf66Brian Paul if (!ctx->Extensions.MESA_ycbcr_texture && is_ycbcr_format(format)) { 2179c5b995066020191982b2315fc45d05e068eee761Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)"); 2180df926955be59a0128eea44141eb46fc52556dc05Brian Paul return; 2181c5b995066020191982b2315fc45d05e068eee761Brian Paul } 2182c5b995066020191982b2315fc45d05e068eee761Brian Paul 21831ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul if (!ctx->Extensions.EXT_packed_depth_stencil 21841ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul && is_depthstencil_format(format)) { 21851ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetTexImage(format)"); 2186df926955be59a0128eea44141eb46fc52556dc05Brian Paul return; 21871ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul } 21881ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul 21898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul if (!pixels) 21908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul return; 21918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 21925ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 21935ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 21945ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 21955ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage) { 21965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* invalid mipmap level, not an error */ 21975ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 21985ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 21998e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 22001749a25ca889d514889b34cf6311c8014d97bf66Brian Paul 22015ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* Make sure the requested image format is compatible with the 22025ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell * texture's format. Note that a color index texture can be converted 22035ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell * to RGBA so that combo is allowed. 22045ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell */ 22055ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (is_color_format(format) 22065ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell && !is_color_format(texImage->TexFormat->BaseFormat) 22075ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell && !is_index_format(texImage->TexFormat->BaseFormat)) { 22085ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)"); 22095ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 22105ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 22115ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell else if (is_index_format(format) 22125ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell && !is_index_format(texImage->TexFormat->BaseFormat)) { 22135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)"); 22145ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 22155ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 22165ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell else if (is_depth_format(format) 22175ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell && !is_depth_format(texImage->TexFormat->BaseFormat) 22185ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell && !is_depthstencil_format(texImage->TexFormat->BaseFormat)) { 22195ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)"); 22205ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 22215ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 22225ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell else if (is_ycbcr_format(format) 22235ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell && !is_ycbcr_format(texImage->TexFormat->BaseFormat)) { 22245ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)"); 22255ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 22265ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 22275ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell else if (is_depthstencil_format(format) 22285ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell && !is_depthstencil_format(texImage->TexFormat->BaseFormat)) { 22295ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_OPERATION, "glGetTexImage(format mismatch)"); 22305ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 22315ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 22325ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 22335ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (ctx->Pack.BufferObj->Name) { 22345ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* packing texture image into a PBO */ 22355ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell const GLuint dimensions = (target == GL_TEXTURE_3D) ? 3 : 2; 22365ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!_mesa_validate_pbo_access(dimensions, &ctx->Pack, texImage->Width, 22375ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage->Height, texImage->Depth, 22385ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell format, type, pixels)) { 22395ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_OPERATION, 22405ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell "glGetTexImage(invalid PBO access)"); 22415ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 22425ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 2243ad15866ef0e77478508eeb534b28f0136462b644Brian Paul } 2244ad15866ef0e77478508eeb534b28f0136462b644Brian Paul 22455ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* typically, this will call _mesa_get_teximage() */ 22465ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->Driver.GetTexImage(ctx, target, level, format, type, pixels, 22475ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj, texImage); 22485ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 22495ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 22505ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 22515ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2252289d47eee5342bd7ec1c25a29d9bdc8d6f9dc4edBrian Paul} 2253289d47eee5342bd7ec1c25a29d9bdc8d6f9dc4edBrian Paul 2254289d47eee5342bd7ec1c25a29d9bdc8d6f9dc4edBrian Paul 22558e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 2256519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul/** 2257519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * Check if the given texture image is bound to any framebuffer objects 2258519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * and update/invalidate them. 2259519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * XXX We're only checking the currently bound framebuffer object for now. 2260519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * In the future, perhaps struct gl_texture_image should have a pointer (or 2261519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul * list of pointers (yikes)) to the gl_framebuffer(s) which it's bound to. 2262519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul */ 2263519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paulstatic void 2264519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paulupdate_fbo_texture(GLcontext *ctx, struct gl_texture_object *texObj, 2265519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul GLuint face, GLuint level) 2266519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul{ 2267519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul if (ctx->DrawBuffer->Name) { 2268519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul GLuint i; 2269519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul for (i = 0; i < BUFFER_COUNT; i++) { 2270519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul struct gl_renderbuffer_attachment *att = 2271519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul ctx->DrawBuffer->Attachment + i; 2272519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul if (att->Type == GL_TEXTURE && 2273519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul att->Texture == texObj && 2274519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul att->TextureLevel == level && 2275519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul att->CubeMapFace == face) { 2276519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul ASSERT(att->Texture->Image[att->CubeMapFace][att->TextureLevel]); 2277519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul /* Tell driver about the new renderbuffer texture */ 2278ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ctx->Driver.RenderTexture(ctx, ctx->DrawBuffer, att); 2279519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 2280519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 2281519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 2282519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul} 2283519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 2284519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 2285519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 2286289d47eee5342bd7ec1c25a29d9bdc8d6f9dc4edBrian Paul/* 2287c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Called from the API. Note that width includes the border. 2288c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2289c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 229043911c8ef06c44d486a17cf9a8fa8ea263b08adeBrian Paul_mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat, 2291fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLint border, GLenum format, 2292fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum type, const GLvoid *pixels ) 2293c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2294ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul GLsizei postConvWidth = width; 2295fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 2296cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2297c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2298f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul if (is_color_format(internalFormat)) { 2299f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul _mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL); 2300f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul } 2301f93b3dd69e744cf1dd6b102a11cdb07c2df4a967Brian Paul 23028e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul if (target == GL_TEXTURE_1D) { 23038c3ddf4270ff075ee783a67e5d5d04fa16a9cb45Brian Paul /* non-proxy target */ 2304f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul struct gl_texture_unit *texUnit; 23050293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_object *texObj; 23060293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_image *texImage; 2307519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul const GLuint face = texture_face(target); 2308f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 2309aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul if (texture_error_check(ctx, target, level, internalFormat, 2310f93b3dd69e744cf1dd6b102a11cdb07c2df4a967Brian Paul format, type, 1, postConvWidth, 1, 1, border)) { 23118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul return; /* error was recorded */ 2312c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2313c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2314b23f5b5a5ccf5910f1d11d749c2e440e6a46259bBrian Paul if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE) 23155ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_update_state(ctx); 2316fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 23175ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 23185ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj = _mesa_select_tex_object(ctx, texUnit, target); 23195ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 23205ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 23215ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_get_tex_image(ctx, texObj, target, level); 23225ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage) { 23235ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage1D"); 23245ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 23255ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 23265ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 23275ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (texImage->Data) { 23285ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->Driver.FreeTexImageData( ctx, texImage ); 23295ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 233062c734f49948df7aeef55ad23a6664cbf3e11533Brian Paul 23315ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texImage->Data == NULL); 2332c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 23335ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell clear_teximage_fields(texImage); /* not really needed, but helpful */ 23345ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_init_teximage_fields(ctx, target, texImage, 23355ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell postConvWidth, 1, 1, 23365ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell border, internalFormat); 23375ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 23385ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.TexImage1D); 23394f295cee73bae1f687efe2dc062522b40d90b1e4Brian Paul 23405ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* Give the texture to the driver! <pixels> may be null! */ 23415ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.TexImage1D)(ctx, target, level, internalFormat, 23425ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell width, border, format, type, pixels, 23435ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell &ctx->Unpack, texObj, texImage); 23445ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 23455ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texImage->TexFormat); 2346519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 23475ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell update_fbo_texture(ctx, texObj, face, level); 23485ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 23495ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* state update */ 23505ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj->Complete = GL_FALSE; 23515ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 23525ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 23535ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 23545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2355c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 235638d3f3d660225150715bc06f6b33e394ba803299Brian Paul else if (target == GL_PROXY_TEXTURE_1D) { 2357c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* Proxy texture: check for errors and update proxy state */ 2358738318bb75dea8dac4465f53850987f6062a732dBrian Paul struct gl_texture_image *texImage; 2359738318bb75dea8dac4465f53850987f6062a732dBrian Paul texImage = _mesa_get_proxy_tex_image(ctx, target, level); 2360738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (texture_error_check(ctx, target, level, internalFormat, 2361738318bb75dea8dac4465f53850987f6062a732dBrian Paul format, type, 1, postConvWidth, 1, 1, border)) { 2362738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* when error, clear all proxy texture image parameters */ 2363a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (texImage) 2364a3f137094cd965d27e1b088499dd609b81a91906Brian Paul clear_teximage_fields(texImage); 2365c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 236689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else { 236789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* no error, set the tex image parameters */ 2368738318bb75dea8dac4465f53850987f6062a732dBrian Paul ASSERT(texImage); 236989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_init_teximage_fields(ctx, target, texImage, 237089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul postConvWidth, 1, 1, 237189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul border, internalFormat); 2372738318bb75dea8dac4465f53850987f6062a732dBrian Paul texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx, 2373738318bb75dea8dac4465f53850987f6062a732dBrian Paul internalFormat, format, type); 237489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 2375c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2376c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 237708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexImage1D(target)" ); 2378c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return; 2379c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2380c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2381c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2382c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2383c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 238443911c8ef06c44d486a17cf9a8fa8ea263b08adeBrian Paul_mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat, 2385fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLsizei height, GLint border, 2386fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum format, GLenum type, 2387fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLvoid *pixels ) 2388c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2389ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul GLsizei postConvWidth = width, postConvHeight = height; 2390fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 2391cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2392c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2393f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul if (is_color_format(internalFormat)) { 2394f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul _mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth, 239538f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes &postConvHeight); 2396f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul } 2397f93b3dd69e744cf1dd6b102a11cdb07c2df4a967Brian Paul 23988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul if (target == GL_TEXTURE_2D || 2399a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell (ctx->Extensions.ARB_texture_cube_map && 2400fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB && 24018afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) || 24028afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul (ctx->Extensions.NV_texture_rectangle && 24038afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul target == GL_TEXTURE_RECTANGLE_NV)) { 24048e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul /* non-proxy target */ 2405f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul struct gl_texture_unit *texUnit; 24060293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_object *texObj; 24070293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_image *texImage; 2408519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul const GLuint face = texture_face(target); 2409f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 2410aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul if (texture_error_check(ctx, target, level, internalFormat, 2411f93b3dd69e744cf1dd6b102a11cdb07c2df4a967Brian Paul format, type, 2, postConvWidth, postConvHeight, 2412f93b3dd69e744cf1dd6b102a11cdb07c2df4a967Brian Paul 1, border)) { 24138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul return; /* error was recorded */ 2414c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2415c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2416b23f5b5a5ccf5910f1d11d749c2e440e6a46259bBrian Paul if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE) 24175ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_update_state(ctx); 2418fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 24195ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 24205ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj = _mesa_select_tex_object(ctx, texUnit, target); 24215ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 24225ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 24235ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_get_tex_image(ctx, texObj, target, level); 24245ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage) { 24255ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage2D"); 24265ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 24275ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 24285ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 24295ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (texImage->Data) { 24305ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->Driver.FreeTexImageData( ctx, texImage ); 24315ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 24325ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 24335ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texImage->Data == NULL); 24345ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell clear_teximage_fields(texImage); /* not really needed, but helpful */ 24355ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_init_teximage_fields(ctx, target, texImage, 24365ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell postConvWidth, postConvHeight, 1, 24375ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell border, internalFormat); 24385ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 24395ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.TexImage2D); 24405ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 24415ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* Give the texture to the driver! <pixels> may be null! */ 24425ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.TexImage2D)(ctx, target, level, internalFormat, 24435ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell width, height, border, format, type, pixels, 24445ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell &ctx->Unpack, texObj, texImage); 24455ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 24465ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texImage->TexFormat); 24475ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 24485ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell update_fbo_texture(ctx, texObj, face, level); 24495ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 24505ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* state update */ 24515ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj->Complete = GL_FALSE; 24525ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 24535ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 24545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 24555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2456afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2457172281dad8d1f1d32f5f31583a5fa565aa1bf5daBrian Paul else if (target == GL_PROXY_TEXTURE_2D || 2458172281dad8d1f1d32f5f31583a5fa565aa1bf5daBrian Paul (target == GL_PROXY_TEXTURE_CUBE_MAP_ARB && 24598afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul ctx->Extensions.ARB_texture_cube_map) || 24608afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul (target == GL_PROXY_TEXTURE_RECTANGLE_NV && 24618afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul ctx->Extensions.NV_texture_rectangle)) { 2462afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Proxy texture: check for errors and update proxy state */ 2463738318bb75dea8dac4465f53850987f6062a732dBrian Paul struct gl_texture_image *texImage; 2464738318bb75dea8dac4465f53850987f6062a732dBrian Paul texImage = _mesa_get_proxy_tex_image(ctx, target, level); 2465738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (texture_error_check(ctx, target, level, internalFormat, 2466738318bb75dea8dac4465f53850987f6062a732dBrian Paul format, type, 2, postConvWidth, postConvHeight, 2467738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1, border)) { 2468738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* when error, clear all proxy texture image parameters */ 2469a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (texImage) 247018fa367ac6e035341f5eb86ecc4231124b2921e3Keith Whitwell clear_teximage_fields(ctx->Texture.Proxy2D->Image[0][level]); 2471afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 247289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else { 247389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* no error, set the tex image parameters */ 247489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_init_teximage_fields(ctx, target, texImage, 247589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul postConvWidth, postConvHeight, 1, 247689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul border, internalFormat); 2477738318bb75dea8dac4465f53850987f6062a732dBrian Paul texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx, 2478738318bb75dea8dac4465f53850987f6062a732dBrian Paul internalFormat, format, type); 247989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 2480afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2481afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 248208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexImage2D(target)" ); 2483afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 2484afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2485afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2486afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2487afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2488afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 2489afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Called by the API or display list executor. 2490afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Note that width and height include the border. 2491afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 2492c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2493b5fd886ee12ef52126969f712dee0bd4b2eea706Brian Paul_mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat, 2494fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLsizei height, GLsizei depth, 2495fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint border, GLenum format, GLenum type, 2496fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLvoid *pixels ) 2497afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 2498fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 2499cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2500afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 25018e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul if (target == GL_TEXTURE_3D) { 2502519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul /* non-proxy target */ 2503f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul struct gl_texture_unit *texUnit; 25040293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_object *texObj; 25050293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_image *texImage; 2506519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul const GLuint face = texture_face(target); 2507289d47eee5342bd7ec1c25a29d9bdc8d6f9dc4edBrian Paul 25085535aca5dffdfb8ad9a1970a062e6109227aa17fBrian Paul if (texture_error_check(ctx, target, level, (GLint) internalFormat, 2509aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul format, type, 3, width, height, depth, border)) { 25108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul return; /* error was recorded */ 2511afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2512afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 25135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE) 25145ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_update_state(ctx); 25155ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 2516f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 25178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 25185ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 25195ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 25205ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_get_tex_image(ctx, texObj, target, level); 25215ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage) { 25225ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage3D"); 25235ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 25245ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 25255ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 25265ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (texImage->Data) { 25275ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->Driver.FreeTexImageData( ctx, texImage ); 25285ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 25295ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 25305ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texImage->Data == NULL); 25315ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell clear_teximage_fields(texImage); /* not really needed, but helpful */ 25325ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_init_teximage_fields(ctx, target, texImage, 25335ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell width, height, depth, 25345ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell border, internalFormat); 2535fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 25365ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.TexImage3D); 253762c734f49948df7aeef55ad23a6664cbf3e11533Brian Paul 25385ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* Give the texture to the driver! <pixels> may be null! */ 25395ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.TexImage3D)(ctx, target, level, internalFormat, 25405ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell width, height, depth, border, format, type, 25415ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell pixels, &ctx->Unpack, texObj, texImage); 2542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 25435ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texImage->TexFormat); 25444f295cee73bae1f687efe2dc062522b40d90b1e4Brian Paul 25455ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell update_fbo_texture(ctx, texObj, face, level); 2546519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 25475ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* state update */ 25485ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj->Complete = GL_FALSE; 25495ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 25505ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 25515ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 25525ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 255438d3f3d660225150715bc06f6b33e394ba803299Brian Paul else if (target == GL_PROXY_TEXTURE_3D) { 2555afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* Proxy texture: check for errors and update proxy state */ 2556738318bb75dea8dac4465f53850987f6062a732dBrian Paul struct gl_texture_image *texImage; 2557738318bb75dea8dac4465f53850987f6062a732dBrian Paul texImage = _mesa_get_proxy_tex_image(ctx, target, level); 2558738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (texture_error_check(ctx, target, level, internalFormat, 2559738318bb75dea8dac4465f53850987f6062a732dBrian Paul format, type, 3, width, height, depth, border)) { 2560738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* when error, clear all proxy texture image parameters */ 2561a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (texImage) 2562a3f137094cd965d27e1b088499dd609b81a91906Brian Paul clear_teximage_fields(texImage); 2563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 256489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else { 256589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* no error, set the tex image parameters */ 256689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_init_teximage_fields(ctx, target, texImage, width, height, 1, 256789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul border, internalFormat); 2568738318bb75dea8dac4465f53850987f6062a732dBrian Paul texImage->TexFormat = (*ctx->Driver.ChooseTextureFormat)(ctx, 2569738318bb75dea8dac4465f53850987f6062a732dBrian Paul internalFormat, format, type); 257089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 2571afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg else { 257308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error( ctx, GL_INVALID_ENUM, "glTexImage3D(target)" ); 2574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return; 2575afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2576afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2577afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2578afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2579c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 258043911c8ef06c44d486a17cf9a8fa8ea263b08adeBrian Paul_mesa_TexImage3DEXT( GLenum target, GLint level, GLenum internalFormat, 2581663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul GLsizei width, GLsizei height, GLsizei depth, 2582663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul GLint border, GLenum format, GLenum type, 2583663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul const GLvoid *pixels ) 2584663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul{ 258589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_TexImage3D(target, level, (GLint) internalFormat, width, height, 2586663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul depth, border, format, type, pixels); 2587663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul} 2588663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul 2589663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul 2590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2591c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2592fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_TexSubImage1D( GLenum target, GLint level, 2593fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLsizei width, 2594fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum format, GLenum type, 2595fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLvoid *pixels ) 2596afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 2597ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul GLsizei postConvWidth = width; 25980293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_unit *texUnit; 25990293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_object *texObj; 26005ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell struct gl_texture_image *texImage = NULL; 26012c3d34c905fa6b831a066afae83b938de05eb241Gareth Hughes GET_CURRENT_CONTEXT(ctx); 260275280a2c742ee241d392618a3b29548fce1520a9Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 260375280a2c742ee241d392618a3b29548fce1520a9Brian Paul 2604b23f5b5a5ccf5910f1d11d749c2e440e6a46259bBrian Paul if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE) 260508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_update_state(ctx); 26062aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul 2607f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul /* XXX should test internal format */ 2608f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul if (is_color_format(format)) { 2609f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul _mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL); 2610f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul } 2611afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2612c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (subtexture_error_check(ctx, 1, target, level, xoffset, 0, 0, 26135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell postConvWidth, 1, 1, format, type)) { 2614f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; /* error was detected */ 2615afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2616afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 26175ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 26180293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 26198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 26205ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell assert(texObj); 2621afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 26225ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 26235ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 26245ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 2625afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 26265ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (subtexture_error_check2(ctx, 1, target, level, xoffset, 0, 0, 26275ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell postConvWidth, 1, 1, format, type, texImage)) { 26285ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; /* error was detected */ 26295ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 26305ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 26315ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (width == 0) 26325ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; /* no-op, not an error */ 26335ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 26345ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* If we have a border, xoffset=-1 is legal. Bias by border width */ 26355ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell xoffset += texImage->Border; 2636347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul 26375ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.TexSubImage1D); 26385ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.TexSubImage1D)(ctx, target, level, xoffset, width, 26395ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell format, type, pixels, &ctx->Unpack, 26405ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj, texImage); 26415ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 26425ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 26435ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 26445ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2645afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2646afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2647afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2648c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2649fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_TexSubImage2D( GLenum target, GLint level, 2650fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLint yoffset, 2651fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLsizei height, 2652fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum format, GLenum type, 2653fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLvoid *pixels ) 2654afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 2655ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul GLsizei postConvWidth = width, postConvHeight = height; 26560293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_unit *texUnit; 26570293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_object *texObj; 26580293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_image *texImage; 26592c3d34c905fa6b831a066afae83b938de05eb241Gareth Hughes GET_CURRENT_CONTEXT(ctx); 266075280a2c742ee241d392618a3b29548fce1520a9Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 266175280a2c742ee241d392618a3b29548fce1520a9Brian Paul 2662b23f5b5a5ccf5910f1d11d749c2e440e6a46259bBrian Paul if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE) 266308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_update_state(ctx); 26642aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul 2665f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul /* XXX should test internal format */ 2666f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul if (is_color_format(format)) { 2667f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul _mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth, 2668f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul &postConvHeight); 2669f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul } 2670afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2671c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (subtexture_error_check(ctx, 2, target, level, xoffset, yoffset, 0, 26725ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell postConvWidth, postConvHeight, 1, format, type)) { 2673f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; /* error was detected */ 2674afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2675afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 26760293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 267735d5301a54153930ee6fd60dff1010ce9f901397Brian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 26785ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 26795ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 26805ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 2681afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 26825ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (subtexture_error_check2(ctx, 2, target, level, xoffset, yoffset, 0, 26835ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell postConvWidth, postConvHeight, 1, format, type, 26845ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage)) { 26855ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; /* error was detected */ 26865ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 2687afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 26885ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (width == 0 || height == 0) 26895ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; /* no-op, not an error */ 2690347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul 26915ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* If we have a border, xoffset=-1 is legal. Bias by border width */ 26925ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell xoffset += texImage->Border; 26935ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell yoffset += texImage->Border; 26945ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 26955ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.TexSubImage2D); 26965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.TexSubImage2D)(ctx, target, level, xoffset, yoffset, 26975ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell width, height, format, type, pixels, 26985ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell &ctx->Unpack, texObj, texImage); 26995ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 27005ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 27015ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 27025ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2704afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2705afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2706afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2707c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2708fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_TexSubImage3D( GLenum target, GLint level, 2709fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 2710fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLsizei height, GLsizei depth, 2711fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum format, GLenum type, 2712fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLvoid *pixels ) 2713afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 27140293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_unit *texUnit; 27150293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_object *texObj; 27160293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_image *texImage; 27172c3d34c905fa6b831a066afae83b938de05eb241Gareth Hughes GET_CURRENT_CONTEXT(ctx); 271875280a2c742ee241d392618a3b29548fce1520a9Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 271975280a2c742ee241d392618a3b29548fce1520a9Brian Paul 2720b23f5b5a5ccf5910f1d11d749c2e440e6a46259bBrian Paul if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE) 272108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_update_state(ctx); 27222aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul 2723c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (subtexture_error_check(ctx, 3, target, level, xoffset, yoffset, zoffset, 2724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul width, height, depth, format, type)) { 2725f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; /* error was detected */ 2726afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2727afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 27280293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 27298e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 27305ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 27315ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 27325ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 27335ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 27345ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 27355ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (subtexture_error_check2(ctx, 3, target, level, xoffset, yoffset, zoffset, 27365ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell width, height, depth, format, type, texImage)) { 27375ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; /* error was detected */ 27385ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 27395ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 27405ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (width == 0 || height == 0 || height == 0) 27415ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; /* no-op, not an error */ 27425ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 27435ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* If we have a border, xoffset=-1 is legal. Bias by border width */ 27445ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell xoffset += texImage->Border; 27455ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell yoffset += texImage->Border; 27465ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell zoffset += texImage->Border; 27475ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 27485ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.TexSubImage3D); 27495ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.TexSubImage3D)(ctx, target, level, 27505ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell xoffset, yoffset, zoffset, 27515ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell width, height, depth, 27525ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell format, type, pixels, 27535ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell &ctx->Unpack, texObj, texImage ); 27545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 27555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 27565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 27575ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2758afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2759afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2760afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2761afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2762c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2763fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CopyTexImage1D( GLenum target, GLint level, 2764fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum internalFormat, 2765fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint x, GLint y, 2766fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLint border ) 2767afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 27682aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul struct gl_texture_unit *texUnit; 27692aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul struct gl_texture_object *texObj; 27702aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul struct gl_texture_image *texImage; 2771ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul GLsizei postConvWidth = width; 2772519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul const GLuint face = texture_face(target); 2773fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 2774cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2775afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2776b23f5b5a5ccf5910f1d11d749c2e440e6a46259bBrian Paul if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE) 277708836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_update_state(ctx); 2778fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 2779f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul if (is_color_format(internalFormat)) { 2780f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul _mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL); 2781f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul } 2782ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul 2783ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul if (copytexture_error_check(ctx, 1, target, level, internalFormat, 2784ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul postConvWidth, 1, border)) 2785ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul return; 2786ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul 27872aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 27882aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 27895ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 27905ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 27915ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_get_tex_image(ctx, texObj, target, level); 27925ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage) { 27935ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage1D"); 27945ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 27955ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 27965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 27975ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (texImage->Data) { 27985ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->Driver.FreeTexImageData( ctx, texImage ); 27995ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 28005ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 28015ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texImage->Data == NULL); 28027dac13272a959654f1010b80c1f1ec6dcae5a4faBrian Paul 28035ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell clear_teximage_fields(texImage); /* not really needed, but helpful */ 28045ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_init_teximage_fields(ctx, target, texImage, postConvWidth, 1, 1, 28055ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell border, internalFormat); 28067dac13272a959654f1010b80c1f1ec6dcae5a4faBrian Paul 28072aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul 28085ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.CopyTexImage1D); 28095ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.CopyTexImage1D)(ctx, target, level, internalFormat, 28105ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell x, y, width, border); 28112aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul 28125ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texImage->TexFormat); 28134f295cee73bae1f687efe2dc062522b40d90b1e4Brian Paul 28145ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell update_fbo_texture(ctx, texObj, face, level); 2815519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 28165ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* state update */ 28175ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj->Complete = GL_FALSE; 28185ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 28195ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 28205ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 28215ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2822afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2823afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2824afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2825afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2826c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2827fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat, 2828fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint x, GLint y, GLsizei width, GLsizei height, 2829fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint border ) 2830afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 28312aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul struct gl_texture_unit *texUnit; 28322aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul struct gl_texture_object *texObj; 28332aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul struct gl_texture_image *texImage; 2834ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul GLsizei postConvWidth = width, postConvHeight = height; 2835519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul const GLuint face = texture_face(target); 2836fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 2837cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2838afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2839b23f5b5a5ccf5910f1d11d749c2e440e6a46259bBrian Paul if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE) 284008836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_update_state(ctx); 2841fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 2842f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul if (is_color_format(internalFormat)) { 2843f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul _mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth, 2844f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul &postConvHeight); 2845f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul } 2846ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul 2847ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul if (copytexture_error_check(ctx, 2, target, level, internalFormat, 2848ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul postConvWidth, postConvHeight, border)) 2849ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul return; 2850ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul 28512aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 28522aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 28537dac13272a959654f1010b80c1f1ec6dcae5a4faBrian Paul 28545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 28555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 28565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_get_tex_image(ctx, texObj, target, level); 2857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 28585ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage) { 28595ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage2D"); 28605ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 28615ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 28625ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 28635ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (texImage->Data) { 28645ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->Driver.FreeTexImageData( ctx, texImage ); 28655ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 28665ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 28675ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texImage->Data == NULL); 28682aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul 28695ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell clear_teximage_fields(texImage); /* not really needed, but helpful */ 28705ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_init_teximage_fields(ctx, target, texImage, 28715ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell postConvWidth, postConvHeight, 1, 28725ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell border, internalFormat); 28735ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 28745ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.CopyTexImage2D); 28755ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.CopyTexImage2D)(ctx, target, level, internalFormat, 28765ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell x, y, width, height, border); 28775ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 28785ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texImage->TexFormat); 28794f295cee73bae1f687efe2dc062522b40d90b1e4Brian Paul 28805ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell update_fbo_texture(ctx, texObj, face, level); 2881519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 28825ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* state update */ 28835ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj->Complete = GL_FALSE; 28845ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 28855ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 28865ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 28875ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2888afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2889afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2890afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2891c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2892fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CopyTexSubImage1D( GLenum target, GLint level, 2893fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLint x, GLint y, GLsizei width ) 2894afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 2895347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul struct gl_texture_unit *texUnit; 28965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell struct gl_texture_object *texObj; 2897347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul struct gl_texture_image *texImage; 2898ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul GLsizei postConvWidth = width; 2899fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 2900cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2901afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2902b23f5b5a5ccf5910f1d11d749c2e440e6a46259bBrian Paul if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE) 290308836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_update_state(ctx); 2904fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 2905f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul /* XXX should test internal format */ 29068e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul _mesa_adjust_image_for_convolution(ctx, 1, &postConvWidth, NULL); 2907ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul 2908ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul if (copytexsubimage_error_check(ctx, 1, target, level, 2909ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul xoffset, 0, 0, postConvWidth, 1)) 2910ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul return; 2911ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul 2912347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 29135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj = _mesa_select_tex_object(ctx, texUnit, target); 29145ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 29155ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 29165ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 29175ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 29185ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 29195ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (copytexsubimage_error_check2(ctx, 1, target, level, 29205ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell xoffset, 0, 0, postConvWidth, 1, 29215ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage)) 29225ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 29235ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 2924347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul 29255ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* If we have a border, xoffset=-1 is legal. Bias by border width */ 29265ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell xoffset += texImage->Border; 2927347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul 29285ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.CopyTexSubImage1D); 29295ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.CopyTexSubImage1D)(ctx, target, level, xoffset, x, y, width); 29305ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 29315ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 29325ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 29335ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2934afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2935afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2936afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2937afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2938c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2939fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CopyTexSubImage2D( GLenum target, GLint level, 2940fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLint yoffset, 2941fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint x, GLint y, GLsizei width, GLsizei height ) 2942afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 2943347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul struct gl_texture_unit *texUnit; 29445ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell struct gl_texture_object *texObj; 2945347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul struct gl_texture_image *texImage; 2946ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul GLsizei postConvWidth = width, postConvHeight = height; 2947fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 2948cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2949afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2950b23f5b5a5ccf5910f1d11d749c2e440e6a46259bBrian Paul if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE) 295108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_update_state(ctx); 2952fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 2953f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul /* XXX should test internal format */ 2954f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul _mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth, &postConvHeight); 2955ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul 2956ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul if (copytexsubimage_error_check(ctx, 2, target, level, xoffset, yoffset, 0, 2957ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul postConvWidth, postConvHeight)) 2958ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul return; 2959ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul 2960347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 29615ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj = _mesa_select_tex_object(ctx, texUnit, target); 29625ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 29635ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 29645ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 29655ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 2966347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul 29675ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (copytexsubimage_error_check2(ctx, 2, target, level, xoffset, yoffset, 0, 29685ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell postConvWidth, postConvHeight, texImage)) 29695ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 2970347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul 29715ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* If we have a border, xoffset=-1 is legal. Bias by border width */ 29725ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell xoffset += texImage->Border; 29735ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell yoffset += texImage->Border; 29745ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 29755ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.CopyTexSubImage2D); 29765ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.CopyTexSubImage2D)(ctx, target, level, 29775ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell xoffset, yoffset, x, y, width, height); 29785ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 29795ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 29805ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 29815ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2983afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2985afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2986c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2987fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CopyTexSubImage3D( GLenum target, GLint level, 2988fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 2989fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint x, GLint y, GLsizei width, GLsizei height ) 2990afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 2991347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul struct gl_texture_unit *texUnit; 29925ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell struct gl_texture_object *texObj; 2993347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul struct gl_texture_image *texImage; 2994ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul GLsizei postConvWidth = width, postConvHeight = height; 2995fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 2996cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2998b23f5b5a5ccf5910f1d11d749c2e440e6a46259bBrian Paul if (ctx->NewState & _IMAGE_NEW_TRANSFER_STATE) 299908836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_update_state(ctx); 3000fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 3001f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul /* XXX should test internal format */ 3002f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul _mesa_adjust_image_for_convolution(ctx, 2, &postConvWidth, &postConvHeight); 3003ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul 3004ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul if (copytexsubimage_error_check(ctx, 3, target, level, xoffset, yoffset, 3005ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul zoffset, postConvWidth, postConvHeight)) 3006ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul return; 3007ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul 3008347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 30095ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj = _mesa_select_tex_object(ctx, texUnit, target); 3010347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul 30115ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 30125ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 30135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 3014347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul 30155ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (copytexsubimage_error_check2(ctx, 3, target, level, xoffset, yoffset, 30165ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell zoffset, postConvWidth, postConvHeight, 30175ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage)) 30185ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 30195ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 30205ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* If we have a border, xoffset=-1 is legal. Bias by border width */ 30215ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell xoffset += texImage->Border; 30225ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell yoffset += texImage->Border; 30235ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell zoffset += texImage->Border; 30245ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 30255ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.CopyTexSubImage3D); 30265ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.CopyTexSubImage3D)(ctx, target, level, 30275ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell xoffset, yoffset, zoffset, 30285ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell x, y, width, height); 30295ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 30305ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 30315ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 30325ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 3033afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 30341207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 30351207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 30361207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 303789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 303889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**********************************************************************/ 303989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/****** Compressed Textures ******/ 304089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**********************************************************************/ 304189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 304289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 304389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 304489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Error checking for glCompressedTexImage[123]D(). 304589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * \return error code or GL_NO_ERROR. 304689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 304789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulstatic GLenum 304889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulcompressed_texture_error_check(GLcontext *ctx, GLint dimensions, 304989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum target, GLint level, 305089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum internalFormat, GLsizei width, 305189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei height, GLsizei depth, GLint border, 305289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei imageSize) 305389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 3054c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul GLint expectedSize, maxLevels = 0, maxTextureSize; 305589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 305689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (dimensions == 1) { 305789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* 1D compressed textures not allowed */ 305889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; 305989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 306089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (dimensions == 2) { 306189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (target == GL_PROXY_TEXTURE_2D) { 306289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxLevels = ctx->Const.MaxTextureLevels; 306389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 306489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (target == GL_TEXTURE_2D) { 306589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxLevels = ctx->Const.MaxTextureLevels; 306689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 306789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (target == GL_PROXY_TEXTURE_CUBE_MAP_ARB) { 306889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (!ctx->Extensions.ARB_texture_cube_map) 306989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; /*target*/ 307089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxLevels = ctx->Const.MaxCubeTextureLevels; 307189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 307289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB && 307389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) { 307489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (!ctx->Extensions.ARB_texture_cube_map) 307589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; /*target*/ 307689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxLevels = ctx->Const.MaxCubeTextureLevels; 307789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 307889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else { 307989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; /*target*/ 308089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 308189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 308289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (dimensions == 3) { 308389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* 3D compressed textures not allowed */ 308489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; 308589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 308689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 308789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxTextureSize = 1 << (maxLevels - 1); 308889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3089c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul /* This will detect any invalid internalFormat value */ 309040bd9d0b190e11d39350d1b08d2c2b28e3040bcaDaniel Borca if (!is_compressed_format(ctx, internalFormat)) 309189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; 309289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3093c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul /* This should really never fail */ 3094a2dc424acfe83f3c66d3509f5a1efc24ce884367Ian Romanick if (_mesa_base_tex_format(ctx, internalFormat) < 0) 3095a2dc424acfe83f3c66d3509f5a1efc24ce884367Ian Romanick return GL_INVALID_ENUM; 3096a2dc424acfe83f3c66d3509f5a1efc24ce884367Ian Romanick 309789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (border != 0) 309889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 309989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3100887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul /* 3101887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul * XXX We should probably use the proxy texture error check function here. 3102887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul */ 3103887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul if (width < 1 || width > maxTextureSize || 31042982dce27e242c89e4bc99979a878263df33ad2fDaniel Borca (!ctx->Extensions.ARB_texture_non_power_of_two && _mesa_bitcount(width) != 1)) 310589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 310689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3107887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul if ((height < 1 || height > maxTextureSize || 31082982dce27e242c89e4bc99979a878263df33ad2fDaniel Borca (!ctx->Extensions.ARB_texture_non_power_of_two && _mesa_bitcount(height) != 1)) 310989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul && dimensions > 1) 311089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 311189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3112887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul if ((depth < 1 || depth > maxTextureSize || 31132982dce27e242c89e4bc99979a878263df33ad2fDaniel Borca (!ctx->Extensions.ARB_texture_non_power_of_two && _mesa_bitcount(depth) != 1)) 311489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul && dimensions > 2) 311589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 311689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 311789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* For cube map, width must equal height */ 311889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB && 311989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB && width != height) 312089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 312189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 312289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (level < 0 || level >= maxLevels) 312389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 312489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3125c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul expectedSize = _mesa_compressed_texture_size_glenum(ctx, width, height, 3126c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul depth, internalFormat); 312789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (expectedSize != imageSize) 312889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 312989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 31300a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul#if FEATURE_EXT_texture_sRGB 31310a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul if ((internalFormat == GL_COMPRESSED_SRGB_S3TC_DXT1_EXT || 31320a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul internalFormat == GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT || 31330a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul internalFormat == GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT || 31340a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul internalFormat == GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT) 31350a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul && border != 0) { 31360a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul return GL_INVALID_OPERATION; 31370a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul } 31380a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul#endif 31390a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul 314089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_NO_ERROR; 314189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 314289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 314389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 314489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 314589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Error checking for glCompressedTexSubImage[123]D(). 31462371033bbaf6e7477bfa893654a0467a084f335bBrian Paul * \warning There are some bad assumptions here about the size of compressed 31472371033bbaf6e7477bfa893654a0467a084f335bBrian Paul * texture tiles (multiple of 4) used to test the validity of the 31482371033bbaf6e7477bfa893654a0467a084f335bBrian Paul * offset and size parameters. 314989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * \return error code or GL_NO_ERROR. 315089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 315189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulstatic GLenum 315289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulcompressed_subtexture_error_check(GLcontext *ctx, GLint dimensions, 315389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum target, GLint level, 315489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 315589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei width, GLsizei height, GLsizei depth, 315689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, GLsizei imageSize) 315789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 315889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint expectedSize, maxLevels = 0, maxTextureSize; 3159a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) zoffset; 316089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 316189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (dimensions == 1) { 316289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* 1D compressed textures not allowed */ 316389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; 316489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 316589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (dimensions == 2) { 316689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (target == GL_PROXY_TEXTURE_2D) { 316789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxLevels = ctx->Const.MaxTextureLevels; 316889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 316989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (target == GL_TEXTURE_2D) { 317089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxLevels = ctx->Const.MaxTextureLevels; 317189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 317289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (target == GL_PROXY_TEXTURE_CUBE_MAP_ARB) { 317389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (!ctx->Extensions.ARB_texture_cube_map) 317489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; /*target*/ 317589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxLevels = ctx->Const.MaxCubeTextureLevels; 317689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 317789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB && 317889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB) { 317989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (!ctx->Extensions.ARB_texture_cube_map) 318089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; /*target*/ 318189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxLevels = ctx->Const.MaxCubeTextureLevels; 318289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 318389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else { 318489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; /*target*/ 318589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 318689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 318789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (dimensions == 3) { 318889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* 3D compressed textures not allowed */ 318989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; 319089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 319189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 319289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxTextureSize = 1 << (maxLevels - 1); 319389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3194c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul /* this will catch any invalid compressed format token */ 319540bd9d0b190e11d39350d1b08d2c2b28e3040bcaDaniel Borca if (!is_compressed_format(ctx, format)) 319689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; 319789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3198887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul if (width < 1 || width > maxTextureSize) 319989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 320089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3201887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul if ((height < 1 || height > maxTextureSize) 320289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul && dimensions > 1) 320389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 320489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 320589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (level < 0 || level >= maxLevels) 320689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 320789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 32082371033bbaf6e7477bfa893654a0467a084f335bBrian Paul /* XXX these tests are specific to the compressed format. 32092371033bbaf6e7477bfa893654a0467a084f335bBrian Paul * this code should be generalized in some way. 32102371033bbaf6e7477bfa893654a0467a084f335bBrian Paul */ 321189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if ((xoffset & 3) != 0 || (yoffset & 3) != 0) 321289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 321389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 321489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if ((width & 3) != 0 && width != 2 && width != 1) 321589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 321689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 321789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if ((height & 3) != 0 && height != 2 && height != 1) 321889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 321989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3220c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul expectedSize = _mesa_compressed_texture_size_glenum(ctx, width, height, 3221c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul depth, format); 322289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (expectedSize != imageSize) 322389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 322489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 322589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_NO_ERROR; 322689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 322789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 322889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 322989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3230c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 32311207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul_mesa_CompressedTexImage1DARB(GLenum target, GLint level, 3232aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul GLenum internalFormat, GLsizei width, 32331207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLint border, GLsizei imageSize, 32341207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul const GLvoid *data) 32351207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{ 3236aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul GET_CURRENT_CONTEXT(ctx); 3237cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3238aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 3239aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul if (target == GL_TEXTURE_1D) { 32408c3ddf4270ff075ee783a67e5d5d04fa16a9cb45Brian Paul /* non-proxy target */ 3241aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul struct gl_texture_unit *texUnit; 3242aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul struct gl_texture_object *texObj; 3243aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul struct gl_texture_image *texImage; 324489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum error = compressed_texture_error_check(ctx, 1, target, level, 324589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul internalFormat, width, 1, 1, border, imageSize); 324689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (error) { 324789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, error, "glCompressedTexImage1D"); 324889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 3249aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 3250aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 3251aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 32528e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 3253aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 32545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 32555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 32565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_get_tex_image(ctx, texObj, target, level); 32575ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage) { 32585ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage1D"); 32595ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 32605ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 32615ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 32625ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (texImage->Data) { 32635ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->Driver.FreeTexImageData( ctx, texImage ); 32645ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 32655ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texImage->Data == NULL); 32665ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 32675ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_init_teximage_fields(ctx, target, texImage, width, 1, 1, 32685ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell border, internalFormat); 32696628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul 32705ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.CompressedTexImage1D); 32715ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.CompressedTexImage1D)(ctx, target, level, 32725ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell internalFormat, width, border, 32735ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell imageSize, data, 32745ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj, texImage); 3275aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 32765ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* state update */ 32775ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj->Complete = GL_FALSE; 32785ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 32795ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 32805ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 32815ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 3282aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 3283aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul else if (target == GL_PROXY_TEXTURE_1D) { 3284aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul /* Proxy texture: check for errors and update proxy state */ 328589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum error = compressed_texture_error_check(ctx, 1, target, level, 328689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul internalFormat, width, 1, 1, border, imageSize); 32878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul if (!error) { 32888e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ASSERT(ctx->Driver.TestProxyTexImage); 328938d3f3d660225150715bc06f6b33e394ba803299Brian Paul error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, 329038d3f3d660225150715bc06f6b33e394ba803299Brian Paul internalFormat, GL_NONE, GL_NONE, 329138d3f3d660225150715bc06f6b33e394ba803299Brian Paul width, 1, 1, border); 329238d3f3d660225150715bc06f6b33e394ba803299Brian Paul } 329338d3f3d660225150715bc06f6b33e394ba803299Brian Paul if (error) { 3294aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul /* if error, clear all proxy texture image parameters */ 3295a3f137094cd965d27e1b088499dd609b81a91906Brian Paul struct gl_texture_image *texImage; 3296a3f137094cd965d27e1b088499dd609b81a91906Brian Paul texImage = _mesa_get_proxy_tex_image(ctx, target, level); 3297a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (texImage) 3298a3f137094cd965d27e1b088499dd609b81a91906Brian Paul clear_teximage_fields(texImage); 3299aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 330089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else { 330189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* store the teximage parameters */ 330289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_unit *texUnit; 33035ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell struct gl_texture_object *texObj; 330489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage; 330589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 33065ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj = _mesa_select_tex_object(ctx, texUnit, target); 33075ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 33085ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 33095ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 33105ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 33115ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_init_teximage_fields(ctx, target, texImage, width, 1, 1, 33125ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell border, internalFormat); 33135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 33145ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 331589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 3316aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 3317aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul else { 331889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage1D(target)"); 3319aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul return; 3320aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 33211207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul} 33221207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 33231207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 3324c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 33251207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul_mesa_CompressedTexImage2DARB(GLenum target, GLint level, 3326aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul GLenum internalFormat, GLsizei width, 33271207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLsizei height, GLint border, GLsizei imageSize, 33281207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul const GLvoid *data) 33291207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{ 3330aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul GET_CURRENT_CONTEXT(ctx); 3331cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3332aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 33338e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul if (target == GL_TEXTURE_2D || 3334a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell (ctx->Extensions.ARB_texture_cube_map && 33359540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul target >= GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB && 333689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul target <= GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB)) { 33378c3ddf4270ff075ee783a67e5d5d04fa16a9cb45Brian Paul /* non-proxy target */ 3338aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul struct gl_texture_unit *texUnit; 3339aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul struct gl_texture_object *texObj; 3340aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul struct gl_texture_image *texImage; 334189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum error = compressed_texture_error_check(ctx, 2, target, level, 334289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul internalFormat, width, height, 1, border, imageSize); 334389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (error) { 334489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, error, "glCompressedTexImage2D"); 334589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 3346aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 3347aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 3348aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 33498e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 3350aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 33515ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 33525ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 33535ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_get_tex_image(ctx, texObj, target, level); 33545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage) { 33555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage2D"); 33565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 33575ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 33585ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 33595ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (texImage->Data) { 33605ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->Driver.FreeTexImageData( ctx, texImage ); 33615ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 33625ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texImage->Data == NULL); 33636628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul 33645ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_init_teximage_fields(ctx, target, texImage, width, height, 1, 33655ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell border, internalFormat); 3366aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 33675ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.CompressedTexImage2D); 33685ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.CompressedTexImage2D)(ctx, target, level, 33695ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell internalFormat, width, height, 33705ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell border, imageSize, data, 33715ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj, texImage); 33725ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 33735ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* state update */ 33745ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj->Complete = GL_FALSE; 33755ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 33765ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 33775ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 33785ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 3379aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 338089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (target == GL_PROXY_TEXTURE_2D || 338189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul (target == GL_PROXY_TEXTURE_CUBE_MAP_ARB && 338289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul ctx->Extensions.ARB_texture_cube_map)) { 3383aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul /* Proxy texture: check for errors and update proxy state */ 338489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum error = compressed_texture_error_check(ctx, 2, target, level, 338589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul internalFormat, width, height, 1, border, imageSize); 33868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul if (!error) { 33878e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ASSERT(ctx->Driver.TestProxyTexImage); 338838d3f3d660225150715bc06f6b33e394ba803299Brian Paul error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, 338938d3f3d660225150715bc06f6b33e394ba803299Brian Paul internalFormat, GL_NONE, GL_NONE, 339038d3f3d660225150715bc06f6b33e394ba803299Brian Paul width, height, 1, border); 339138d3f3d660225150715bc06f6b33e394ba803299Brian Paul } 339238d3f3d660225150715bc06f6b33e394ba803299Brian Paul if (error) { 3393aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul /* if error, clear all proxy texture image parameters */ 3394a3f137094cd965d27e1b088499dd609b81a91906Brian Paul struct gl_texture_image *texImage; 3395a3f137094cd965d27e1b088499dd609b81a91906Brian Paul texImage = _mesa_get_proxy_tex_image(ctx, target, level); 3396a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (texImage) 3397a3f137094cd965d27e1b088499dd609b81a91906Brian Paul clear_teximage_fields(texImage); 3398aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 339989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else { 340089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* store the teximage parameters */ 340189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_unit *texUnit; 34025ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell struct gl_texture_object *texObj; 340389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage; 340489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 34055ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj = _mesa_select_tex_object(ctx, texUnit, target); 34065ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 34075ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 34085ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 34095ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 34105ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_init_teximage_fields(ctx, target, texImage, width, height, 1, 34115ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell border, internalFormat); 34125ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 34135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 341489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 3415aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 3416aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul else { 341789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage2D(target)"); 3418aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul return; 3419aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 34201207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul} 34211207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 34221207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 3423c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 34241207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul_mesa_CompressedTexImage3DARB(GLenum target, GLint level, 3425aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul GLenum internalFormat, GLsizei width, 34261207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLsizei height, GLsizei depth, GLint border, 34271207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLsizei imageSize, const GLvoid *data) 34281207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{ 3429aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul GET_CURRENT_CONTEXT(ctx); 3430cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3431aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 34329540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul if (target == GL_TEXTURE_3D) { 34338c3ddf4270ff075ee783a67e5d5d04fa16a9cb45Brian Paul /* non-proxy target */ 3434aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul struct gl_texture_unit *texUnit; 3435aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul struct gl_texture_object *texObj; 3436aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul struct gl_texture_image *texImage; 343789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum error = compressed_texture_error_check(ctx, 3, target, level, 343889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul internalFormat, width, height, depth, border, imageSize); 343989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (error) { 344089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, error, "glCompressedTexImage3D"); 344189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 3442aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 3443aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 3444aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 34458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 34465ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 34475ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 34485ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_get_tex_image(ctx, texObj, target, level); 34495ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage) { 34505ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCompressedTexImage3D"); 34515ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 34525ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 34535ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 34545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (texImage->Data) { 34555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->Driver.FreeTexImageData( ctx, texImage ); 34565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 34575ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(texImage->Data == NULL); 34586628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul 34595ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_init_teximage_fields(ctx, target, texImage, width, height, depth, 34605ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell border, internalFormat); 3461aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 34625ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ASSERT(ctx->Driver.CompressedTexImage3D); 34635ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.CompressedTexImage3D)(ctx, target, level, 34645ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell internalFormat, 34655ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell width, height, depth, 34665ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell border, imageSize, data, 34675ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj, texImage); 34685ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 34695ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* state update */ 34705ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj->Complete = GL_FALSE; 34715ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 34725ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 34735ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 34745ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 3475aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 3476aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul else if (target == GL_PROXY_TEXTURE_3D) { 3477aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul /* Proxy texture: check for errors and update proxy state */ 347889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum error = compressed_texture_error_check(ctx, 3, target, level, 347989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul internalFormat, width, height, depth, border, imageSize); 34808e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul if (!error) { 34818e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul ASSERT(ctx->Driver.TestProxyTexImage); 348238d3f3d660225150715bc06f6b33e394ba803299Brian Paul error = !(*ctx->Driver.TestProxyTexImage)(ctx, target, level, 348338d3f3d660225150715bc06f6b33e394ba803299Brian Paul internalFormat, GL_NONE, GL_NONE, 348438d3f3d660225150715bc06f6b33e394ba803299Brian Paul width, height, depth, border); 348538d3f3d660225150715bc06f6b33e394ba803299Brian Paul } 348638d3f3d660225150715bc06f6b33e394ba803299Brian Paul if (error) { 3487aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul /* if error, clear all proxy texture image parameters */ 3488a3f137094cd965d27e1b088499dd609b81a91906Brian Paul struct gl_texture_image *texImage; 3489a3f137094cd965d27e1b088499dd609b81a91906Brian Paul texImage = _mesa_get_proxy_tex_image(ctx, target, level); 3490a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (texImage) 3491a3f137094cd965d27e1b088499dd609b81a91906Brian Paul clear_teximage_fields(texImage); 3492aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 349389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else { 349489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* store the teximage parameters */ 349589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_unit *texUnit; 34965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell struct gl_texture_object *texObj; 349789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul struct gl_texture_image *texImage; 349889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 34995ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj = _mesa_select_tex_object(ctx, texUnit, target); 35005ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 35015ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 35025ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 35035ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_init_teximage_fields(ctx, target, texImage, width, height, 35045ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell depth, border, internalFormat); 35055ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 35065ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 350789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 3508aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 3509aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul else { 351089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage3D(target)"); 3511aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul return; 3512aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 35131207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul} 35141207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 35151207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 3516c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 35171207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul_mesa_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, 35181207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLsizei width, GLenum format, 35191207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLsizei imageSize, const GLvoid *data) 35201207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{ 35219540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul struct gl_texture_unit *texUnit; 35229540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul struct gl_texture_object *texObj; 35239540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul struct gl_texture_image *texImage; 352489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum error; 3525a1f1586bcb9fcd4a30930fd14b73323642ce85c5Brian Paul GET_CURRENT_CONTEXT(ctx); 352675280a2c742ee241d392618a3b29548fce1520a9Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 352775280a2c742ee241d392618a3b29548fce1520a9Brian Paul 352889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul error = compressed_subtexture_error_check(ctx, 1, target, level, 3529c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul xoffset, 0, 0, /* pos */ 3530c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul width, 1, 1, /* size */ 3531c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul format, imageSize); 353289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (error) { 353389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, error, "glCompressedTexSubImage1D"); 353489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 35359540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul } 35369540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 35379540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 35389540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 35395ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 35405ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 35415ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 35425ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell assert(texImage); 35439540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 35445ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if ((GLint) format != texImage->InternalFormat) { 35455ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_OPERATION, 35465ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell "glCompressedTexSubImage1D(format)"); 35475ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 35485ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 354989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 35505ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if ((width == 1 || width == 2) && (GLuint) width != texImage->Width) { 35515ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_VALUE, "glCompressedTexSubImage1D(width)"); 35525ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 35535ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 355489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 35555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (width == 0) 35565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; /* no-op, not an error */ 35579540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 35585ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (ctx->Driver.CompressedTexSubImage1D) { 35595ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.CompressedTexSubImage1D)(ctx, target, level, 35605ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell xoffset, width, 35615ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell format, imageSize, data, 35625ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj, texImage); 35635ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 35645ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 35659540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul } 35665ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 35675ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 35681207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul} 35691207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 35701207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 3571c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 35721207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul_mesa_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, 35731207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLint yoffset, GLsizei width, GLsizei height, 35741207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLenum format, GLsizei imageSize, 35751207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul const GLvoid *data) 35761207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{ 35779540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul struct gl_texture_unit *texUnit; 35789540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul struct gl_texture_object *texObj; 35799540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul struct gl_texture_image *texImage; 358089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum error; 3581a1f1586bcb9fcd4a30930fd14b73323642ce85c5Brian Paul GET_CURRENT_CONTEXT(ctx); 358275280a2c742ee241d392618a3b29548fce1520a9Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 358375280a2c742ee241d392618a3b29548fce1520a9Brian Paul 358489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul error = compressed_subtexture_error_check(ctx, 2, target, level, 3585c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul xoffset, yoffset, 0, /* pos */ 3586c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul width, height, 1, /* size */ 3587c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul format, imageSize); 358889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (error) { 3589b305028464f02947c0cce0476af0e35f4ed1fafaBrian Paul /* XXX proxy target? */ 359089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, error, "glCompressedTexSubImage2D"); 359189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 35929540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul } 35939540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 35949540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 35959540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 35965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 35975ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 35985ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 35995ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell assert(texImage); 36009540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 36015ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if ((GLint) format != texImage->InternalFormat) { 36025ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_OPERATION, 36035ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell "glCompressedTexSubImage2D(format)"); 36045ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 36055ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 360689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 36075ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (((width == 1 || width == 2) && (GLuint) width != texImage->Width) || 36085ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ((height == 1 || height == 2) && (GLuint) height != texImage->Height)) { 36095ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_VALUE, "glCompressedTexSubImage2D(size)"); 36105ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 36115ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 361289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 36135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (width == 0 || height == 0) 36145ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; /* no-op, not an error */ 36159540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 36165ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (ctx->Driver.CompressedTexSubImage2D) { 36175ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.CompressedTexSubImage2D)(ctx, target, level, 36185ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell xoffset, yoffset, width, height, 36195ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell format, imageSize, data, 36205ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj, texImage); 36215ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 36225ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 36239540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul } 36245ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 36255ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 36261207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul} 36271207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 36281207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 3629c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 36301207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul_mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, 36311207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLint yoffset, GLint zoffset, GLsizei width, 36321207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLsizei height, GLsizei depth, GLenum format, 36331207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLsizei imageSize, const GLvoid *data) 36341207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{ 36359540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul struct gl_texture_unit *texUnit; 36369540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul struct gl_texture_object *texObj; 36379540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul struct gl_texture_image *texImage; 363889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum error; 3639a1f1586bcb9fcd4a30930fd14b73323642ce85c5Brian Paul GET_CURRENT_CONTEXT(ctx); 364075280a2c742ee241d392618a3b29548fce1520a9Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 364175280a2c742ee241d392618a3b29548fce1520a9Brian Paul 364289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul error = compressed_subtexture_error_check(ctx, 3, target, level, 3643c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul xoffset, yoffset, zoffset,/*pos*/ 3644c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul width, height, depth, /*size*/ 3645c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul format, imageSize); 364689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (error) { 364789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, error, "glCompressedTexSubImage2D"); 364889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 36499540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul } 36509540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 36519540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 36529540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 36535ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 36545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 36555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 36565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell assert(texImage); 36579540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 36585ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if ((GLint) format != texImage->InternalFormat) { 36595ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_OPERATION, 36605ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell "glCompressedTexSubImage3D(format)"); 36615ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 36625ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 366389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 36645ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (((width == 1 || width == 2) && (GLuint) width != texImage->Width) || 36655ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ((height == 1 || height == 2) && (GLuint) height != texImage->Height) || 36665ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ((depth == 1 || depth == 2) && (GLuint) depth != texImage->Depth)) { 36675ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_VALUE, "glCompressedTexSubImage3D(size)"); 36685ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 36695ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 367089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 36715ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (width == 0 || height == 0 || depth == 0) 36725ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; /* no-op, not an error */ 36739540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 36745ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (ctx->Driver.CompressedTexSubImage3D) { 36755ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell (*ctx->Driver.CompressedTexSubImage3D)(ctx, target, level, 36765ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell xoffset, yoffset, zoffset, 36775ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell width, height, depth, 36785ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell format, imageSize, data, 36795ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texObj, texImage); 36805ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 36815ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->NewState |= _NEW_TEXTURE; 36829540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul } 36835ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 36845ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 36851207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul} 36861207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 36871207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 3688c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 36899540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul_mesa_GetCompressedTexImageARB(GLenum target, GLint level, GLvoid *img) 36901207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{ 36918e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const struct gl_texture_unit *texUnit; 36925ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell struct gl_texture_object *texObj; 36939540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul struct gl_texture_image *texImage; 3694cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul GLint maxLevels; 3695a1f1586bcb9fcd4a30930fd14b73323642ce85c5Brian Paul GET_CURRENT_CONTEXT(ctx); 3696cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 36979540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 36985ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 3699cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul texUnit = &ctx->Texture.Unit[ctx->Texture.CurrentUnit]; 3700cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul texObj = _mesa_select_tex_object(ctx, texUnit, target); 3701cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul if (!texObj) { 3702cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetCompressedTexImageARB"); 3703cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul return; 3704cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul } 3705cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul 3706ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul maxLevels = _mesa_max_texture_levels(ctx, target); 3707ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul ASSERT(maxLevels > 0); /* 0 indicates bad target, caught above */ 3708cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul 3709cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul if (level < 0 || level >= maxLevels) { 3710cd1cefae9146fc14b35ee93a04bdb1b1590fba7bBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glGetCompressedTexImageARB(level)"); 37119540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul return; 37129540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul } 37139540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 371477ee31930a1b0cc7766939415f4f04ed6a1fa4acBrian Paul if (_mesa_is_proxy_texture(target)) { 371508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glGetCompressedTexImageARB(target)"); 37168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul return; 37179540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul } 37189540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 37199540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 37205ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 37215ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 37225ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 37235ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage) { 37245ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* probably invalid mipmap level */ 37255ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_VALUE, "glGetCompressedTexImageARB(level)"); 37265ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 37275ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 37285ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 37295ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage->IsCompressed) { 37305ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_OPERATION, "glGetCompressedTexImageARB"); 37315ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell goto out; 37325ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 37339540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 37345ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* this typically calls _mesa_get_compressed_teximage() */ 37355ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell ctx->Driver.GetCompressedTexImage(ctx, target, level, img, texObj,texImage); 37365ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 37375ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell out: 37385ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 37391207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul} 3740