teximage.c revision d4a38e86d4b4d66cca20ee63222f940cb73fa709
1afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 2120d71a45cfda1edfa8cd6b1732e209eb98b53d8Brian Paul * Mesa 3-D graphics library 35e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen * 49f6022d0567dc1288888212d7128acc48795b306Brian * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 580684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul * Copyright (C) 2009 VMware, Inc. 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" 35d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora#include "enums.h" 3634bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul#include "fbobject.h" 3734bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul#include "framebuffer.h" 382897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul#include "hash.h" 39afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "image.h" 403c63452e64df7e10aa073c6c3b9492b1d7dabbb8Brian Paul#include "imports.h" 41ebb248aa5c018dc676d389221d76ed329059789eBrian Paul#include "macros.h" 42db61b9ce39bccc43140357652ceb78baaf2aea44Vinson Lee#include "mfeatures.h" 43fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul#include "state.h" 4489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul#include "texcompress.h" 45afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "teximage.h" 46afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg#include "texstate.h" 477179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg#include "texpal.h" 485e3bc0c2a2bcdf59949410f94c9b705fc1281ce8Jouk Jansen#include "mtypes.h" 49afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 50afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 514cf6718725c7cf3bfb728118a8b14f8cf206c701Brian Paul/** 5263f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul * State changes which we care about for glCopyTex[Sub]Image() calls. 5363f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul * In particular, we care about pixel transfer state and buffer state 5463f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul * (such as glReadBuffer to make sure we read from the right renderbuffer). 5563f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul */ 567ecb61c30c4984a8513b306b640f9d274d8ecf61Brian Paul#define NEW_COPY_TEX_STATE (_NEW_BUFFERS | _NEW_PIXEL) 5763f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul 5863f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul 5963f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul 6063f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul/** 611749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * Return the simple base format for a given internal texture format. 621749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * For example, given GL_LUMINANCE12_ALPHA4, return GL_LUMINANCE_ALPHA. 636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 651749a25ca889d514889b34cf6311c8014d97bf66Brian Paul * \param internalFormat the internal texture format token or 1, 2, 3, or 4. 666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the corresponding \u base internal format (GL_ALPHA, GL_LUMINANCE, 686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, or GL_RGBA), or -1 if invalid enum. 6989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * 7089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * This is the format which is used during texture application (i.e. the 7189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * texture format and env mode determine the arithmetic used. 7273b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * 7373b150c816c46a88e3e5d97f9b73ab0095f2bc60Brian Paul * XXX this could be static 74afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 75b132e8da5e5f2b7da1f2141e0322e66bb0608e02Brian PaulGLint 76f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat ) 77afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 781749a25ca889d514889b34cf6311c8014d97bf66Brian Paul switch (internalFormat) { 79afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA: 80afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA4: 81afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA8: 82afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA12: 83afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_ALPHA16: 84afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_ALPHA; 85afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 1: 86afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE: 87afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE4: 88afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE8: 89afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE12: 90afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE16: 91afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_LUMINANCE; 92afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 2: 93afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE_ALPHA: 94afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE4_ALPHA4: 95afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE6_ALPHA2: 96afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE8_ALPHA8: 97afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE12_ALPHA4: 98afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE12_ALPHA12: 99afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_LUMINANCE16_ALPHA16: 100afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_LUMINANCE_ALPHA; 101afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY: 102afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY4: 103afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY8: 104afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY12: 105afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_INTENSITY16: 106afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_INTENSITY; 107afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 3: 108afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB: 109afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_R3_G3_B2: 110afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB4: 111afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB5: 112afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB8: 113afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB10: 114afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB12: 115afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB16: 116afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_RGB; 117afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case 4: 118afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA: 119afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA2: 120afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA4: 121afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB5_A1: 122afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA8: 123afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGB10_A2: 124afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA12: 125afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg case GL_RGBA16: 126afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_RGBA; 127f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 128f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ; /* fallthrough */ 129f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 130f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 13129386d1f2d60e905d63f4c5f045ff3794b2ff99cIan Romanick /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0). 13229386d1f2d60e905d63f4c5f045ff3794b2ff99cIan Romanick */ 13329386d1f2d60e905d63f4c5f045ff3794b2ff99cIan Romanick if (ctx->API != API_OPENGL) { 134f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke switch (internalFormat) { 13529386d1f2d60e905d63f4c5f045ff3794b2ff99cIan Romanick case GL_BGRA: 136f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke return GL_RGBA; 137f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke default: 138f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke ; /* fallthrough */ 139f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke } 140f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke } 141f1452844fe2522387bbc6633f22aec09b8a06204Benjamin Franzke 1424741dbcbbc2514de370a760f4b78a17491014555Ian Romanick if (ctx->Extensions.ARB_depth_texture) { 143f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul switch (internalFormat) { 144f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_DEPTH_COMPONENT: 1454741dbcbbc2514de370a760f4b78a17491014555Ian Romanick case GL_DEPTH_COMPONENT16: 1464741dbcbbc2514de370a760f4b78a17491014555Ian Romanick case GL_DEPTH_COMPONENT24: 1474741dbcbbc2514de370a760f4b78a17491014555Ian Romanick case GL_DEPTH_COMPONENT32: 148f7e1dfeaefda8865252513bc4d880ea8640efe4dBrian Paul return GL_DEPTH_COMPONENT; 149f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 150f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ; /* fallthrough */ 151f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 152f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 15389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 15433fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick switch (internalFormat) { 15533fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick case GL_COMPRESSED_ALPHA: 15633fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick return GL_ALPHA; 15733fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick case GL_COMPRESSED_LUMINANCE: 15833fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick return GL_LUMINANCE; 15933fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick case GL_COMPRESSED_LUMINANCE_ALPHA: 16033fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick return GL_LUMINANCE_ALPHA; 16133fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick case GL_COMPRESSED_INTENSITY: 16233fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick return GL_INTENSITY; 16333fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick case GL_COMPRESSED_RGB: 16433fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick return GL_RGB; 16533fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick case GL_COMPRESSED_RGBA: 16633fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick return GL_RGBA; 16733fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick default: 16833fa5e4bfad8005f09ad3c9fc92c40fa863935d1Ian Romanick ; /* fallthrough */ 169f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 170f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 171f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (ctx->Extensions.TDFX_texture_compression_FXT1) { 172f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul switch (internalFormat) { 173f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_RGB_FXT1_3DFX: 17489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_RGB; 175f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_RGBA_FXT1_3DFX: 17689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_RGBA; 177f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 178f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ; /* fallthrough */ 179f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 180f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 181f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 182f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (ctx->Extensions.EXT_texture_compression_s3tc) { 183f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul switch (internalFormat) { 1848f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 1858f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul return GL_RGB; 186f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 187f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 188f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 18940bd9d0b190e11d39350d1b08d2c2b28e3040bcaDaniel Borca return GL_RGBA; 190f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 191f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ; /* fallthrough */ 192f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 193f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 194f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 195f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (ctx->Extensions.S3_s3tc) { 196f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul switch (internalFormat) { 197f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGB_S3TC: 198f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGB4_S3TC: 199663a9e1b7ef7b8384abe2f81e1a8749b942f6d3aDaniel Borca return GL_RGB; 200f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGBA_S3TC: 201f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGBA4_S3TC: 202663a9e1b7ef7b8384abe2f81e1a8749b942f6d3aDaniel Borca return GL_RGBA; 203f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 204f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul ; /* fallthrough */ 205f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 206f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 20789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 208f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (ctx->Extensions.MESA_ycbcr_texture) { 209f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (internalFormat == GL_YCBCR_MESA) 210f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_YCBCR_MESA; 211f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 2121749a25ca889d514889b34cf6311c8014d97bf66Brian Paul 213f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (ctx->Extensions.ARB_texture_float) { 214f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul switch (internalFormat) { 215f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_ALPHA16F_ARB: 216f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_ALPHA32F_ARB: 217f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_ALPHA; 218f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGBA16F_ARB: 219f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGBA32F_ARB: 220f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_RGBA; 221f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGB16F_ARB: 222f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_RGB32F_ARB: 223f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_RGB; 224f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_INTENSITY16F_ARB: 225f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_INTENSITY32F_ARB: 226f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_INTENSITY; 227f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_LUMINANCE16F_ARB: 228f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_LUMINANCE32F_ARB: 229f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_LUMINANCE; 230f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_LUMINANCE_ALPHA16F_ARB: 231f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul case GL_LUMINANCE_ALPHA32F_ARB: 232f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return GL_LUMINANCE_ALPHA; 233f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul default: 2348f04c12e0ad876baa7eb9ed379e2b00150b376e0Brian Paul ; /* fallthrough */ 235f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul } 236afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 237f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul 238114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger if (ctx->Extensions.ATI_envmap_bumpmap) { 239114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger switch (internalFormat) { 240114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_DUDV_ATI: 241114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger case GL_DU8DV8_ATI: 242114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger return GL_DUDV_ATI; 243114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger default: 244114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger ; /* fallthrough */ 245114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 246114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger } 247114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2480be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák if (ctx->Extensions.EXT_texture_snorm) { 249c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger switch (internalFormat) { 2500be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RED_SNORM: 2510be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_R8_SNORM: 2520be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_R16_SNORM: 2530be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák return GL_RED; 2540be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RG_SNORM: 2550be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RG8_SNORM: 2560be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RG16_SNORM: 2570be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák return GL_RG; 2580be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RGB_SNORM: 2590be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RGB8_SNORM: 2600be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RGB16_SNORM: 2610be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák return GL_RGB; 262c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger case GL_RGBA_SNORM: 263c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger case GL_RGBA8_SNORM: 2640be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_RGBA16_SNORM: 265c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger return GL_RGBA; 2660be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_ALPHA_SNORM: 2670be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_ALPHA8_SNORM: 2680be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_ALPHA16_SNORM: 2690be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák return GL_ALPHA; 2700be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_LUMINANCE_SNORM: 2710be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_LUMINANCE8_SNORM: 2720be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_LUMINANCE16_SNORM: 2730be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák return GL_LUMINANCE; 2740be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_LUMINANCE_ALPHA_SNORM: 2750be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_LUMINANCE8_ALPHA8_SNORM: 2760be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_LUMINANCE16_ALPHA16_SNORM: 2770be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák return GL_LUMINANCE_ALPHA; 2780be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_INTENSITY_SNORM: 2790be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_INTENSITY8_SNORM: 2800be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák case GL_INTENSITY16_SNORM: 2810be369975fdfa79bcb702d0c13aa0a221055f61bMarek Olšák return GL_INTENSITY; 282c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger default: 283c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger ; /* fallthrough */ 284c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 285c6a6cc191813e8343a17b028146a34f193a6ce44Roland Scheidegger } 286114152e068ec919feb0a57a1259c2ada970b9f02Roland Scheidegger 2871ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul if (ctx->Extensions.EXT_packed_depth_stencil) { 2881ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul switch (internalFormat) { 2891ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul case GL_DEPTH_STENCIL_EXT: 2901ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul case GL_DEPTH24_STENCIL8_EXT: 2911ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul return GL_DEPTH_STENCIL_EXT; 2921ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul default: 2931ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul ; /* fallthrough */ 2941ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul } 2951ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul } 2961ad7b99925e044f82e635f746c1ef2df77f69ac9Brian Paul 2970a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul#if FEATURE_EXT_texture_sRGB 2980a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul if (ctx->Extensions.EXT_texture_sRGB) { 2990a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul switch (internalFormat) { 3000a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SRGB_EXT: 3010a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SRGB8_EXT: 3020a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_EXT: 3030a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 3040a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul return GL_RGB; 3050a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SRGB_ALPHA_EXT: 3060a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SRGB8_ALPHA8_EXT: 3070a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_ALPHA_EXT: 3080a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 3090a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 3100a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 3110a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul return GL_RGBA; 3120a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SLUMINANCE_ALPHA_EXT: 3130a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SLUMINANCE8_ALPHA8_EXT: 3140a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 3150a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul return GL_LUMINANCE_ALPHA; 3160a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SLUMINANCE_EXT: 3170a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul case GL_SLUMINANCE8_EXT: 3183488b14a047bf1f05831b3bbdc374a0da482212cEric Anholt case GL_COMPRESSED_SLUMINANCE_EXT: 3190a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul return GL_LUMINANCE; 3200a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul default: 321abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ; /* fallthrough */ 3220a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul } 3230a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul } 3240a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul#endif /* FEATURE_EXT_texture_sRGB */ 3250a4be7036864efa6b30d78e0aac449d34b812c13Brian Paul 326abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul if (ctx->Extensions.EXT_texture_integer) { 327abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul switch (internalFormat) { 328abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGBA8UI_EXT: 329abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGBA16UI_EXT: 330abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGBA32UI_EXT: 331abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGBA8I_EXT: 332abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGBA16I_EXT: 333abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGBA32I_EXT: 334f449be660e70aac2aefd2ce84581e137de25520bDave Airlie case GL_RGB10_A2UI: 335abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_RGBA; 336abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGB8UI_EXT: 337abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGB16UI_EXT: 338abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGB32UI_EXT: 339abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGB8I_EXT: 340abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGB16I_EXT: 341abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_RGB32I_EXT: 342abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_RGB; 343abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_ALPHA8UI_EXT: 344abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_ALPHA16UI_EXT: 345abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_ALPHA32UI_EXT: 346abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_ALPHA8I_EXT: 347abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_ALPHA16I_EXT: 348abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_ALPHA32I_EXT: 349abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_ALPHA; 350abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_INTENSITY8UI_EXT: 351abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_INTENSITY16UI_EXT: 352abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_INTENSITY32UI_EXT: 353abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_INTENSITY8I_EXT: 354abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_INTENSITY16I_EXT: 355abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_INTENSITY32I_EXT: 356abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_INTENSITY; 357abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE8UI_EXT: 358abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE16UI_EXT: 359abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE32UI_EXT: 360abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE8I_EXT: 361abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE16I_EXT: 362abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE32I_EXT: 363abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_LUMINANCE; 364abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE_ALPHA8UI_EXT: 365abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE_ALPHA16UI_EXT: 366abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE_ALPHA32UI_EXT: 367abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE_ALPHA8I_EXT: 368abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE_ALPHA16I_EXT: 369abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul case GL_LUMINANCE_ALPHA32I_EXT: 370abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul return GL_LUMINANCE_ALPHA; 371abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul default: 372abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul ; /* fallthrough */ 373abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 3746988f65e43297ae63bbce30bf882f870b370096cBrian Paul } 3756988f65e43297ae63bbce30bf882f870b370096cBrian Paul 3766988f65e43297ae63bbce30bf882f870b370096cBrian Paul if (ctx->Extensions.ARB_texture_rg) { 3776988f65e43297ae63bbce30bf882f870b370096cBrian Paul switch (internalFormat) { 3786988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_R16F: 3793ebbc176f9200ac954d461758937e755220ac551Ian Romanick /* R16F depends on both ARB_half_float_pixel and ARB_texture_float. 3803ebbc176f9200ac954d461758937e755220ac551Ian Romanick */ 3813ebbc176f9200ac954d461758937e755220ac551Ian Romanick if (!ctx->Extensions.ARB_half_float_pixel) 3823ebbc176f9200ac954d461758937e755220ac551Ian Romanick break; 3833ebbc176f9200ac954d461758937e755220ac551Ian Romanick /* FALLTHROUGH */ 3846988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_R32F: 3853ebbc176f9200ac954d461758937e755220ac551Ian Romanick if (!ctx->Extensions.ARB_texture_float) 3863ebbc176f9200ac954d461758937e755220ac551Ian Romanick break; 3873ebbc176f9200ac954d461758937e755220ac551Ian Romanick return GL_RED; 3886988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_R8I: 3896988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_R8UI: 3906988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_R16I: 3916988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_R16UI: 3926988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_R32I: 3936988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_R32UI: 3943ebbc176f9200ac954d461758937e755220ac551Ian Romanick if (!ctx->Extensions.EXT_texture_integer) 3953ebbc176f9200ac954d461758937e755220ac551Ian Romanick break; 3963ebbc176f9200ac954d461758937e755220ac551Ian Romanick /* FALLTHROUGH */ 3973ebbc176f9200ac954d461758937e755220ac551Ian Romanick case GL_R8: 3983ebbc176f9200ac954d461758937e755220ac551Ian Romanick case GL_R16: 3993ebbc176f9200ac954d461758937e755220ac551Ian Romanick case GL_RED: 4003ebbc176f9200ac954d461758937e755220ac551Ian Romanick case GL_COMPRESSED_RED: 4013ebbc176f9200ac954d461758937e755220ac551Ian Romanick return GL_RED; 4023ebbc176f9200ac954d461758937e755220ac551Ian Romanick 4036988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_RG16F: 4043ebbc176f9200ac954d461758937e755220ac551Ian Romanick /* RG16F depends on both ARB_half_float_pixel and ARB_texture_float. 4053ebbc176f9200ac954d461758937e755220ac551Ian Romanick */ 4063ebbc176f9200ac954d461758937e755220ac551Ian Romanick if (!ctx->Extensions.ARB_half_float_pixel) 4073ebbc176f9200ac954d461758937e755220ac551Ian Romanick break; 4083ebbc176f9200ac954d461758937e755220ac551Ian Romanick /* FALLTHROUGH */ 4096988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_RG32F: 4103ebbc176f9200ac954d461758937e755220ac551Ian Romanick if (!ctx->Extensions.ARB_texture_float) 4113ebbc176f9200ac954d461758937e755220ac551Ian Romanick break; 4123ebbc176f9200ac954d461758937e755220ac551Ian Romanick return GL_RG; 4136988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_RG8I: 4146988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_RG8UI: 4156988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_RG16I: 4166988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_RG16UI: 4176988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_RG32I: 4186988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_RG32UI: 4193ebbc176f9200ac954d461758937e755220ac551Ian Romanick if (!ctx->Extensions.EXT_texture_integer) 4203ebbc176f9200ac954d461758937e755220ac551Ian Romanick break; 4213ebbc176f9200ac954d461758937e755220ac551Ian Romanick /* FALLTHROUGH */ 4223ebbc176f9200ac954d461758937e755220ac551Ian Romanick case GL_RG: 4233ebbc176f9200ac954d461758937e755220ac551Ian Romanick case GL_RG8: 4243ebbc176f9200ac954d461758937e755220ac551Ian Romanick case GL_RG16: 4253ebbc176f9200ac954d461758937e755220ac551Ian Romanick case GL_COMPRESSED_RG: 4266988f65e43297ae63bbce30bf882f870b370096cBrian Paul return GL_RG; 4276988f65e43297ae63bbce30bf882f870b370096cBrian Paul default: 4286988f65e43297ae63bbce30bf882f870b370096cBrian Paul ; /* fallthrough */ 4296988f65e43297ae63bbce30bf882f870b370096cBrian Paul } 4306988f65e43297ae63bbce30bf882f870b370096cBrian Paul } 4316988f65e43297ae63bbce30bf882f870b370096cBrian Paul 4326988f65e43297ae63bbce30bf882f870b370096cBrian Paul if (ctx->Extensions.EXT_texture_shared_exponent) { 4336988f65e43297ae63bbce30bf882f870b370096cBrian Paul switch (internalFormat) { 4346988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_RGB9_E5_EXT: 4356988f65e43297ae63bbce30bf882f870b370096cBrian Paul return GL_RGB; 4366988f65e43297ae63bbce30bf882f870b370096cBrian Paul default: 4376988f65e43297ae63bbce30bf882f870b370096cBrian Paul ; /* fallthrough */ 4386988f65e43297ae63bbce30bf882f870b370096cBrian Paul } 4396988f65e43297ae63bbce30bf882f870b370096cBrian Paul } 4406988f65e43297ae63bbce30bf882f870b370096cBrian Paul 4416988f65e43297ae63bbce30bf882f870b370096cBrian Paul if (ctx->Extensions.EXT_packed_float) { 4426988f65e43297ae63bbce30bf882f870b370096cBrian Paul switch (internalFormat) { 4436988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_R11F_G11F_B10F_EXT: 4446988f65e43297ae63bbce30bf882f870b370096cBrian Paul return GL_RGB; 4456988f65e43297ae63bbce30bf882f870b370096cBrian Paul default: 4466988f65e43297ae63bbce30bf882f870b370096cBrian Paul ; /* fallthrough */ 4476988f65e43297ae63bbce30bf882f870b370096cBrian Paul } 4486988f65e43297ae63bbce30bf882f870b370096cBrian Paul } 4496988f65e43297ae63bbce30bf882f870b370096cBrian Paul 4506988f65e43297ae63bbce30bf882f870b370096cBrian Paul if (ctx->Extensions.ARB_depth_buffer_float) { 4516988f65e43297ae63bbce30bf882f870b370096cBrian Paul switch (internalFormat) { 4526988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_DEPTH_COMPONENT32F: 4536988f65e43297ae63bbce30bf882f870b370096cBrian Paul return GL_DEPTH_COMPONENT; 4546988f65e43297ae63bbce30bf882f870b370096cBrian Paul case GL_DEPTH32F_STENCIL8: 4556988f65e43297ae63bbce30bf882f870b370096cBrian Paul return GL_DEPTH_STENCIL; 4566988f65e43297ae63bbce30bf882f870b370096cBrian Paul default: 4576988f65e43297ae63bbce30bf882f870b370096cBrian Paul ; /* fallthrough */ 4586988f65e43297ae63bbce30bf882f870b370096cBrian Paul } 4596988f65e43297ae63bbce30bf882f870b370096cBrian Paul } 4606988f65e43297ae63bbce30bf882f870b370096cBrian Paul 461e2a054b70cb5dace40fc1426cbf936366dc72fb9Ian Romanick if (ctx->Extensions.ARB_texture_compression_rgtc) { 4626988f65e43297ae63bbce30bf882f870b370096cBrian Paul switch (internalFormat) { 463e2a054b70cb5dace40fc1426cbf936366dc72fb9Ian Romanick case GL_COMPRESSED_RED_RGTC1: 464e2a054b70cb5dace40fc1426cbf936366dc72fb9Ian Romanick case GL_COMPRESSED_SIGNED_RED_RGTC1: 4656988f65e43297ae63bbce30bf882f870b370096cBrian Paul return GL_RED; 466e2a054b70cb5dace40fc1426cbf936366dc72fb9Ian Romanick case GL_COMPRESSED_RG_RGTC2: 467e2a054b70cb5dace40fc1426cbf936366dc72fb9Ian Romanick case GL_COMPRESSED_SIGNED_RG_RGTC2: 4686988f65e43297ae63bbce30bf882f870b370096cBrian Paul return GL_RG; 4696988f65e43297ae63bbce30bf882f870b370096cBrian Paul default: 4706988f65e43297ae63bbce30bf882f870b370096cBrian Paul ; /* fallthrough */ 4716988f65e43297ae63bbce30bf882f870b370096cBrian Paul } 472abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul } 473abd5627a6a034885b0b01b995c73870da1361bb0Brian Paul 4747d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák if (ctx->Extensions.EXT_texture_compression_latc) { 4757d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák switch (internalFormat) { 4767d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 4777d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 4787d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák return GL_LUMINANCE; 4797d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 4807d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 4817d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák return GL_LUMINANCE_ALPHA; 4827d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák default: 4837d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák ; /* fallthrough */ 4847d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák } 4857d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák } 4867d16e2c0cd70dc5a23b746dbc8e44c58366b5353Marek Olšák 48769f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák if (ctx->Extensions.ATI_texture_compression_3dc) { 48869f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák switch (internalFormat) { 48969f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 49069f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák return GL_LUMINANCE_ALPHA; 49169f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák default: 49269f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák ; /* fallthrough */ 49369f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák } 49469f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák } 49569f16accd0aa3b8d414092a5e52ccc99649da01aMarek Olšák 496d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu if (ctx->Extensions.OES_compressed_ETC1_RGB8_texture) { 497d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu switch (internalFormat) { 498d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu case GL_ETC1_RGB8_OES: 499d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu return GL_RGB; 500d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu default: 501d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu ; /* fallthrough */ 502d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu } 503d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu } 504d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu 505fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick if (ctx->API == API_OPENGLES) { 506fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick switch (internalFormat) { 507fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick case GL_PALETTE4_RGB8_OES: 508fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick case GL_PALETTE4_R5_G6_B5_OES: 509fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick case GL_PALETTE8_RGB8_OES: 510fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick case GL_PALETTE8_R5_G6_B5_OES: 511fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick return GL_RGB; 512fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick case GL_PALETTE4_RGBA8_OES: 513fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick case GL_PALETTE8_RGB5_A1_OES: 514fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick case GL_PALETTE4_RGBA4_OES: 515fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick case GL_PALETTE4_RGB5_A1_OES: 516fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick case GL_PALETTE8_RGBA8_OES: 517fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick case GL_PALETTE8_RGBA4_OES: 518fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick return GL_RGBA; 519fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick default: 520fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick ; /* fallthrough */ 521fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick } 522fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick } 523fc0fa16be3792bdabad0993fc4026bf621d6092fIan Romanick 524f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul return -1; /* error */ 525afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 526afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 527afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 5286dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 529e93243f8b7d43695654a36334c8cc5cea140d23cBrian * For cube map faces, return a face index in [0,5]. 530e93243f8b7d43695654a36334c8cc5cea140d23cBrian * For other targets return 0; 531e93243f8b7d43695654a36334c8cc5cea140d23cBrian */ 532e93243f8b7d43695654a36334c8cc5cea140d23cBrianGLuint 533e93243f8b7d43695654a36334c8cc5cea140d23cBrian_mesa_tex_target_to_face(GLenum target) 534519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul{ 5352efa3d4f9fd1e1683c5366d402d8740ecfb688e5Brian Paul if (_mesa_is_cube_face(target)) 536519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul return (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X; 537519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul else 538519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul return 0; 539519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul} 540519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 541519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 542519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 5436dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 5448e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * Store a gl_texture_image pointer in a gl_texture_object structure 5458e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * according to the target and level parameters. 5466dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param tObj texture object. 5486dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target. 5496dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level. 5506dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texImage texture image. 551afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 5523893e638e6521b9c070e01c0b31d22754ff97a88Brian Paulvoid 5533893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul_mesa_set_tex_image(struct gl_texture_object *tObj, 5543893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul GLenum target, GLint level, 5553893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul struct gl_texture_image *texImage) 556fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul{ 5579c9a9abd7b953ec9b6cfc52c2f6981c5d38b1691Brian Paul const GLuint face = _mesa_tex_target_to_face(target); 5589c9a9abd7b953ec9b6cfc52c2f6981c5d38b1691Brian Paul 559fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul ASSERT(tObj); 560fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul ASSERT(texImage); 5610c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu if (target == GL_TEXTURE_RECTANGLE_NV || target == GL_TEXTURE_EXTERNAL_OES) 5620c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu assert(level == 0); 5639c9a9abd7b953ec9b6cfc52c2f6981c5d38b1691Brian Paul 5649c9a9abd7b953ec9b6cfc52c2f6981c5d38b1691Brian Paul tObj->Image[face][level] = texImage; 5659c9a9abd7b953ec9b6cfc52c2f6981c5d38b1691Brian Paul 566a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul /* Set the 'back' pointer */ 567a156b49800c1419785d0709b78ef0d35e6dab5dfBrian Paul texImage->TexObject = tObj; 568a231d245514b43cf547ccb996b68efc0186e6821Brian Paul texImage->Level = level; 569a231d245514b43cf547ccb996b68efc0186e6821Brian Paul texImage->Face = face; 570fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul} 571fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul 572fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul 573a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/** 5746dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Allocate a texture image structure. 5756dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 576a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * Called via ctx->Driver.NewTextureImage() unless overriden by a device 577a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * driver. 5786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5796dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return a pointer to gl_texture_image struct with all fields initialized to 5806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * zero. 58177ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul */ 58277ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paulstruct gl_texture_image * 583f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_new_texture_image( struct gl_context *ctx ) 58477ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul{ 585a3f137094cd965d27e1b088499dd609b81a91906Brian Paul (void) ctx; 58677ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul return CALLOC_STRUCT(gl_texture_image); 58777ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul} 58877ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul 58977ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul 590a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/** 591146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paul * Free a gl_texture_image and associated data. 592146f536b3332b7a2022bb4ba5e2d1d2ec4bedd98Brian Paul * This function is a fallback called via ctx->Driver.DeleteTextureImage(). 5936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5941eee1bac1f6d911e6124daafc9b9291666d91cefVinson Lee * \param texImage texture image. 5956dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 5963e62d3a8d88b48d4ed19e00ea2bbc3d0a2b6acf7Keith Whitwell * Free the texture image structure and the associated image data. 597a3f137094cd965d27e1b088499dd609b81a91906Brian Paul */ 59877ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paulvoid 5993c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul_mesa_delete_texture_image(struct gl_context *ctx, 6003c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul struct gl_texture_image *texImage) 60177ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul{ 6025ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell /* Free texImage->Data and/or any other driver-specific texture 6035ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell * image storage. 6045ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell */ 6050bb29949ba8a9e5a15dc0640dbb0a4e7990a1d57Eric Anholt ASSERT(ctx->Driver.FreeTextureImageBuffer); 6060bb29949ba8a9e5a15dc0640dbb0a4e7990a1d57Eric Anholt ctx->Driver.FreeTextureImageBuffer( ctx, texImage ); 60777ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul} 60877ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul 60977ce6da028589efc2f3f16cece287f56fd98ce8eBrian Paul 6106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 6116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Test if a target is a proxy target. 6126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 6136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target. 6146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 6156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if the target is a proxy target, GL_FALSE otherwise. 616aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul */ 61777ee31930a1b0cc7766939415f4f04ed6a1fa4acBrian PaulGLboolean 61877ee31930a1b0cc7766939415f4f04ed6a1fa4acBrian Paul_mesa_is_proxy_texture(GLenum target) 619aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul{ 6200c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu /* 6210c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu * NUM_TEXTURE_TARGETS should match number of terms below, except there's no 6220c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu * proxy for GL_TEXTURE_BUFFER and GL_TEXTURE_EXTERNAL_OES. 623874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul */ 6240c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu assert(NUM_TEXTURE_TARGETS == 7 + 2); 6252465c4fa9cabe8c40e526b9e081de3b70c851455Brian Paul 6268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul return (target == GL_PROXY_TEXTURE_1D || 6278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul target == GL_PROXY_TEXTURE_2D || 6288e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul target == GL_PROXY_TEXTURE_3D || 62927f4484fb73ac7bf4f790ca2d3efd50b6bea25c3Brian Paul target == GL_PROXY_TEXTURE_CUBE_MAP_ARB || 630bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick target == GL_PROXY_TEXTURE_RECTANGLE_NV || 631bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick target == GL_PROXY_TEXTURE_1D_ARRAY_EXT || 632bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick target == GL_PROXY_TEXTURE_2D_ARRAY_EXT); 633aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul} 634aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 635aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 6366dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 63735f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul * Return the proxy target which corresponds to the given texture target 63835f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul */ 63935f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paulstatic GLenum 64035f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paulget_proxy_target(GLenum target) 64135f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul{ 64235f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul switch (target) { 64335f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_TEXTURE_1D: 64435f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_PROXY_TEXTURE_1D: 64535f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul return GL_PROXY_TEXTURE_1D; 64635f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_TEXTURE_2D: 64735f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_PROXY_TEXTURE_2D: 64835f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul return GL_PROXY_TEXTURE_2D; 64935f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_TEXTURE_3D: 65035f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_PROXY_TEXTURE_3D: 65135f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul return GL_PROXY_TEXTURE_3D; 65235f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 65335f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 65435f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 65535f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 65635f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 65735f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 65835f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 65935f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_PROXY_TEXTURE_CUBE_MAP_ARB: 66035f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul return GL_PROXY_TEXTURE_CUBE_MAP_ARB; 66135f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_TEXTURE_RECTANGLE_NV: 66235f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_PROXY_TEXTURE_RECTANGLE_NV: 66335f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul return GL_PROXY_TEXTURE_RECTANGLE_NV; 66435f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_TEXTURE_1D_ARRAY_EXT: 66535f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 66635f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul return GL_PROXY_TEXTURE_1D_ARRAY_EXT; 66735f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_TEXTURE_2D_ARRAY_EXT: 66835f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 66935f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul return GL_PROXY_TEXTURE_2D_ARRAY_EXT; 67035f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul default: 67135f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul _mesa_problem(NULL, "unexpected target in get_proxy_target()"); 67235f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul return 0; 67335f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul } 67435f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul} 67535f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul 67635f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul 67735f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul/** 6783c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * Get the texture object that corresponds to the target of the given 679120d71a45cfda1edfa8cd6b1732e209eb98b53d8Brian Paul * texture unit. The target should have already been checked for validity. 6806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 6816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 6826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param texUnit texture unit. 6836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target. 6846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 6856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return pointer to the texture object on success, or NULL on failure. 68635d5301a54153930ee6fd60dff1010ce9f901397Brian Paul */ 68735d5301a54153930ee6fd60dff1010ce9f901397Brian Paulstruct gl_texture_object * 6883c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul_mesa_select_tex_object(struct gl_context *ctx, 6893c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul const struct gl_texture_unit *texUnit, 69035d5301a54153930ee6fd60dff1010ce9f901397Brian Paul GLenum target) 69135d5301a54153930ee6fd60dff1010ce9f901397Brian Paul{ 692f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul const GLboolean arrayTex = (ctx->Extensions.MESA_texture_array || 693f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul ctx->Extensions.EXT_texture_array); 694f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul 69535d5301a54153930ee6fd60dff1010ce9f901397Brian Paul switch (target) { 69635d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_1D: 6979818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return texUnit->CurrentTex[TEXTURE_1D_INDEX]; 69835d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_PROXY_TEXTURE_1D: 699fe469007037d9d5cdbe1677d8ff7368b276e9e7cBrian return ctx->Texture.ProxyTex[TEXTURE_1D_INDEX]; 70035d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_2D: 7019818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return texUnit->CurrentTex[TEXTURE_2D_INDEX]; 70235d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_PROXY_TEXTURE_2D: 703fe469007037d9d5cdbe1677d8ff7368b276e9e7cBrian return ctx->Texture.ProxyTex[TEXTURE_2D_INDEX]; 70435d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_3D: 7059818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul return texUnit->CurrentTex[TEXTURE_3D_INDEX]; 70635d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_PROXY_TEXTURE_3D: 707fe469007037d9d5cdbe1677d8ff7368b276e9e7cBrian return ctx->Texture.ProxyTex[TEXTURE_3D_INDEX]; 70835d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 70935d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 71035d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 71135d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 71235d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 71335d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 7145ff4075a6961b26042dc2d7f4adcf333439823f4Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 715a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell return ctx->Extensions.ARB_texture_cube_map 7169818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul ? texUnit->CurrentTex[TEXTURE_CUBE_INDEX] : NULL; 71735d5301a54153930ee6fd60dff1010ce9f901397Brian Paul case GL_PROXY_TEXTURE_CUBE_MAP_ARB: 718a96308c37db0bc0086a017d318bc3504aa5f0b1aKeith Whitwell return ctx->Extensions.ARB_texture_cube_map 719fe469007037d9d5cdbe1677d8ff7368b276e9e7cBrian ? ctx->Texture.ProxyTex[TEXTURE_CUBE_INDEX] : NULL; 7208afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul case GL_TEXTURE_RECTANGLE_NV: 7218afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul return ctx->Extensions.NV_texture_rectangle 7229818734e0148510967ca9ee0d1aa8b196b509f02Brian Paul ? texUnit->CurrentTex[TEXTURE_RECT_INDEX] : NULL; 7238afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul case GL_PROXY_TEXTURE_RECTANGLE_NV: 7248afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul return ctx->Extensions.NV_texture_rectangle 725fe469007037d9d5cdbe1677d8ff7368b276e9e7cBrian ? ctx->Texture.ProxyTex[TEXTURE_RECT_INDEX] : NULL; 726bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick case GL_TEXTURE_1D_ARRAY_EXT: 727f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul return arrayTex ? texUnit->CurrentTex[TEXTURE_1D_ARRAY_INDEX] : NULL; 728bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 729f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul return arrayTex ? ctx->Texture.ProxyTex[TEXTURE_1D_ARRAY_INDEX] : NULL; 730bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick case GL_TEXTURE_2D_ARRAY_EXT: 731f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul return arrayTex ? texUnit->CurrentTex[TEXTURE_2D_ARRAY_INDEX] : NULL; 732bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 733f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul return arrayTex ? ctx->Texture.ProxyTex[TEXTURE_2D_ARRAY_INDEX] : NULL; 734874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_TEXTURE_BUFFER: 735874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul return ctx->Extensions.ARB_texture_buffer_object 736874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul ? texUnit->CurrentTex[TEXTURE_BUFFER_INDEX] : NULL; 7370c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu case GL_TEXTURE_EXTERNAL_OES: 7380c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu return ctx->Extensions.OES_EGL_image_external 7390c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu ? texUnit->CurrentTex[TEXTURE_EXTERNAL_INDEX] : NULL; 74035d5301a54153930ee6fd60dff1010ce9f901397Brian Paul default: 74108836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_problem(NULL, "bad target in _mesa_select_tex_object()"); 74235d5301a54153930ee6fd60dff1010ce9f901397Brian Paul return NULL; 74335d5301a54153930ee6fd60dff1010ce9f901397Brian Paul } 74435d5301a54153930ee6fd60dff1010ce9f901397Brian Paul} 74535d5301a54153930ee6fd60dff1010ce9f901397Brian Paul 74635d5301a54153930ee6fd60dff1010ce9f901397Brian Paul 7476dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 748b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul * Return pointer to texture object for given target on current texture unit. 749b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul */ 750b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paulstruct gl_texture_object * 751f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_get_current_tex_object(struct gl_context *ctx, GLenum target) 752b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul{ 753b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul struct gl_texture_unit *texUnit = _mesa_get_current_tex_unit(ctx); 754b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul return _mesa_select_tex_object(ctx, texUnit, target); 755b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul} 756b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul 757b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul 758b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul/** 759c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul * Get a texture image pointer from a texture object, given a texture 760c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul * target and mipmap level. The target and level parameters should 761c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul * have already been error-checked. 7626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 7636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 7641eee1bac1f6d911e6124daafc9b9291666d91cefVinson Lee * \param texObj texture unit. 7656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target. 7666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level. 7676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 768c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul * \return pointer to the texture image structure, or NULL on failure. 769fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul */ 770fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paulstruct gl_texture_image * 7713c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul_mesa_select_tex_image(struct gl_context *ctx, 7723c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul const struct gl_texture_object *texObj, 7735ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLenum target, GLint level) 774fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul{ 775c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul const GLuint face = _mesa_tex_target_to_face(target); 7765ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 777c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul ASSERT(texObj); 778c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul ASSERT(level >= 0); 779c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul ASSERT(level < MAX_TEXTURE_LEVELS); 780bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick 781c156eeb682d673e571c1798ff21e183ad4114feaBrian Paul return texObj->Image[face][level]; 782fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul} 783fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul 784fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul 785a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/** 786a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * Like _mesa_select_tex_image() but if the image doesn't exist, allocate 787a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * it and install it. Only return NULL if passed a bad parameter or run 788a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * out of memory. 789a3f137094cd965d27e1b088499dd609b81a91906Brian Paul */ 790a3f137094cd965d27e1b088499dd609b81a91906Brian Paulstruct gl_texture_image * 791f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_get_tex_image(struct gl_context *ctx, struct gl_texture_object *texObj, 792a3f137094cd965d27e1b088499dd609b81a91906Brian Paul GLenum target, GLint level) 793a3f137094cd965d27e1b088499dd609b81a91906Brian Paul{ 794a3f137094cd965d27e1b088499dd609b81a91906Brian Paul struct gl_texture_image *texImage; 7955ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 7965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texObj) 7975ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return NULL; 7985ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 7995ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 800a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 801a3f137094cd965d27e1b088499dd609b81a91906Brian Paul texImage = ctx->Driver.NewTextureImage(ctx); 802a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (!texImage) { 803a3f137094cd965d27e1b088499dd609b81a91906Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "texture image allocation"); 804a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 805a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 8065ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 807a3f137094cd965d27e1b088499dd609b81a91906Brian Paul _mesa_set_tex_image(texObj, target, level, texImage); 808a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 8095ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 810a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return texImage; 811a3f137094cd965d27e1b088499dd609b81a91906Brian Paul} 812a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 813a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 814a3f137094cd965d27e1b088499dd609b81a91906Brian Paul/** 815a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * Return pointer to the specified proxy texture image. 816a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * Note that proxy textures are per-context, not per-texture unit. 817a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * \return pointer to texture image or NULL if invalid target, invalid 818a3f137094cd965d27e1b088499dd609b81a91906Brian Paul * level, or out of memory. 819a3f137094cd965d27e1b088499dd609b81a91906Brian Paul */ 820a3f137094cd965d27e1b088499dd609b81a91906Brian Paulstruct gl_texture_image * 821f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_get_proxy_tex_image(struct gl_context *ctx, GLenum target, GLint level) 822a3f137094cd965d27e1b088499dd609b81a91906Brian Paul{ 823a3f137094cd965d27e1b088499dd609b81a91906Brian Paul struct gl_texture_image *texImage; 82480684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul GLuint texIndex; 825a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 826a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (level < 0 ) 827a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 828a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 829a3f137094cd965d27e1b088499dd609b81a91906Brian Paul switch (target) { 830a3f137094cd965d27e1b088499dd609b81a91906Brian Paul case GL_PROXY_TEXTURE_1D: 831a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (level >= ctx->Const.MaxTextureLevels) 832a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 83380684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul texIndex = TEXTURE_1D_INDEX; 83480684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul break; 835a3f137094cd965d27e1b088499dd609b81a91906Brian Paul case GL_PROXY_TEXTURE_2D: 836a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (level >= ctx->Const.MaxTextureLevels) 837a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 83880684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul texIndex = TEXTURE_2D_INDEX; 83980684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul break; 840a3f137094cd965d27e1b088499dd609b81a91906Brian Paul case GL_PROXY_TEXTURE_3D: 841a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (level >= ctx->Const.Max3DTextureLevels) 842a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 84380684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul texIndex = TEXTURE_3D_INDEX; 84480684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul break; 845a3f137094cd965d27e1b088499dd609b81a91906Brian Paul case GL_PROXY_TEXTURE_CUBE_MAP: 846a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (level >= ctx->Const.MaxCubeTextureLevels) 847a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 84880684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul texIndex = TEXTURE_CUBE_INDEX; 84980684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul break; 850a3f137094cd965d27e1b088499dd609b81a91906Brian Paul case GL_PROXY_TEXTURE_RECTANGLE_NV: 851a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (level > 0) 852a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 85380684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul texIndex = TEXTURE_RECT_INDEX; 85480684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul break; 855bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 856bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick if (level >= ctx->Const.MaxTextureLevels) 857bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick return NULL; 85880684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul texIndex = TEXTURE_1D_ARRAY_INDEX; 85980684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul break; 860bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 861bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick if (level >= ctx->Const.MaxTextureLevels) 862bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick return NULL; 86380684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul texIndex = TEXTURE_2D_ARRAY_INDEX; 86480684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul break; 865a3f137094cd965d27e1b088499dd609b81a91906Brian Paul default: 866a3f137094cd965d27e1b088499dd609b81a91906Brian Paul return NULL; 867a3f137094cd965d27e1b088499dd609b81a91906Brian Paul } 86880684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul 86980684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul texImage = ctx->Texture.ProxyTex[texIndex]->Image[0][level]; 87080684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul if (!texImage) { 87180684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul texImage = ctx->Driver.NewTextureImage(ctx); 87280684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul if (!texImage) { 87380684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "proxy texture allocation"); 87480684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul return NULL; 87580684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul } 87680684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul ctx->Texture.ProxyTex[texIndex]->Image[0][level] = texImage; 87780684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul /* Set the 'back' pointer */ 87880684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul texImage->TexObject = ctx->Texture.ProxyTex[texIndex]; 87980684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul } 88080684649a6d01f0e0517b14f61cbcad6fa101929Brian Paul return texImage; 881a3f137094cd965d27e1b088499dd609b81a91906Brian Paul} 882a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 883a3f137094cd965d27e1b088499dd609b81a91906Brian Paul 8846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 8856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Get the maximum number of allowed mipmap levels. 8866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 8876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 8886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target. 8896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 8906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return the maximum number of allowed mipmap levels for the given 8916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * texture target, or zero if passed a bad target. 8926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 8936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \sa gl_constants. 894ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul */ 895ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian PaulGLint 896f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_max_texture_levels(struct gl_context *ctx, GLenum target) 897ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul{ 898ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul switch (target) { 899ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_1D: 900ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_PROXY_TEXTURE_1D: 901ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_2D: 902ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_PROXY_TEXTURE_2D: 903ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul return ctx->Const.MaxTextureLevels; 904ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_3D: 905ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_PROXY_TEXTURE_3D: 906ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul return ctx->Const.Max3DTextureLevels; 907ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 908ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 909ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 910ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 911ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 912ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 913add9f2168a5d6b15eb9955ee761246c4f4cf8458Brian Paul case GL_TEXTURE_CUBE_MAP_ARB: 914ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_PROXY_TEXTURE_CUBE_MAP_ARB: 915fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul return ctx->Extensions.ARB_texture_cube_map 916fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul ? ctx->Const.MaxCubeTextureLevels : 0; 917ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_TEXTURE_RECTANGLE_NV: 918ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul case GL_PROXY_TEXTURE_RECTANGLE_NV: 919fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul return ctx->Extensions.NV_texture_rectangle ? 1 : 0; 920fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul case GL_TEXTURE_1D_ARRAY_EXT: 921fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 922fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul case GL_TEXTURE_2D_ARRAY_EXT: 923fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 924f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul return (ctx->Extensions.MESA_texture_array || 925f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul ctx->Extensions.EXT_texture_array) 926fe988d786c4076bfbf410b84085d8c1115baa489Brian Paul ? ctx->Const.MaxTextureLevels : 0; 927874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_TEXTURE_BUFFER: 9280c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu case GL_TEXTURE_EXTERNAL_OES: 929874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul /* fall-through */ 930ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul default: 931ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul return 0; /* bad target */ 932ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul } 933ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul} 934ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul 935ef31f60b12abc2109568fb8d9a2aaa70ec5c71ccBrian Paul 93683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul/** 9375e3733fadf08178fca7c9f20a0f4783f940383aaBrian Paul * Return number of dimensions per mipmap level for the given texture target. 93883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul */ 939a988ddf3798e0ec568704e4a72b46030079c7e45Dave AirlieGLint 940a988ddf3798e0ec568704e4a72b46030079c7e45Dave Airlie_mesa_get_texture_dimensions(GLenum target) 94183e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul{ 94283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul switch (target) { 94383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_TEXTURE_1D: 94483e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_PROXY_TEXTURE_1D: 94583e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul return 1; 94683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_TEXTURE_2D: 94783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_TEXTURE_RECTANGLE: 94883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_TEXTURE_CUBE_MAP: 94983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_PROXY_TEXTURE_2D: 95083e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_PROXY_TEXTURE_RECTANGLE: 95183e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_PROXY_TEXTURE_CUBE_MAP: 95283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 95383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 95483e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 95583e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 95683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 95783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 9585e3733fadf08178fca7c9f20a0f4783f940383aaBrian Paul case GL_TEXTURE_1D_ARRAY: 9595e3733fadf08178fca7c9f20a0f4783f940383aaBrian Paul case GL_PROXY_TEXTURE_1D_ARRAY: 9600c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu case GL_TEXTURE_EXTERNAL_OES: 96183e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul return 2; 96283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_TEXTURE_3D: 96383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul case GL_PROXY_TEXTURE_3D: 9645e3733fadf08178fca7c9f20a0f4783f940383aaBrian Paul case GL_TEXTURE_2D_ARRAY: 9655e3733fadf08178fca7c9f20a0f4783f940383aaBrian Paul case GL_PROXY_TEXTURE_2D_ARRAY: 96683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul return 3; 967874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_TEXTURE_BUFFER: 968874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul /* fall-through */ 96983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul default: 97083e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul _mesa_problem(NULL, "invalid target 0x%x in get_texture_dimensions()", 97183e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul target); 97283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul return 2; 97383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul } 97483e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul} 97583e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul 97683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul 97783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul 978fc4b44399a07a7a7559f20ceab8a791209b4d875Brian Paul 97962c734f49948df7aeef55ad23a6664cbf3e11533Brian Paul#if 000 /* not used anymore */ 980f93b3dd69e744cf1dd6b102a11cdb07c2df4a967Brian Paul/* 981afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * glTexImage[123]D can accept a NULL image pointer. In this case we 982afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * create a texture image with unspecified image contents per the OpenGL 9838e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul * spec. 984afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 9858e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulstatic GLubyte * 9868e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paulmake_null_texture(GLint width, GLint height, GLint depth, GLenum format) 987afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 9888e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const GLint components = _mesa_components_in_format(format); 9898e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul const GLint numPixels = width * height * depth; 9908e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLubyte *data = (GLubyte *) MALLOC(numPixels * components * sizeof(GLubyte)); 991afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 992a1503b00f863a48a517939a42d512f9cfe77f79cBrian Paul#ifdef DEBUG 993afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* 994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Let's see if anyone finds this. If glTexImage2D() is called with 995afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * a NULL image pointer then load the texture image with something 996afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * interesting instead of leaving it indeterminate. 997afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 9988e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul if (data) { 99965d54604c387dca986c876e811362d8e8517dcacBrian Paul static const char message[8][32] = { 1000afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X XXXXX XXX X ", 1001afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " XX XX X X X X X ", 1002afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X X X X X X ", 1003afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X XXXX XXX XXXXX ", 1004afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X X X X X ", 1005afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X X X X X X ", 1006afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " X X XXXXX XXX X X ", 1007afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg " " 1008afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg }; 1009afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 10108e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLubyte *imgPtr = data; 10118e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint h, i, j, k; 10128e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul for (h = 0; h < depth; h++) { 10138e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul for (i = 0; i < height; i++) { 10148e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint srcRow = 7 - (i % 8); 10158e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul for (j = 0; j < width; j++) { 10168e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLint srcCol = j % 32; 10178e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul GLubyte texel = (message[srcRow][srcCol]=='X') ? 255 : 70; 10188e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul for (k = 0; k < components; k++) { 10198e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul *imgPtr++ = texel; 10208e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul } 1021afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1022afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1023afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1024afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1025a1503b00f863a48a517939a42d512f9cfe77f79cBrian Paul#endif 10268e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 10278e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul return data; 1028afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 102962c734f49948df7aeef55ad23a6664cbf3e11533Brian Paul#endif 1030afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1031afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1032afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1033738318bb75dea8dac4465f53850987f6062a732dBrian Paul/** 1034fc144728c7e33e53f7a4a4486eb81fddff156758Brian Paul * Set the size and format-related fields of a gl_texture_image struct 1035fc144728c7e33e53f7a4a4486eb81fddff156758Brian Paul * to zero. This is used when a proxy texture test fails. 10369c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul */ 10379c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paulstatic void 1038f378ab825c0c74aab263e7dec30194eead22c288Brian Paulclear_teximage_fields(struct gl_texture_image *img) 10399c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul{ 10409c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul ASSERT(img); 1041a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul img->_BaseFormat = 0; 1042a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul img->InternalFormat = 0; 10439c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Border = 0; 10449c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Width = 0; 10459c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Height = 0; 10469c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Depth = 0; 10479c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Width2 = 0; 10489c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Height2 = 0; 10499c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->Depth2 = 0; 10509c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->WidthLog2 = 0; 10519c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->HeightLog2 = 0; 10529c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul img->DepthLog2 = 0; 10531f7c914ad0beea8a29c1a171c7cd1a12f2efe0faBrian Paul img->TexFormat = MESA_FORMAT_NONE; 10549c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul} 10559c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul 10569c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul 10576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 10586628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul * Initialize basic fields of the gl_texture_image struct. 10596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 1061b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul * \param target texture target (GL_TEXTURE_1D, GL_TEXTURE_RECTANGLE, etc). 10626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param img texture image structure to be initialized. 10636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width. 10646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height. 10656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param depth image depth. 10666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param border image border. 10676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param internalFormat internal format. 106883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul * \param format the actual hardware format (one of MESA_FORMAT_*) 10696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 10706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Fills in the fields of \p img with the given information. 1071887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul * Note: width, height and depth include the border. 10726628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul */ 10733893e638e6521b9c070e01c0b31d22754ff97a88Brian Paulvoid 1074f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_init_teximage_fields(struct gl_context *ctx, GLenum target, 10753893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul struct gl_texture_image *img, 10763893e638e6521b9c070e01c0b31d22754ff97a88Brian Paul GLsizei width, GLsizei height, GLsizei depth, 107783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul GLint border, GLenum internalFormat, 107883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul gl_format format) 10796628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul{ 10806628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul ASSERT(img); 10818bc00c2047f69d8cd37d4fd70256850445b0fa1dBrian Paul ASSERT(width >= 0); 10828bc00c2047f69d8cd37d4fd70256850445b0fa1dBrian Paul ASSERT(height >= 0); 10838bc00c2047f69d8cd37d4fd70256850445b0fa1dBrian Paul ASSERT(depth >= 0); 1084b0b6d1abe5c7e629baebd4bf3d3ee3b17ba6ff08Brian Paul 1085a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul img->_BaseFormat = _mesa_base_tex_format( ctx, internalFormat ); 1086a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul ASSERT(img->_BaseFormat > 0); 1087a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul img->InternalFormat = internalFormat; 10886628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->Border = border; 10896628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->Width = width; 10906628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->Height = height; 10916628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->Depth = depth; 1092c813b545ab4726fc5030f123ec6255224d64ad82Brian 10934d0b7618cb3ada3b13e9e9b650ace34f5131e318Brian Paul img->Width2 = width - 2 * border; /* == 1 << img->WidthLog2; */ 1094b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger img->WidthLog2 = _mesa_logbase2(img->Width2); 1095c813b545ab4726fc5030f123ec6255224d64ad82Brian 1096c813b545ab4726fc5030f123ec6255224d64ad82Brian if (height == 1) { /* 1-D texture */ 1097c813b545ab4726fc5030f123ec6255224d64ad82Brian img->Height2 = 1; 10986628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->HeightLog2 = 0; 1099c813b545ab4726fc5030f123ec6255224d64ad82Brian } 1100c813b545ab4726fc5030f123ec6255224d64ad82Brian else { 1101c813b545ab4726fc5030f123ec6255224d64ad82Brian img->Height2 = height - 2 * border; /* == 1 << img->HeightLog2; */ 1102b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger img->HeightLog2 = _mesa_logbase2(img->Height2); 1103c813b545ab4726fc5030f123ec6255224d64ad82Brian } 1104c813b545ab4726fc5030f123ec6255224d64ad82Brian 1105c813b545ab4726fc5030f123ec6255224d64ad82Brian if (depth == 1) { /* 2-D texture */ 1106c813b545ab4726fc5030f123ec6255224d64ad82Brian img->Depth2 = 1; 11076628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->DepthLog2 = 0; 1108c813b545ab4726fc5030f123ec6255224d64ad82Brian } 1109c813b545ab4726fc5030f123ec6255224d64ad82Brian else { 1110c813b545ab4726fc5030f123ec6255224d64ad82Brian img->Depth2 = depth - 2 * border; /* == 1 << img->DepthLog2; */ 1111b537f54b3a2bd47ec861f5c432c49529684eef21Roland Scheidegger img->DepthLog2 = _mesa_logbase2(img->Depth2); 1112c813b545ab4726fc5030f123ec6255224d64ad82Brian } 1113c813b545ab4726fc5030f123ec6255224d64ad82Brian 11146628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul img->MaxLog2 = MAX2(img->WidthLog2, img->HeightLog2); 1115c813b545ab4726fc5030f123ec6255224d64ad82Brian 111683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul img->TexFormat = format; 11176628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul} 11186628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul 11196628bc9cff74a6d524165e809f73eabc85ba34b5Brian Paul 1120738318bb75dea8dac4465f53850987f6062a732dBrian Paul/** 112142b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * Free and clear fields of the gl_texture_image struct. 112242b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * 112342b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * \param ctx GL context. 112442b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * \param texImage texture image structure to be cleared. 112542b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * 112642b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * After the call, \p texImage will have no data associated with it. Its 112742b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu * fields are cleared so that its parent object will test incomplete. 112842b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu */ 112942b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wuvoid 11303c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul_mesa_clear_texture_image(struct gl_context *ctx, 11313c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul struct gl_texture_image *texImage) 113242b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu{ 11330bb29949ba8a9e5a15dc0640dbb0a4e7990a1d57Eric Anholt ctx->Driver.FreeTextureImageBuffer(ctx, texImage); 113442b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu clear_teximage_fields(texImage); 113542b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu} 113642b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu 113742b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu 113842b6b067ac68ac1309d0570613bea4a88f745559Chia-I Wu/** 1139738318bb75dea8dac4465f53850987f6062a732dBrian Paul * This is the fallback for Driver.TestProxyTexImage(). Test the texture 1140738318bb75dea8dac4465f53850987f6062a732dBrian Paul * level, width, height and depth against the ctx->Const limits for textures. 1141738318bb75dea8dac4465f53850987f6062a732dBrian Paul * 1142738318bb75dea8dac4465f53850987f6062a732dBrian Paul * A hardware driver might override this function if, for example, the 1143738318bb75dea8dac4465f53850987f6062a732dBrian Paul * max 3D texture size is 512x512x64 (i.e. not a cube). 1144738318bb75dea8dac4465f53850987f6062a732dBrian Paul * 1145aa328291c5b015e74ebfd9c5cdb39227265b3000Brian * Note that width, height, depth == 0 is not an error. However, a 1146aa328291c5b015e74ebfd9c5cdb39227265b3000Brian * texture with zero width/height/depth will be considered "incomplete" 1147aa328291c5b015e74ebfd9c5cdb39227265b3000Brian * and texturing will effectively be disabled. 1148aa328291c5b015e74ebfd9c5cdb39227265b3000Brian * 1149738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param target one of GL_PROXY_TEXTURE_1D, GL_PROXY_TEXTURE_2D, 1150738318bb75dea8dac4465f53850987f6062a732dBrian Paul * GL_PROXY_TEXTURE_3D, GL_PROXY_TEXTURE_RECTANGLE_NV, 1151738318bb75dea8dac4465f53850987f6062a732dBrian Paul * GL_PROXY_TEXTURE_CUBE_MAP_ARB. 1152738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param level as passed to glTexImage 1153738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param internalFormat as passed to glTexImage 1154738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param format as passed to glTexImage 1155738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param type as passed to glTexImage 1156738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param width as passed to glTexImage 1157738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param height as passed to glTexImage 1158738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param depth as passed to glTexImage 1159738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \param border as passed to glTexImage 1160738318bb75dea8dac4465f53850987f6062a732dBrian Paul * \return GL_TRUE if the image is acceptable, GL_FALSE if not acceptable. 1161738318bb75dea8dac4465f53850987f6062a732dBrian Paul */ 1162738318bb75dea8dac4465f53850987f6062a732dBrian PaulGLboolean 1163f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, 1164738318bb75dea8dac4465f53850987f6062a732dBrian Paul GLint internalFormat, GLenum format, GLenum type, 1165738318bb75dea8dac4465f53850987f6062a732dBrian Paul GLint width, GLint height, GLint depth, GLint border) 1166738318bb75dea8dac4465f53850987f6062a732dBrian Paul{ 1167738318bb75dea8dac4465f53850987f6062a732dBrian Paul GLint maxSize; 11689c27278acfb786c8f2fc591eef9ed0c25135bcf0Brian Paul 1169738318bb75dea8dac4465f53850987f6062a732dBrian Paul (void) internalFormat; 1170738318bb75dea8dac4465f53850987f6062a732dBrian Paul (void) format; 1171738318bb75dea8dac4465f53850987f6062a732dBrian Paul (void) type; 1172738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1173738318bb75dea8dac4465f53850987f6062a732dBrian Paul switch (target) { 1174738318bb75dea8dac4465f53850987f6062a732dBrian Paul case GL_PROXY_TEXTURE_1D: 1175738318bb75dea8dac4465f53850987f6062a732dBrian Paul maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); 1176c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (width < 2 * border || width > 2 + maxSize) 1177738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_FALSE; 1178c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (level >= ctx->Const.MaxTextureLevels) 1179c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1180c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (!ctx->Extensions.ARB_texture_non_power_of_two) { 1181c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) 1182c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1183738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1184738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1185c64447f47de168e82086bc2fb483817b82e59cabBrian Paul 1186738318bb75dea8dac4465f53850987f6062a732dBrian Paul case GL_PROXY_TEXTURE_2D: 1187738318bb75dea8dac4465f53850987f6062a732dBrian Paul maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); 1188c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (width < 2 * border || width > 2 + maxSize) 1189c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1190c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (height < 2 * border || height > 2 + maxSize) 1191738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_FALSE; 1192c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (level >= ctx->Const.MaxTextureLevels) 1193c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1194c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (!ctx->Extensions.ARB_texture_non_power_of_two) { 1195c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) 1196c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1197c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (height > 0 && !_mesa_is_pow_two(height - 2 * border)) 1198c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1199738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1200738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1201c64447f47de168e82086bc2fb483817b82e59cabBrian Paul 1202738318bb75dea8dac4465f53850987f6062a732dBrian Paul case GL_PROXY_TEXTURE_3D: 1203738318bb75dea8dac4465f53850987f6062a732dBrian Paul maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1); 1204c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (width < 2 * border || width > 2 + maxSize) 1205c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1206c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (height < 2 * border || height > 2 + maxSize) 1207738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_FALSE; 1208c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (depth < 2 * border || depth > 2 + maxSize) 1209c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1210c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (level >= ctx->Const.Max3DTextureLevels) 1211c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1212c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (!ctx->Extensions.ARB_texture_non_power_of_two) { 1213c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) 1214c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1215c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (height > 0 && !_mesa_is_pow_two(height - 2 * border)) 1216c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1217c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (depth > 0 && !_mesa_is_pow_two(depth - 2 * border)) 1218c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1219738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1220738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1221c64447f47de168e82086bc2fb483817b82e59cabBrian Paul 1222738318bb75dea8dac4465f53850987f6062a732dBrian Paul case GL_PROXY_TEXTURE_RECTANGLE_NV: 1223c64447f47de168e82086bc2fb483817b82e59cabBrian Paul maxSize = ctx->Const.MaxTextureRectSize; 1224c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (width < 0 || width > maxSize) 1225c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1226c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (height < 0 || height > maxSize) 1227c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1228c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (level != 0) 1229738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_FALSE; 1230738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1231c64447f47de168e82086bc2fb483817b82e59cabBrian Paul 1232738318bb75dea8dac4465f53850987f6062a732dBrian Paul case GL_PROXY_TEXTURE_CUBE_MAP_ARB: 1233738318bb75dea8dac4465f53850987f6062a732dBrian Paul maxSize = 1 << (ctx->Const.MaxCubeTextureLevels - 1); 1234c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (width < 2 * border || width > 2 + maxSize) 1235c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1236c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (height < 2 * border || height > 2 + maxSize) 1237c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1238c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (level >= ctx->Const.MaxCubeTextureLevels) 1239738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_FALSE; 1240c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (!ctx->Extensions.ARB_texture_non_power_of_two) { 1241c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) 1242c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1243c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (height > 0 && !_mesa_is_pow_two(height - 2 * border)) 1244c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1245738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1246738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1247c64447f47de168e82086bc2fb483817b82e59cabBrian Paul 1248bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 1249bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); 1250c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (width < 2 * border || width > 2 + maxSize) 1251bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick return GL_FALSE; 1252c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (height < 1 || height > ctx->Const.MaxArrayTextureLayers) 1253bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick return GL_FALSE; 1254c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (level >= ctx->Const.MaxTextureLevels) 1255c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1256c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (!ctx->Extensions.ARB_texture_non_power_of_two) { 1257c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) 1258c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1259bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick } 1260bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick return GL_TRUE; 1261c64447f47de168e82086bc2fb483817b82e59cabBrian Paul 1262bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 1263bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); 1264c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (width < 2 * border || width > 2 + maxSize) 1265bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick return GL_FALSE; 1266c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (height < 2 * border || height > 2 + maxSize) 1267c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1268c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (depth < 1 || depth > ctx->Const.MaxArrayTextureLayers) 1269bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick return GL_FALSE; 1270c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (level >= ctx->Const.MaxTextureLevels) 1271c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1272c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (!ctx->Extensions.ARB_texture_non_power_of_two) { 1273c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) 1274c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1275c64447f47de168e82086bc2fb483817b82e59cabBrian Paul if (height > 0 && !_mesa_is_pow_two(height - 2 * border)) 1276c64447f47de168e82086bc2fb483817b82e59cabBrian Paul return GL_FALSE; 1277bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick } 1278bb372f1c9bc08e8b0dca983cb4ba36b2f2f039fbIan Romanick return GL_TRUE; 1279c64447f47de168e82086bc2fb483817b82e59cabBrian Paul 1280738318bb75dea8dac4465f53850987f6062a732dBrian Paul default: 1281738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_problem(ctx, "Invalid target in _mesa_test_proxy_teximage"); 1282738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_FALSE; 1283738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1284738318bb75dea8dac4465f53850987f6062a732dBrian Paul} 1285738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1286738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1287738318bb75dea8dac4465f53850987f6062a732dBrian Paul/** 12884b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul * Check if the memory used by the texture would exceed the driver's limit. 12894b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul * This lets us support a max 3D texture size of 8K (for example) but 12904b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul * prevents allocating a full 8K x 8K x 8K texture. 12914b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul * XXX this could be rolled into the proxy texture size test (above) but 12924b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul * we don't have the actual texture internal format at that point. 12934b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul */ 12944b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paulstatic GLboolean 12954b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paullegal_texture_size(struct gl_context *ctx, gl_format format, 12964b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul GLint width, GLint height, GLint depth) 12974b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul{ 12984b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul uint64_t bytes = _mesa_format_image_size64(format, width, height, depth); 12994b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul uint64_t mbytes = bytes / (1024 * 1024); /* convert to MB */ 13004b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul return mbytes <= (uint64_t) ctx->Const.MaxTextureMbytes; 13014b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul} 13024b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul 13034b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul 1304d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu/** 1305d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu * Return true if the format is only valid for glCompressedTexImage. 1306d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu */ 1307d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wustatic GLboolean 1308d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wucompressedteximage_only_format(const struct gl_context *ctx, GLenum format) 1309d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu{ 1310d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu switch (format) { 1311d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu case GL_ETC1_RGB8_OES: 1312d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu return GL_TRUE; 1313d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu default: 1314d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu return GL_FALSE; 1315d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu } 1316d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu} 1317d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu 13184b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul 13194b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul/** 13207404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul * Helper function to determine whether a target and specific compression 13217404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul * format are supported. 1322064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick */ 1323064cd7c78c3108012f5d15206c70470f7b500259Ian Romanickstatic GLboolean 13247404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paultarget_can_be_compressed(const struct gl_context *ctx, GLenum target, 13257404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul GLenum intFormat) 1326064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick{ 13277404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul (void) intFormat; /* not used yet */ 13287404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul 1329646afcc34045cd482e79ded241aac23082e65f6cBrian Paul switch (target) { 1330646afcc34045cd482e79ded241aac23082e65f6cBrian Paul case GL_TEXTURE_2D: 1331646afcc34045cd482e79ded241aac23082e65f6cBrian Paul case GL_PROXY_TEXTURE_2D: 13327404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul return GL_TRUE; /* true for any compressed format so far */ 1333646afcc34045cd482e79ded241aac23082e65f6cBrian Paul case GL_PROXY_TEXTURE_CUBE_MAP: 1334646afcc34045cd482e79ded241aac23082e65f6cBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 1335646afcc34045cd482e79ded241aac23082e65f6cBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 1336646afcc34045cd482e79ded241aac23082e65f6cBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 1337646afcc34045cd482e79ded241aac23082e65f6cBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 1338646afcc34045cd482e79ded241aac23082e65f6cBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 1339646afcc34045cd482e79ded241aac23082e65f6cBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 1340646afcc34045cd482e79ded241aac23082e65f6cBrian Paul return ctx->Extensions.ARB_texture_cube_map; 1341646afcc34045cd482e79ded241aac23082e65f6cBrian Paul case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 1342646afcc34045cd482e79ded241aac23082e65f6cBrian Paul case GL_TEXTURE_2D_ARRAY_EXT: 1343f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul return (ctx->Extensions.MESA_texture_array || 1344684c66bb8b8cdaa7fc18b64a6f739ad70a10cd54Brian Paul ctx->Extensions.EXT_texture_array); 1345646afcc34045cd482e79ded241aac23082e65f6cBrian Paul default: 1346646afcc34045cd482e79ded241aac23082e65f6cBrian Paul return GL_FALSE; 1347646afcc34045cd482e79ded241aac23082e65f6cBrian Paul } 1348064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick} 1349064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick 1350064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick 1351064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick/** 1352d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul * Check if the given texture target value is legal for a 1353d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul * glTexImage1/2/3D call. 1354d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul */ 1355d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paulstatic GLboolean 1356d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paullegal_teximage_target(struct gl_context *ctx, GLuint dims, GLenum target) 1357d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul{ 1358d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul switch (dims) { 1359d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case 1: 1360d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul switch (target) { 1361d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_TEXTURE_1D: 1362d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_PROXY_TEXTURE_1D: 1363d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul return GL_TRUE; 1364d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul default: 1365d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul return GL_FALSE; 1366d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul } 1367d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case 2: 1368d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul switch (target) { 1369d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_TEXTURE_2D: 1370d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_PROXY_TEXTURE_2D: 1371d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul return GL_TRUE; 1372d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_PROXY_TEXTURE_CUBE_MAP: 1373d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 1374d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 1375d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 1376d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 1377d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 1378d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 1379d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul return ctx->Extensions.ARB_texture_cube_map; 1380d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_TEXTURE_RECTANGLE_NV: 1381d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_PROXY_TEXTURE_RECTANGLE_NV: 1382d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul return ctx->Extensions.NV_texture_rectangle; 1383d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_TEXTURE_1D_ARRAY_EXT: 1384d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 1385f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul return (ctx->Extensions.MESA_texture_array || 1386f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul ctx->Extensions.EXT_texture_array); 1387d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul default: 1388d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul return GL_FALSE; 1389d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul } 1390d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case 3: 1391d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul switch (target) { 1392d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_TEXTURE_3D: 1393d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_PROXY_TEXTURE_3D: 1394d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul return GL_TRUE; 1395d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_TEXTURE_2D_ARRAY_EXT: 1396d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 1397f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul return (ctx->Extensions.MESA_texture_array || 1398f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul ctx->Extensions.EXT_texture_array); 1399d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul default: 1400d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul return GL_FALSE; 1401d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul } 1402d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul default: 1403d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul _mesa_problem(ctx, "invalid dims=%u in legal_teximage_target()", dims); 1404d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul return GL_FALSE; 1405d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul } 1406d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul} 1407d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul 1408d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul 1409d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul/** 141011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul * Check if the given texture target value is legal for a 141109a5e028a6d254f619132e302a96c8535018603dBrian Paul * glTexSubImage, glCopyTexSubImage or glCopyTexImage call. 141209a5e028a6d254f619132e302a96c8535018603dBrian Paul * The difference compared to legal_teximage_target() above is that 141309a5e028a6d254f619132e302a96c8535018603dBrian Paul * proxy targets are not supported. 141411f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul */ 141511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paulstatic GLboolean 141609a5e028a6d254f619132e302a96c8535018603dBrian Paullegal_texsubimage_target(struct gl_context *ctx, GLuint dims, GLenum target) 141711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul{ 141811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul switch (dims) { 141911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul case 1: 142011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul return target == GL_TEXTURE_1D; 142111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul case 2: 142211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul switch (target) { 142311f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul case GL_TEXTURE_2D: 142411f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul return GL_TRUE; 142511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 142611f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 142711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 142811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 142911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 143011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 143111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul return ctx->Extensions.ARB_texture_cube_map; 143211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul case GL_TEXTURE_RECTANGLE_NV: 143311f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul return ctx->Extensions.NV_texture_rectangle; 143411f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul case GL_TEXTURE_1D_ARRAY_EXT: 1435f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul return (ctx->Extensions.MESA_texture_array || 1436f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul ctx->Extensions.EXT_texture_array); 143711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul default: 143811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul return GL_FALSE; 143911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul } 144009a5e028a6d254f619132e302a96c8535018603dBrian Paul case 3: 144109a5e028a6d254f619132e302a96c8535018603dBrian Paul switch (target) { 144209a5e028a6d254f619132e302a96c8535018603dBrian Paul case GL_TEXTURE_3D: 144309a5e028a6d254f619132e302a96c8535018603dBrian Paul return GL_TRUE; 144409a5e028a6d254f619132e302a96c8535018603dBrian Paul case GL_TEXTURE_2D_ARRAY_EXT: 1445f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul return (ctx->Extensions.MESA_texture_array || 1446f2dd11817a66b6254e1533398dc53f1bc51953beBrian Paul ctx->Extensions.EXT_texture_array); 144709a5e028a6d254f619132e302a96c8535018603dBrian Paul default: 144809a5e028a6d254f619132e302a96c8535018603dBrian Paul return GL_FALSE; 144909a5e028a6d254f619132e302a96c8535018603dBrian Paul } 145011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul default: 145109a5e028a6d254f619132e302a96c8535018603dBrian Paul _mesa_problem(ctx, "invalid dims=%u in legal_texsubimage_target()", 145209a5e028a6d254f619132e302a96c8535018603dBrian Paul dims); 145311f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul return GL_FALSE; 145411f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul } 145511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul} 145611f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul 145711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul 145811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul/** 1459a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul * Helper function to determine if a texture object is mutable (in terms 1460a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul * of GL_ARB_texture_storage). 1461a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul */ 1462a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paulstatic GLboolean 1463a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paulmutable_tex_object(struct gl_context *ctx, GLenum target) 1464a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul{ 1465a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul if (ctx->Extensions.ARB_texture_storage) { 1466a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul struct gl_texture_object *texObj = 1467a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul _mesa_get_current_tex_object(ctx, target); 1468a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul return !texObj->Immutable; 1469a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul } 1470a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul return GL_TRUE; 1471a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul} 1472a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul 1473a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul 1474a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul 1475a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul/** 14766dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Test the glTexImage[123]D() parameters for errors. 14776dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 14786dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 147985288ad722aa0ad378004c523a0e1a4984e15316Brian Paul * \param dimensions texture image dimensions (must be 1, 2 or 3). 14806dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target given by the user. 14816dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level given by the user. 14826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param internalFormat internal format given by the user. 14836dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel data format given by the user. 14846dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type given by the user. 14856dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width given by the user. 14866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height given by the user. 14876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param depth image depth given by the user. 14886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param border image border given by the user. 14896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 14906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if an error was detected, or GL_FALSE if no errors. 14916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 14926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies each of the parameters against the constants specified in 14933c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * __struct gl_contextRec::Const and the supported extensions, and according 14943c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * to the OpenGL specification. 1495afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1496c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean 149785288ad722aa0ad378004c523a0e1a4984e15316Brian Paultexture_error_check( struct gl_context *ctx, 149885288ad722aa0ad378004c523a0e1a4984e15316Brian Paul GLuint dimensions, GLenum target, 1499c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint level, GLint internalFormat, 1500c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum format, GLenum type, 1501c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint width, GLint height, 1502c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint depth, GLint border ) 1503afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 150435f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul const GLenum proxyTarget = get_proxy_target(target); 150535f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul const GLboolean isProxy = target == proxyTarget; 1506e2e4b60c7d9fc3618c0f9d7496c9ce3d5eee3ab5Ian Romanick GLboolean sizeOK = GL_TRUE; 1507eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick GLboolean colorFormat; 1508eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick 1509eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick /* Even though there are no color-index textures, we still have to support 1510eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick * uploading color-index data and remapping it to RGB via the 1511eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick * GL_PIXEL_MAP_I_TO_[RGBA] tables. 1512eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick */ 1513eba527bf9ffc2fd67c44fb77104107556f509b49Ian Romanick const GLboolean indexFormat = (format == GL_COLOR_INDEX); 1514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1515738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Basic level check (more checking in ctx->Driver.TestProxyTexImage) */ 1516738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (level < 0 || level >= MAX_TEXTURE_LEVELS) { 1517738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (!isProxy) { 1518738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1519738318bb75dea8dac4465f53850987f6062a732dBrian Paul "glTexImage%dD(level=%d)", dimensions, level); 15208afe7de8deaf3c9613fd68b344de8c52b02b1879Brian Paul } 1521738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1522738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1523738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1524738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check border */ 1525738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (border < 0 || border > 1 || 1526738318bb75dea8dac4465f53850987f6062a732dBrian Paul ((target == GL_TEXTURE_RECTANGLE_NV || 1527738318bb75dea8dac4465f53850987f6062a732dBrian Paul target == GL_PROXY_TEXTURE_RECTANGLE_NV) && border != 0)) { 1528738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (!isProxy) { 1529738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1530738318bb75dea8dac4465f53850987f6062a732dBrian Paul "glTexImage%dD(border=%d)", dimensions, border); 1531738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1532738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1533738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1534738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1535973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul if (width < 0 || height < 0 || depth < 0) { 1536f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul if (!isProxy) { 1537f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1538973da83f6237b5af4a9ee77f32fdfa5c04ecabc8Brian Paul "glTexImage%dD(width, height or depth < 0)", dimensions); 1539f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul } 1540f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul return GL_TRUE; 1541f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul } 1542f6e76fe9b5c4c57ac6dc81143b4474ebfee879d2Brian Paul 154335f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul /* Do this simple check before calling the TestProxyTexImage() function */ 154435f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul if (proxyTarget == GL_PROXY_TEXTURE_CUBE_MAP_ARB) { 154535f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul sizeOK = (width == height); 1546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1547d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul 154835f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul /* 154935f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul * Use the proxy texture driver hook to see if the size/level/etc are 155035f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul * legal. 155135f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul */ 155235f620d55ced7fcb3f39465c173ba2ae435a2ba1Brian Paul sizeOK = sizeOK && ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level, 1553e2e4b60c7d9fc3618c0f9d7496c9ce3d5eee3ab5Ian Romanick internalFormat, format, 1554e2e4b60c7d9fc3618c0f9d7496c9ce3d5eee3ab5Ian Romanick type, width, height, 1555e2e4b60c7d9fc3618c0f9d7496c9ce3d5eee3ab5Ian Romanick depth, border); 1556738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (!sizeOK) { 1557c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!isProxy) { 15584e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1559738318bb75dea8dac4465f53850987f6062a732dBrian Paul "glTexImage%dD(level=%d, width=%d, height=%d, depth=%d)", 1560738318bb75dea8dac4465f53850987f6062a732dBrian Paul dimensions, level, width, height, depth); 1561c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1562afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 1563afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1564afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1565738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check internalFormat */ 156689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (_mesa_base_tex_format(ctx, internalFormat) < 0) { 1567c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!isProxy) { 15684e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1569a71edc9455ef81a8dd5ec284e88061a585e63580Brian Paul "glTexImage%dD(internalFormat=%s)", 1570a71edc9455ef81a8dd5ec284e88061a585e63580Brian Paul dimensions, _mesa_lookup_enum_by_nr(internalFormat)); 1571c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1572afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_TRUE; 1573afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1574afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1575738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check incoming image format and type */ 1576f959f6e1dc27c71fc0ccc56e09b29101b3bf3b97Brian Paul if (!_mesa_is_legal_format_and_type(ctx, format, type)) { 1577326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul /* Normally, GL_INVALID_OPERATION is generated by a format/type 1578326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul * mismatch (see the 1.2 spec page 94, sec 3.6.4.). But with the 1579326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul * GL_EXT_texture_integer extension, some combinations should generate 1580326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul * GL_INVALID_ENUM instead (grr!). 158138f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes */ 158238f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes if (!isProxy) { 1583326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul GLenum error = _mesa_is_integer_format(format) 1584326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul ? GL_INVALID_ENUM : GL_INVALID_OPERATION; 1585326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul _mesa_error(ctx, error, 15868a8919a7ddd2348c4a4cbcbab2358c49e47e2ea5Brian Paul "glTexImage%dD(incompatible format 0x%x, type 0x%x)", 15878a8919a7ddd2348c4a4cbcbab2358c49e47e2ea5Brian Paul dimensions, format, type); 1588c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 158938f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes return GL_TRUE; 1590afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1591afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1592601df9c742939c1f77de489561fe3e1d02f49618Brian Paul /* make sure internal format and format basically agree */ 159322e442544bc451f114288f07cf9cc1584ca357a1Brian Paul colorFormat = _mesa_is_color_format(format); 159422e442544bc451f114288f07cf9cc1584ca357a1Brian Paul if ((_mesa_is_color_format(internalFormat) && !colorFormat && !indexFormat) || 1595ba2a55ccd61d9fa5565640faefb64fd6fb0e70abBrian Paul (_mesa_is_depth_format(internalFormat) != _mesa_is_depth_format(format)) || 1596ba2a55ccd61d9fa5565640faefb64fd6fb0e70abBrian Paul (_mesa_is_ycbcr_format(internalFormat) != _mesa_is_ycbcr_format(format)) || 1597ba2a55ccd61d9fa5565640faefb64fd6fb0e70abBrian Paul (_mesa_is_depthstencil_format(internalFormat) != _mesa_is_depthstencil_format(format)) || 1598ba2a55ccd61d9fa5565640faefb64fd6fb0e70abBrian Paul (_mesa_is_dudv_format(internalFormat) != _mesa_is_dudv_format(format))) { 1599601df9c742939c1f77de489561fe3e1d02f49618Brian Paul if (!isProxy) 1600601df9c742939c1f77de489561fe3e1d02f49618Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 16018a8919a7ddd2348c4a4cbcbab2358c49e47e2ea5Brian Paul "glTexImage%dD(incompatible internalFormat 0x%x, format 0x%x)", 16028a8919a7ddd2348c4a4cbcbab2358c49e47e2ea5Brian Paul dimensions, internalFormat, format); 1603601df9c742939c1f77de489561fe3e1d02f49618Brian Paul return GL_TRUE; 1604601df9c742939c1f77de489561fe3e1d02f49618Brian Paul } 1605601df9c742939c1f77de489561fe3e1d02f49618Brian Paul 1606601df9c742939c1f77de489561fe3e1d02f49618Brian Paul /* additional checks for ycbcr textures */ 1607601df9c742939c1f77de489561fe3e1d02f49618Brian Paul if (internalFormat == GL_YCBCR_MESA) { 1608c5b995066020191982b2315fc45d05e068eee761Brian Paul ASSERT(ctx->Extensions.MESA_ycbcr_texture); 1609601df9c742939c1f77de489561fe3e1d02f49618Brian Paul if (type != GL_UNSIGNED_SHORT_8_8_MESA && 1610601df9c742939c1f77de489561fe3e1d02f49618Brian Paul type != GL_UNSIGNED_SHORT_8_8_REV_MESA) { 1611c5b995066020191982b2315fc45d05e068eee761Brian Paul char message[100]; 1612fc1be4a99425d09103bba9e06026f31f2b0142d2Vinson Lee _mesa_snprintf(message, sizeof(message), 16132236a301c35d29a8e0775d2b62499d8843607ee1Brian Paul "glTexImage%dD(format/type YCBCR mismatch", dimensions); 1614c5dde53f4e42612518cd927bb58f08c0e22db17aVinson Lee _mesa_error(ctx, GL_INVALID_ENUM, "%s", message); 1615c5b995066020191982b2315fc45d05e068eee761Brian Paul return GL_TRUE; /* error */ 1616c5b995066020191982b2315fc45d05e068eee761Brian Paul } 1617d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul if (target != GL_TEXTURE_2D && 1618d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul target != GL_PROXY_TEXTURE_2D && 1619d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul target != GL_TEXTURE_RECTANGLE_NV && 1620d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul target != GL_PROXY_TEXTURE_RECTANGLE_NV) { 1621d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul if (!isProxy) 1622d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexImage(target)"); 1623d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul return GL_TRUE; 1624d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul } 1625d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul if (border != 0) { 1626d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul if (!isProxy) { 1627d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul char message[100]; 1628fc1be4a99425d09103bba9e06026f31f2b0142d2Vinson Lee _mesa_snprintf(message, sizeof(message), 16292236a301c35d29a8e0775d2b62499d8843607ee1Brian Paul "glTexImage%dD(format=GL_YCBCR_MESA and border=%d)", 1630fc1be4a99425d09103bba9e06026f31f2b0142d2Vinson Lee dimensions, border); 1631c5dde53f4e42612518cd927bb58f08c0e22db17aVinson Lee _mesa_error(ctx, GL_INVALID_VALUE, "%s", message); 1632d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul } 1633d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul return GL_TRUE; 1634d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul } 1635c5b995066020191982b2315fc45d05e068eee761Brian Paul } 1636c5b995066020191982b2315fc45d05e068eee761Brian Paul 1637601df9c742939c1f77de489561fe3e1d02f49618Brian Paul /* additional checks for depth textures */ 1638601df9c742939c1f77de489561fe3e1d02f49618Brian Paul if (_mesa_base_tex_format(ctx, internalFormat) == GL_DEPTH_COMPONENT) { 1639753660780a84187043d0dc4b0e0f449786862182Brian Paul /* Only 1D, 2D, rect and array textures supported, not 3D or cubes */ 1640601df9c742939c1f77de489561fe3e1d02f49618Brian Paul if (target != GL_TEXTURE_1D && 1641601df9c742939c1f77de489561fe3e1d02f49618Brian Paul target != GL_PROXY_TEXTURE_1D && 1642601df9c742939c1f77de489561fe3e1d02f49618Brian Paul target != GL_TEXTURE_2D && 16432b04dd9d2cba6ec3506e78016e64cffce6e8abf7Brian Paul target != GL_PROXY_TEXTURE_2D && 1644753660780a84187043d0dc4b0e0f449786862182Brian Paul target != GL_TEXTURE_1D_ARRAY && 1645753660780a84187043d0dc4b0e0f449786862182Brian Paul target != GL_PROXY_TEXTURE_1D_ARRAY && 1646753660780a84187043d0dc4b0e0f449786862182Brian Paul target != GL_TEXTURE_2D_ARRAY && 1647753660780a84187043d0dc4b0e0f449786862182Brian Paul target != GL_PROXY_TEXTURE_2D_ARRAY && 16482b04dd9d2cba6ec3506e78016e64cffce6e8abf7Brian Paul target != GL_TEXTURE_RECTANGLE_ARB && 16492b04dd9d2cba6ec3506e78016e64cffce6e8abf7Brian Paul target != GL_PROXY_TEXTURE_RECTANGLE_ARB) { 1650601df9c742939c1f77de489561fe3e1d02f49618Brian Paul if (!isProxy) 1651601df9c742939c1f77de489561fe3e1d02f49618Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, 1652601df9c742939c1f77de489561fe3e1d02f49618Brian Paul "glTexImage(target/internalFormat)"); 1653601df9c742939c1f77de489561fe3e1d02f49618Brian Paul return GL_TRUE; 1654601df9c742939c1f77de489561fe3e1d02f49618Brian Paul } 1655601df9c742939c1f77de489561fe3e1d02f49618Brian Paul } 1656601df9c742939c1f77de489561fe3e1d02f49618Brian Paul 1657601df9c742939c1f77de489561fe3e1d02f49618Brian Paul /* additional checks for compressed textures */ 1658c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul if (_mesa_is_compressed_format(ctx, internalFormat)) { 16597404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul if (!target_can_be_compressed(ctx, target, internalFormat)) { 16607404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul if (!isProxy) 16617404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, 16627404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul "glTexImage%dD(target)", dimensions); 1663064cd7c78c3108012f5d15206c70470f7b500259Ian Romanick return GL_TRUE; 166489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 1665d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu if (compressedteximage_only_format(ctx, internalFormat)) { 1666d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu _mesa_error(ctx, GL_INVALID_OPERATION, 1667d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu "glTexImage%dD(no compression for format)", dimensions); 1668d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu return GL_TRUE; 1669d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu } 167089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (border != 0) { 167189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (!isProxy) { 167289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 16738978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee "glTexImage%dD(border!=0)", dimensions); 167489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 167589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_TRUE; 167689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 167789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 167889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 1679326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul /* additional checks for integer textures */ 1680326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul if (ctx->Extensions.EXT_texture_integer && 1681326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul (_mesa_is_integer_format(format) != 1682326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul _mesa_is_integer_format(internalFormat))) { 1683326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul if (!isProxy) { 1684326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 1685326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul "glTexImage%dD(integer/non-integer format mismatch)", 1686326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul dimensions); 1687326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul } 1688326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul return GL_TRUE; 1689326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul } 1690326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul 1691a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul if (!mutable_tex_object(ctx, target)) { 1692a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 1693a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul "glTexImage%dD(immutable texture)", dimensions); 1694a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul return GL_TRUE; 1695a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul } 1696a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul 1697afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg /* if we get here, the parameters are OK */ 1698afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg return GL_FALSE; 1699afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 1700afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1701afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 17026dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1703c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Test glTexSubImage[123]D() parameters for errors. 17046dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 17056dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 17066dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dimensions texture image dimensions (must be 1, 2 or 3). 17076dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target given by the user. 17086dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level given by the user. 17096dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param xoffset sub-image x offset given by the user. 17106dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param yoffset sub-image y offset given by the user. 17116dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param zoffset sub-image z offset given by the user. 17126dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param format pixel data format given by the user. 17136dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param type pixel data type given by the user. 17146dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width given by the user. 17156dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height given by the user. 17166dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param depth image depth given by the user. 17176dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 17186dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if an error was detected, or GL_FALSE if no errors. 17196dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 17206dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies each of the parameters against the constants specified in 17213c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * __struct gl_contextRec::Const and the supported extensions, and according 17223c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * to the OpenGL specification. 1723afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1724c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean 1725f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergsubtexture_error_check( struct gl_context *ctx, GLuint dimensions, 1726c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum target, GLint level, 1727c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint xoffset, GLint yoffset, GLint zoffset, 1728c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint width, GLint height, GLint depth, 1729c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum format, GLenum type ) 1730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 1731738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Basic level check */ 1732738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (level < 0 || level >= MAX_TEXTURE_LEVELS) { 17334e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexSubImage2D(level=%d)", level); 1734c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1735c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1736afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 173745124e043da5a67e1081526d61b99422f4ccde19Brian Paul /* Check for negative sizes */ 1738c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (width < 0) { 17394e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 17404e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glTexSubImage%dD(width=%d)", dimensions, width); 1741c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1742c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1743c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (height < 0 && dimensions > 1) { 17444e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 17454e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glTexSubImage%dD(height=%d)", dimensions, height); 1746c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1747c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1748c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (depth < 0 && dimensions > 2) { 1749738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1750738318bb75dea8dac4465f53850987f6062a732dBrian Paul "glTexSubImage%dD(depth=%d)", dimensions, depth); 1751c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1752c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 17545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!_mesa_is_legal_format_and_type(ctx, format, type)) { 1755326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul /* As with the glTexImage2D check above, the error code here 1756326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul * depends on texture integer. 1757326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul */ 1758326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul GLenum error = _mesa_is_integer_format(format) 1759326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul ? GL_INVALID_OPERATION : GL_INVALID_ENUM; 1760326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul _mesa_error(ctx, error, 17618a8919a7ddd2348c4a4cbcbab2358c49e47e2ea5Brian Paul "glTexSubImage%dD(incompatible format 0x%x, type 0x%x)", 17628a8919a7ddd2348c4a4cbcbab2358c49e47e2ea5Brian Paul dimensions, format, type); 17635ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return GL_TRUE; 17645ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 17655ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 17665ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return GL_FALSE; 17675ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell} 1768f2718b0966f54049056e16e7cca08718341557b2Brian Paul 1769d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul 1770d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul/** 1771d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul * Do second part of glTexSubImage which depends on the destination texture. 1772d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul * \return GL_TRUE if error recorded, GL_FALSE otherwise 1773d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul */ 17745ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwellstatic GLboolean 1775f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergsubtexture_error_check2( struct gl_context *ctx, GLuint dimensions, 17765ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLenum target, GLint level, 17775ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLint xoffset, GLint yoffset, GLint zoffset, 17785ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLint width, GLint height, GLint depth, 17795ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLenum format, GLenum type, 17805ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell const struct gl_texture_image *destTex ) 17815ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell{ 1782c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!destTex) { 1783738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* undefined image level */ 1784738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glTexSubImage%dD", dimensions); 1785c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1786c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1787afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1788c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (xoffset < -((GLint)destTex->Border)) { 1789738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(xoffset)", 1790738318bb75dea8dac4465f53850987f6062a732dBrian Paul dimensions); 1791c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1792afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1793c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (xoffset + width > (GLint) (destTex->Width + destTex->Border)) { 1794738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(xoffset+width)", 1795738318bb75dea8dac4465f53850987f6062a732dBrian Paul dimensions); 1796c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1797c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1798c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 1) { 1799c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (yoffset < -((GLint)destTex->Border)) { 1800738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(yoffset)", 1801738318bb75dea8dac4465f53850987f6062a732dBrian Paul dimensions); 1802c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1803afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1804c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (yoffset + height > (GLint) (destTex->Height + destTex->Border)) { 1805738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(yoffset+height)", 1806738318bb75dea8dac4465f53850987f6062a732dBrian Paul dimensions); 1807c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1808afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1809afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1810c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 2) { 1811c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (zoffset < -((GLint)destTex->Border)) { 181208836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset)"); 1813c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1814c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 181538f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes if (zoffset + depth > (GLint) (destTex->Depth + destTex->Border)) { 181608836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset+depth)"); 1817c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1818c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1819afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 1820afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1821b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul if (_mesa_is_format_compressed(destTex->TexFormat)) { 1822d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul GLuint bw, bh; 1823d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul 1824d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu if (compressedteximage_only_format(ctx, destTex->InternalFormat)) { 1825d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu _mesa_error(ctx, GL_INVALID_OPERATION, 1826d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu "glTexSubImage%dD(no compression for format)", dimensions); 1827d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu return GL_TRUE; 1828d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu } 1829d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu 1830d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul /* do tests which depend on compression block size */ 1831d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul _mesa_get_format_block_size(destTex->TexFormat, &bw, &bh); 1832d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul 1833d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul /* offset must be multiple of block size */ 1834d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul if ((xoffset % bw != 0) || (yoffset % bh != 0)) { 1835e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 18368978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee "glTexSubImage%dD(xoffset = %d, yoffset = %d)", 1837d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul dimensions, xoffset, yoffset); 1838e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul return GL_TRUE; 1839e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul } 1840d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul /* size must be multiple of bw by bh or equal to whole texture size */ 1841d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul if ((width % bw != 0) && (GLuint) width != destTex->Width) { 1842e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 18438978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee "glTexSubImage%dD(width = %d)", dimensions, width); 1844e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul return GL_TRUE; 184589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 1846d580c0c8f7cad69b808118ef2aa6161f62f160d8Brian Paul if ((height % bh != 0) && (GLuint) height != destTex->Height) { 184789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 18488978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee "glTexSubImage%dD(height = %d)", dimensions, height); 184989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_TRUE; 185089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 1851e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul } 1852e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 1853c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_FALSE; 1854c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 1855afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 1856afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 18576dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 1858c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul * Test glCopyTexImage[12]D() parameters for errors. 18596dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 18606dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 18616dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dimensions texture image dimensions (must be 1, 2 or 3). 18626dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target given by the user. 18636dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level given by the user. 18646dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param internalFormat internal format given by the user. 18656dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param width image width given by the user. 18666dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param height image height given by the user. 18676dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param border texture border. 18686dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 18696dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if an error was detected, or GL_FALSE if no errors. 18706dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 18716dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * Verifies each of the parameters against the constants specified in 18723c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * __struct gl_contextRec::Const and the supported extensions, and according 18733c59febf05e6af80d63e5b9a478a11b275ac429cBrian Paul * to the OpenGL specification. 1874afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 1875c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean 1876f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcopytexture_error_check( struct gl_context *ctx, GLuint dimensions, 1877c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLenum target, GLint level, GLint internalFormat, 1878c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul GLint width, GLint height, GLint border ) 1879afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 188011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul const GLenum proxyTarget = get_proxy_target(target); 188111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul const GLenum type = GL_FLOAT; 1882738318bb75dea8dac4465f53850987f6062a732dBrian Paul GLboolean sizeOK; 1883e06277bd886a9a79f0bf9b175ec26fbe187689c2Brian Paul GLint baseFormat; 1884afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 188511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul /* check target */ 188609a5e028a6d254f619132e302a96c8535018603dBrian Paul if (!legal_texsubimage_target(ctx, dimensions, target)) { 188711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glCopyTexImage%uD(target=%s)", 188811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul dimensions, _mesa_lookup_enum_by_nr(target)); 188911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul return GL_TRUE; 189011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul } 189111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul 1892738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Basic level check (more checking in ctx->Driver.TestProxyTexImage) */ 1893738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (level < 0 || level >= MAX_TEXTURE_LEVELS) { 18945ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_error(ctx, GL_INVALID_VALUE, 18955ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell "glCopyTexImage%dD(level=%d)", dimensions, level); 18965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return GL_TRUE; 18975ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 18985ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 189934bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul /* Check that the source buffer is complete */ 190034bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul if (ctx->ReadBuffer->Name) { 1901b0fceae22f008f3963a392ebd57d7d2a095a5e05Brian Paul if (ctx->ReadBuffer->_Status == 0) { 1902b0fceae22f008f3963a392ebd57d7d2a095a5e05Brian Paul _mesa_test_framebuffer_completeness(ctx, ctx->ReadBuffer); 1903b0fceae22f008f3963a392ebd57d7d2a095a5e05Brian Paul } 190434bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) { 190534bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT, 190634bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul "glCopyTexImage%dD(invalid readbuffer)", dimensions); 190734bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul return GL_TRUE; 190834bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul } 190934bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul } 191034bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul 1911738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check border */ 1912738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (border < 0 || border > 1 || 1913738318bb75dea8dac4465f53850987f6062a732dBrian Paul ((target == GL_TEXTURE_RECTANGLE_NV || 1914738318bb75dea8dac4465f53850987f6062a732dBrian Paul target == GL_PROXY_TEXTURE_RECTANGLE_NV) && border != 0)) { 1915738318bb75dea8dac4465f53850987f6062a732dBrian Paul return GL_TRUE; 1916738318bb75dea8dac4465f53850987f6062a732dBrian Paul } 1917738318bb75dea8dac4465f53850987f6062a732dBrian Paul 1918e06277bd886a9a79f0bf9b175ec26fbe187689c2Brian Paul baseFormat = _mesa_base_tex_format(ctx, internalFormat); 1919e06277bd886a9a79f0bf9b175ec26fbe187689c2Brian Paul if (baseFormat < 0) { 19200899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 19210899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul "glCopyTexImage%dD(internalFormat)", dimensions); 19220899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul return GL_TRUE; 19230899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul } 19240899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul 1925e06277bd886a9a79f0bf9b175ec26fbe187689c2Brian Paul if (!_mesa_source_buffer_exists(ctx, baseFormat)) { 192634bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 192734bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul "glCopyTexImage%dD(missing readbuffer)", dimensions); 192834bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul return GL_TRUE; 192934bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul } 193034bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul 193111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul /* Do size, level checking */ 193211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul sizeOK = (proxyTarget == GL_PROXY_TEXTURE_CUBE_MAP_ARB) 193311f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul ? (width == height) : 1; 1934738318bb75dea8dac4465f53850987f6062a732dBrian Paul 193511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul sizeOK = sizeOK && ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level, 1936e06277bd886a9a79f0bf9b175ec26fbe187689c2Brian Paul internalFormat, baseFormat, 193711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul type, width, height, 193811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul 1, border); 1939c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1940738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (!sizeOK) { 1941738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (dimensions == 1) { 19424e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1943738318bb75dea8dac4465f53850987f6062a732dBrian Paul "glCopyTexImage1D(width=%d)", width); 1944c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1945738318bb75dea8dac4465f53850987f6062a732dBrian Paul else { 1946738318bb75dea8dac4465f53850987f6062a732dBrian Paul ASSERT(dimensions == 2); 1947738318bb75dea8dac4465f53850987f6062a732dBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 1948738318bb75dea8dac4465f53850987f6062a732dBrian Paul "glCopyTexImage2D(width=%d, height=%d)", width, height); 1949ad817704fa2c6d8449f55565f07ab5592a574fb6Brian Paul } 1950c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 1951c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 1952c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1953c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul if (_mesa_is_compressed_format(ctx, internalFormat)) { 19547404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul if (!target_can_be_compressed(ctx, target, internalFormat)) { 195589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, 19562236a301c35d29a8e0775d2b62499d8843607ee1Brian Paul "glCopyTexImage%dD(target)", dimensions); 195789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_TRUE; 195889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 1959d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu if (compressedteximage_only_format(ctx, internalFormat)) { 1960d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu _mesa_error(ctx, GL_INVALID_OPERATION, 1961d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu "glCopyTexImage%dD(no compression for format)", dimensions); 1962d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu return GL_TRUE; 1963d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu } 196489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (border != 0) { 196589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 19668978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee "glCopyTexImage%dD(border!=0)", dimensions); 19670899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul return GL_TRUE; 19680899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul } 19690899afae33a29d1f6d15ebc96dc6ea8a8371cdb6Brian Paul } 197089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 1971a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul if (!mutable_tex_object(ctx, target)) { 1972a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 1973a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul "glCopyTexImage%dD(immutable texture)", dimensions); 1974a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul return GL_TRUE; 1975a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul } 1976a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul 1977c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* if we get here, the parameters are OK */ 1978c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_FALSE; 1979c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 1980c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 1981c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 19826dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell/** 198334bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul * Test glCopyTexSubImage[12]D() parameters for errors. 19849dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * Note that this is the first part of error checking. 19859dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * See also copytexsubimage_error_check2() below for the second part. 19866dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 19876dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param ctx GL context. 19886dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param dimensions texture image dimensions (must be 1, 2 or 3). 19896dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param target texture target given by the user. 19906dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \param level image level given by the user. 19916dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * 19926dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell * \return GL_TRUE if an error was detected, or GL_FALSE if no errors. 19936dc85575000127630489b407c50a4b3ea87c9acbKeith Whitwell */ 1994c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paulstatic GLboolean 1995f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcopytexsubimage_error_check1( struct gl_context *ctx, GLuint dimensions, 19969dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul GLenum target, GLint level) 1997c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 199834bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul /* Check that the source buffer is complete */ 199934bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul if (ctx->ReadBuffer->Name) { 2000b0fceae22f008f3963a392ebd57d7d2a095a5e05Brian Paul if (ctx->ReadBuffer->_Status == 0) { 2001b0fceae22f008f3963a392ebd57d7d2a095a5e05Brian Paul _mesa_test_framebuffer_completeness(ctx, ctx->ReadBuffer); 2002b0fceae22f008f3963a392ebd57d7d2a095a5e05Brian Paul } 200334bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) { 200434bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT, 200534bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul "glCopyTexImage%dD(invalid readbuffer)", dimensions); 200634bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul return GL_TRUE; 200734bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul } 200834bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul } 200934bd1233a9874fe12a822c4fcb926d48456e1f29Brian Paul 20101c23b860cea93534f726d2a18658444f37f43538Brian Paul /* check target (proxies not allowed) */ 201109a5e028a6d254f619132e302a96c8535018603dBrian Paul if (!legal_texsubimage_target(ctx, dimensions, target)) { 20121c23b860cea93534f726d2a18658444f37f43538Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glCopyTexSubImage%uD(target=%s)", 20131c23b860cea93534f726d2a18658444f37f43538Brian Paul dimensions, _mesa_lookup_enum_by_nr(target)); 20141c23b860cea93534f726d2a18658444f37f43538Brian Paul return GL_TRUE; 2015c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2016c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2017738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* Check level */ 2018738318bb75dea8dac4465f53850987f6062a732dBrian Paul if (level < 0 || level >= MAX_TEXTURE_LEVELS) { 20194e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20204e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(level=%d)", dimensions, level); 2021c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2022c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2023c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 20245ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell return GL_FALSE; 20255ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell} 20265ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 20279dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul 20289dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul/** 20299dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * Second part of error checking for glCopyTexSubImage[12]D(). 20309dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * \param xoffset sub-image x offset given by the user. 20319dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * \param yoffset sub-image y offset given by the user. 20329dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * \param zoffset sub-image z offset given by the user. 20339dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * \param width image width given by the user. 20349dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul * \param height image height given by the user. 20359dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul */ 20365ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwellstatic GLboolean 2037f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcopytexsubimage_error_check2( struct gl_context *ctx, GLuint dimensions, 20385ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLenum target, GLint level, 20395ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLint xoffset, GLint yoffset, GLint zoffset, 20405ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell GLsizei width, GLsizei height, 20415ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell const struct gl_texture_image *teximage ) 20425ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell{ 20439dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul /* check that dest tex image exists */ 2044c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (!teximage) { 20454e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 2046b9f75444e60477e7a523e7eec1bb49a8232fd4e7Brian Paul "glCopyTexSubImage%dD(undefined texture level: %d)", 2047b9f75444e60477e7a523e7eec1bb49a8232fd4e7Brian Paul dimensions, level); 2048c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2049c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2050c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 20519dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul /* Check size */ 20529dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul if (width < 0) { 20539dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20549dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul "glCopyTexSubImage%dD(width=%d)", dimensions, width); 20559dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul return GL_TRUE; 20569dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul } 20579dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul if (dimensions > 1 && height < 0) { 20589dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20599dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul "glCopyTexSubImage%dD(height=%d)", dimensions, height); 20609dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul return GL_TRUE; 20619dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul } 20629dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul 20639dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul /* check x/y offsets */ 2064c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (xoffset < -((GLint)teximage->Border)) { 20654e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20664e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(xoffset=%d)", dimensions, xoffset); 2067c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2068c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 206938f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes if (xoffset + width > (GLint) (teximage->Width + teximage->Border)) { 20704e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20714e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(xoffset+width)", dimensions); 2072c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2073c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2074c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 1) { 2075c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (yoffset < -((GLint)teximage->Border)) { 20764e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20774e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(yoffset=%d)", dimensions, yoffset); 2078c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2079c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2080c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* NOTE: we're adding the border here, not subtracting! */ 208138f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes if (yoffset + height > (GLint) (teximage->Height + teximage->Border)) { 20824e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20834e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(yoffset+height)", dimensions); 2084c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2085c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2086c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2087c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 20889dfd54fa83f9d2266ee637721365f8922deb17fcBrian Paul /* check z offset */ 2089c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (dimensions > 2) { 2090c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul if (zoffset < -((GLint)teximage->Border)) { 20914e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20924e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(zoffset)", dimensions); 2093c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2094c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 209538f28665bf9fb5b2464738ca5074848ec2777ae1Gareth Hughes if (zoffset > (GLint) (teximage->Depth + teximage->Border)) { 20964e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 20974e9676fb13f60ecdbc247b120031f18cd3febcb0Brian Paul "glCopyTexSubImage%dD(zoffset+depth)", dimensions); 2098c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_TRUE; 2099c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2100c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2101c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2102b6bdafdf2cf1110b4a5ca7cf9e1c3dcb124b800fBrian Paul if (_mesa_is_format_compressed(teximage->TexFormat)) { 2103d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu if (compressedteximage_only_format(ctx, teximage->InternalFormat)) { 2104d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu _mesa_error(ctx, GL_INVALID_OPERATION, 2105d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu "glCopyTexSubImage%dD(no compression for format)", dimensions); 2106d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu return GL_TRUE; 2107d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu } 210889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* offset must be multiple of 4 */ 210989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if ((xoffset & 3) || (yoffset & 3)) { 211089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 21118978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee "glCopyTexSubImage%dD(xoffset or yoffset)", dimensions); 2112e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul return GL_TRUE; 2113e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul } 211489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* size must be multiple of 4 */ 2115798d83cf67098a7df293c711e0d2c8c296fc4c8fKarl Schultz if ((width & 3) != 0 && (GLuint) width != teximage->Width) { 211689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 21178978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee "glCopyTexSubImage%dD(width)", dimensions); 2118e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul return GL_TRUE; 211989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 2120798d83cf67098a7df293c711e0d2c8c296fc4c8fKarl Schultz if ((height & 3) != 0 && (GLuint) height != teximage->Height) { 212189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, 21228978e45e50118d0e3660fdd9cd58b8790c0a6bb8Vinson Lee "glCopyTexSubImage%dD(height)", dimensions); 212389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_TRUE; 212489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 2125e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul } 2126e4276667dafc8de0c6e64af8300fc7598437de6eBrian Paul 2127a9fc8ba756dd25a07dc19058fe60f65bda82a055Brian Paul if (teximage->InternalFormat == GL_YCBCR_MESA) { 2128d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glCopyTexSubImage2D"); 2129d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul return GL_TRUE; 2130d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul } 2131d8419c730e73c3be2eadfb0bee176ab06885766aBrian Paul 2132985a2eff82111e81f70b6dea9d9b3184dd0061d3Alan Hourihane if (!_mesa_source_buffer_exists(ctx, teximage->_BaseFormat)) { 2133985a2eff82111e81f70b6dea9d9b3184dd0061d3Alan Hourihane _mesa_error(ctx, GL_INVALID_OPERATION, 2134803504e69fbd85713fc6d93af21f5245852cecabBrian Paul "glCopyTexSubImage%dD(missing readbuffer, format=0x%x)", 2135803504e69fbd85713fc6d93af21f5245852cecabBrian Paul dimensions, teximage->_BaseFormat); 2136985a2eff82111e81f70b6dea9d9b3184dd0061d3Alan Hourihane return GL_TRUE; 2137985a2eff82111e81f70b6dea9d9b3184dd0061d3Alan Hourihane } 2138985a2eff82111e81f70b6dea9d9b3184dd0061d3Alan Hourihane 2139326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul /* If copying into an integer texture, the source buffer must also be 2140326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul * integer-valued. 2141326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul */ 2142412b9608838b872bc294569b3ee913343a7e66f6Brian Paul if (_mesa_is_format_integer_color(teximage->TexFormat)) { 2143326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer; 2144412b9608838b872bc294569b3ee913343a7e66f6Brian Paul if (!_mesa_is_format_integer_color(rb->Format)) { 2145326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 2146326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul "glCopyTexSubImage%dD(source buffer is not integer format)", 2147326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul dimensions); 2148326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul return GL_TRUE; 2149326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul } 2150326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul } 2151326b981d3fafbf0cc253d2b224f0c9ad307038a3Brian Paul 2152c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul /* if we get here, the parameters are OK */ 2153c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul return GL_FALSE; 2154c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2155c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2156c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 21572897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul/** Callback info for walking over FBO hash table */ 21582897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paulstruct cb_info 21592897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul{ 2160f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx; 21612897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul struct gl_texture_object *texObj; 21622897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul GLuint level, face; 21632897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul}; 21642897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul 21658e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul 2166519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul/** 21672897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul * Check render to texture callback. Called from _mesa_HashWalk(). 2168519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul */ 2169519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paulstatic void 21702897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paulcheck_rtt_cb(GLuint key, void *data, void *userData) 2171519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul{ 21722897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul struct gl_framebuffer *fb = (struct gl_framebuffer *) data; 21732897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul const struct cb_info *info = (struct cb_info *) userData; 2174f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg struct gl_context *ctx = info->ctx; 21752897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul const struct gl_texture_object *texObj = info->texObj; 21762897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul const GLuint level = info->level, face = info->face; 21772897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul 21782897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul /* If this is a user-created FBO */ 21792897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul if (fb->Name) { 2180519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul GLuint i; 21812897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul /* check if any of the FBO's attachments point to 'texObj' */ 2182519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul for (i = 0; i < BUFFER_COUNT; i++) { 21832897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul struct gl_renderbuffer_attachment *att = fb->Attachment + i; 2184519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul if (att->Type == GL_TEXTURE && 2185519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul att->Texture == texObj && 2186519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul att->TextureLevel == level && 2187519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul att->CubeMapFace == face) { 2188db0f9e701d59dcfcd3b50f4d245897692f27fec9Brian Paul ASSERT(_mesa_get_attachment_teximage(att)); 2189519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul /* Tell driver about the new renderbuffer texture */ 2190ea4fe661d7f3a95d9db17e1475076f1badf8e1a6Brian Paul ctx->Driver.RenderTexture(ctx, ctx->DrawBuffer, att); 21912897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul /* Mark fb status as indeterminate to force re-validation */ 21922897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul fb->_Status = 0; 2193519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 2194519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 2195519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul } 2196519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul} 2197519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 2198519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 21992897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul/** 22002897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul * When a texture image is specified we have to check if it's bound to 22012897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul * any framebuffer objects (render to texture) in order to detect changes 22022897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul * in size or format since that effects FBO completeness. 22032897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul * Any FBOs rendering into the texture must be re-validated. 22042897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul */ 22052897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paulstatic void 2206f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergupdate_fbo_texture(struct gl_context *ctx, struct gl_texture_object *texObj, 22072897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul GLuint face, GLuint level) 22082897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul{ 22092897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul /* Only check this texture if it's been marked as RenderToTexture */ 22102897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul if (texObj->_RenderToTexture) { 22112897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul struct cb_info info; 22122897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul info.ctx = ctx; 22132897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul info.texObj = texObj; 22142897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul info.level = level; 22152897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul info.face = face; 22162897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul _mesa_HashWalk(ctx->Shared->FrameBuffers, check_rtt_cb, &info); 22172897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul } 22182897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul} 22192897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul 22202897cee99fb877e1f3cd9a881a61418c9c31867fBrian Paul 22212914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul/** 22222914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul * If the texture object's GenerateMipmap flag is set and we've 22232914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul * changed the texture base level image, regenerate the rest of the 22242914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul * mipmap levels now. 22252914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul */ 22269520f483b8f1e45fa474674b415554988de5d8d3Brian Paulstatic inline void 2227f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcheck_gen_mipmap(struct gl_context *ctx, GLenum target, 22282914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul struct gl_texture_object *texObj, GLint level) 22292914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul{ 22302914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul ASSERT(target != GL_TEXTURE_CUBE_MAP); 2231ecb03d75a2961b28ab3d90fdd5df768608fc9447Brian Paul if (texObj->GenerateMipmap && 2232ecb03d75a2961b28ab3d90fdd5df768608fc9447Brian Paul level == texObj->BaseLevel && 2233ecb03d75a2961b28ab3d90fdd5df768608fc9447Brian Paul level < texObj->MaxLevel) { 22342914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul ASSERT(ctx->Driver.GenerateMipmap); 22352914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul ctx->Driver.GenerateMipmap(ctx, target, texObj); 22362914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul } 22372914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul} 22382914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 22392914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 22401826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul/** Debug helper: override the user-requested internal format */ 22411826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paulstatic GLenum 22421826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Pauloverride_internal_format(GLenum internalFormat, GLint width, GLint height) 22431826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul{ 22441826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul#if 0 22451826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul if (internalFormat == GL_RGBA16F_ARB || 22461826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul internalFormat == GL_RGBA32F_ARB) { 22471826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul printf("Convert rgba float tex to int %d x %d\n", width, height); 22481826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul return GL_RGBA; 22491826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul } 22501826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul else if (internalFormat == GL_RGB16F_ARB || 22511826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul internalFormat == GL_RGB32F_ARB) { 22521826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul printf("Convert rgb float tex to int %d x %d\n", width, height); 22531826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul return GL_RGB; 22541826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul } 22551826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul else if (internalFormat == GL_LUMINANCE_ALPHA16F_ARB || 22561826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul internalFormat == GL_LUMINANCE_ALPHA32F_ARB) { 22571826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul printf("Convert luminance float tex to int %d x %d\n", width, height); 22581826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul return GL_LUMINANCE_ALPHA; 22591826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul } 22601826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul else if (internalFormat == GL_LUMINANCE16F_ARB || 22611826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul internalFormat == GL_LUMINANCE32F_ARB) { 22621826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul printf("Convert luminance float tex to int %d x %d\n", width, height); 22631826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul return GL_LUMINANCE; 22641826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul } 22651826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul else if (internalFormat == GL_ALPHA16F_ARB || 22661826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul internalFormat == GL_ALPHA32F_ARB) { 22671826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul printf("Convert luminance float tex to int %d x %d\n", width, height); 22681826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul return GL_ALPHA; 22691826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul } 22701826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul /* 22711826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul else if (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) { 22721826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul internalFormat = GL_RGBA; 22731826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul } 22741826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul */ 22751826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul else { 22761826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul return internalFormat; 22771826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul } 22781826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul#else 22791826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul return internalFormat; 22801826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul#endif 22811826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul} 22821826ff3fb34e9fb19bc8d8dee2cce5280da5e069Brian Paul 2283519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 2284bab484a59b21fff84579a492d079d46e27d486ddBrian Paul/** 2285bab484a59b21fff84579a492d079d46e27d486ddBrian Paul * Choose the actual hardware format for a texture image. 2286bab484a59b21fff84579a492d079d46e27d486ddBrian Paul * Try to use the same format as the previous image level when possible. 2287bab484a59b21fff84579a492d079d46e27d486ddBrian Paul * Otherwise, ask the driver for the best format. 2288bab484a59b21fff84579a492d079d46e27d486ddBrian Paul * It's important to try to choose a consistant format for all levels 2289bab484a59b21fff84579a492d079d46e27d486ddBrian Paul * for efficient texture memory layout/allocation. In particular, this 2290bab484a59b21fff84579a492d079d46e27d486ddBrian Paul * comes up during automatic mipmap generation. 2291bab484a59b21fff84579a492d079d46e27d486ddBrian Paul */ 229283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paulgl_format 2293f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg_mesa_choose_texture_format(struct gl_context *ctx, 2294bab484a59b21fff84579a492d079d46e27d486ddBrian Paul struct gl_texture_object *texObj, 2295bab484a59b21fff84579a492d079d46e27d486ddBrian Paul GLenum target, GLint level, 2296bab484a59b21fff84579a492d079d46e27d486ddBrian Paul GLenum internalFormat, GLenum format, GLenum type) 2297bab484a59b21fff84579a492d079d46e27d486ddBrian Paul{ 229883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul gl_format f; 229983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul 2300bab484a59b21fff84579a492d079d46e27d486ddBrian Paul /* see if we've already chosen a format for the previous level */ 2301bab484a59b21fff84579a492d079d46e27d486ddBrian Paul if (level > 0) { 2302bab484a59b21fff84579a492d079d46e27d486ddBrian Paul struct gl_texture_image *prevImage = 2303bab484a59b21fff84579a492d079d46e27d486ddBrian Paul _mesa_select_tex_image(ctx, texObj, target, level - 1); 2304bab484a59b21fff84579a492d079d46e27d486ddBrian Paul /* See if the prev level is defined and has an internal format which 2305bab484a59b21fff84579a492d079d46e27d486ddBrian Paul * matches the new internal format. 2306bab484a59b21fff84579a492d079d46e27d486ddBrian Paul */ 2307bab484a59b21fff84579a492d079d46e27d486ddBrian Paul if (prevImage && 2308bab484a59b21fff84579a492d079d46e27d486ddBrian Paul prevImage->Width > 0 && 2309bab484a59b21fff84579a492d079d46e27d486ddBrian Paul prevImage->InternalFormat == internalFormat) { 2310bab484a59b21fff84579a492d079d46e27d486ddBrian Paul /* use the same format */ 231183e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul ASSERT(prevImage->TexFormat != MESA_FORMAT_NONE); 231283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul return prevImage->TexFormat; 2313bab484a59b21fff84579a492d079d46e27d486ddBrian Paul } 2314bab484a59b21fff84579a492d079d46e27d486ddBrian Paul } 2315bab484a59b21fff84579a492d079d46e27d486ddBrian Paul 2316bab484a59b21fff84579a492d079d46e27d486ddBrian Paul /* choose format from scratch */ 231783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul f = ctx->Driver.ChooseTextureFormat(ctx, internalFormat, format, type); 231883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul ASSERT(f != MESA_FORMAT_NONE); 231983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul return f; 2320bab484a59b21fff84579a492d079d46e27d486ddBrian Paul} 2321bab484a59b21fff84579a492d079d46e27d486ddBrian Paul 23229c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt/** 23239c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * Adjust pixel unpack params and image dimensions to strip off the 23249c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * texture border. 23259c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * 23269c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * Gallium and intel don't support texture borders. They've seldem been used 23279c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * and seldom been implemented correctly anyway. 23289c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * 23299c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * \param unpackNew returns the new pixel unpack parameters 23309c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt */ 23319c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholtstatic void 23329c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholtstrip_texture_border(GLint *border, 23339c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt GLint *width, GLint *height, GLint *depth, 23349c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt const struct gl_pixelstore_attrib *unpack, 23359c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt struct gl_pixelstore_attrib *unpackNew) 23369c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt{ 23379c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt assert(*border > 0); /* sanity check */ 23389c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt 23399c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt *unpackNew = *unpack; 23409c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt 23419c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt if (unpackNew->RowLength == 0) 23429c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt unpackNew->RowLength = *width; 23439c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt 23449c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt if (depth && unpackNew->ImageHeight == 0) 23459c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt unpackNew->ImageHeight = *height; 23469c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt 23479c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt unpackNew->SkipPixels += *border; 23489c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt if (height) 23499c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt unpackNew->SkipRows += *border; 23509c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt if (depth) 23519c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt unpackNew->SkipImages += *border; 23529c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt 23539c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt assert(*width >= 3); 23549c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt *width = *width - 2 * *border; 23559c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt if (height && *height >= 3) 23569c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt *height = *height - 2 * *border; 23579c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt if (depth && *depth >= 3) 23589c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt *depth = *depth - 2 * *border; 23599c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt *border = 0; 23609c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt} 2361bab484a59b21fff84579a492d079d46e27d486ddBrian Paul 2362d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul/** 2363d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul * Common code to implement all the glTexImage1D/2D/3D functions. 2364c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul */ 2365d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paulstatic void 2366d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paulteximage(struct gl_context *ctx, GLuint dims, 2367d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul GLenum target, GLint level, GLint internalFormat, 2368d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul GLsizei width, GLsizei height, GLsizei depth, 2369d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul GLint border, GLenum format, GLenum type, 2370d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul const GLvoid *pixels) 2371c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul{ 2372d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul GLboolean error; 23739c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt struct gl_pixelstore_attrib unpack_no_border; 23749c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt const struct gl_pixelstore_attrib *unpack = &ctx->Unpack; 2375d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul 2376cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2377c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 2378d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) 2379d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul _mesa_debug(ctx, "glTexImage%uD %s %d %s %d %d %d %d %s %s %p\n", 2380d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul dims, 2381d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora _mesa_lookup_enum_by_nr(target), level, 2382d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul _mesa_lookup_enum_by_nr(internalFormat), 2383d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul width, height, depth, border, 2384d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora _mesa_lookup_enum_by_nr(format), 2385d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora _mesa_lookup_enum_by_nr(type), pixels); 2386d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora 2387d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul internalFormat = override_internal_format(internalFormat, width, height); 238811caea687e3f10ae12d33e44edf84635f73047ddBrian Paul 2389d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul /* target error checking */ 2390d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul if (!legal_teximage_target(ctx, dims, target)) { 2391d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexImage%uD(target=%s)", 2392d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul dims, _mesa_lookup_enum_by_nr(target)); 2393d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul return; 2394d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul } 2395ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul 2396d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul /* general error checking */ 2397d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul error = texture_error_check(ctx, dims, target, level, internalFormat, 2398d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul format, type, width, height, depth, border); 23992914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 2400d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul if (_mesa_is_proxy_texture(target)) { 2401d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul /* Proxy texture: just clear or set state depending on error checking */ 2402d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul struct gl_texture_image *texImage = 2403d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul _mesa_get_proxy_tex_image(ctx, target, level); 240462c734f49948df7aeef55ad23a6664cbf3e11533Brian Paul 2405d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul if (error) { 2406738318bb75dea8dac4465f53850987f6062a732dBrian Paul /* when error, clear all proxy texture image parameters */ 2407a3f137094cd965d27e1b088499dd609b81a91906Brian Paul if (texImage) 2408a3f137094cd965d27e1b088499dd609b81a91906Brian Paul clear_teximage_fields(texImage); 2409c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 241089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else { 241189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* no error, set the tex image parameters */ 2412bab484a59b21fff84579a492d079d46e27d486ddBrian Paul struct gl_texture_object *texObj = 2413bab484a59b21fff84579a492d079d46e27d486ddBrian Paul _mesa_get_current_tex_object(ctx, target); 2414d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul gl_format texFormat = _mesa_choose_texture_format(ctx, texObj, 2415d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul target, level, 241683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul internalFormat, 241783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul format, type); 2418d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul 2419d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul if (legal_texture_size(ctx, texFormat, width, height, depth)) { 2420d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul _mesa_init_teximage_fields(ctx, target, texImage, width, height, 2421d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul depth, border, internalFormat, 2422d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul texFormat); 24234b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul } 24244b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul else if (texImage) { 24254b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul clear_teximage_fields(texImage); 24264b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul } 242789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 2428c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2429c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul else { 24308e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul /* non-proxy target */ 2431d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul const GLuint face = _mesa_tex_target_to_face(target); 24320293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_object *texObj; 24330293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_image *texImage; 2434f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul 2435d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul if (error) { 24368e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul return; /* error was recorded */ 2437c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul } 2438c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul 24399c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt /* Allow a hardware driver to just strip out the border, to provide 24409c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * reliable but slightly incorrect hardware rendering instead of 24419c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt * rarely-tested software fallback rendering. 24429c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt */ 24439c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt if (border && ctx->Const.StripTextureBorder) { 24449c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt strip_texture_border(&border, &width, &height, &depth, unpack, 24459c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt &unpack_no_border); 24469c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt unpack = &unpack_no_border; 24479c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt } 24489c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt 24497ecb61c30c4984a8513b306b640f9d274d8ecf61Brian Paul if (ctx->NewState & _NEW_PIXEL) 24505ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_update_state(ctx); 2451fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 2452b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul texObj = _mesa_get_current_tex_object(ctx, target); 2453d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul 24545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 24555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 24565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_get_tex_image(ctx, texObj, target, level); 2457d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul 24585ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage) { 2459d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims); 24605ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 2461ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul else { 246283e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul gl_format texFormat; 246383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul 246468f8cf72638e974a5bf2ae3e88c2e3539d88e2b6Eric Anholt ctx->Driver.FreeTextureImageBuffer(ctx, texImage); 2465ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul 246683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul texFormat = _mesa_choose_texture_format(ctx, texObj, target, level, 246783e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul internalFormat, format, 246883e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul type); 246983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul 2470d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul if (legal_texture_size(ctx, texFormat, width, height, depth)) { 2471d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul _mesa_init_teximage_fields(ctx, target, texImage, 2472d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul width, height, depth, 2473d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul border, internalFormat, texFormat); 247411caea687e3f10ae12d33e44edf84635f73047ddBrian Paul 24754b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul /* Give the texture to the driver. <pixels> may be null. */ 2476d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul ASSERT(ctx->Driver.TexImage3D); 2477d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul switch (dims) { 2478d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case 1: 2479d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul ctx->Driver.TexImage1D(ctx, target, level, internalFormat, 2480d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul width, border, format, 24819c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt type, pixels, unpack, texObj, 2482d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul texImage); 2483d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul break; 2484d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case 2: 2485d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul ctx->Driver.TexImage2D(ctx, target, level, internalFormat, 2486d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul width, height, border, format, 24879c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt type, pixels, unpack, texObj, 2488d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul texImage); 2489d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul break; 2490d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul case 3: 2491d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul ctx->Driver.TexImage3D(ctx, target, level, internalFormat, 2492d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul width, height, depth, border, format, 24939c4b02528752eb6392009e41025202fc9f9ca5b3Eric Anholt type, pixels, unpack, texObj, 2494d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul texImage); 2495d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul break; 2496d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul default: 2497d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul _mesa_problem(ctx, "invalid dims=%u in teximage()", dims); 2498d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul } 2499ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul 25004b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul check_gen_mipmap(ctx, target, texObj, level); 25012914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 25024b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul update_fbo_texture(ctx, texObj, face, level); 2503ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul 25044b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul /* state update */ 25054b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul texObj->_Complete = GL_FALSE; 25064b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul ctx->NewState |= _NEW_TEXTURE; 25074b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul } 25084b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul else { 2509d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexImage%uD", dims); 25104b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul } 2511ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul } 2512ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul } 25135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2514afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2515d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul} 2516d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul 2517d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul 2518d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul/* 2519d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul * Called from the API. Note that width includes the border. 2520d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul */ 2521d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paulvoid GLAPIENTRY 2522d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul_mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat, 2523d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul GLsizei width, GLint border, GLenum format, 2524d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul GLenum type, const GLvoid *pixels ) 2525d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul{ 2526d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul GET_CURRENT_CONTEXT(ctx); 2527d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul teximage(ctx, 1, target, level, internalFormat, width, 1, 1, 2528d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul border, format, type, pixels); 2529d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul} 2530d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul 2531d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul 2532d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paulvoid GLAPIENTRY 2533d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul_mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat, 2534d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul GLsizei width, GLsizei height, GLint border, 2535d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul GLenum format, GLenum type, 2536d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul const GLvoid *pixels ) 2537d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul{ 2538d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul GET_CURRENT_CONTEXT(ctx); 2539d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul teximage(ctx, 2, target, level, internalFormat, width, height, 1, 2540d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul border, format, type, pixels); 2541afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2542afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2543afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2544afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg/* 2545afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Called by the API or display list executor. 2546afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg * Note that width and height include the border. 2547afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg */ 2548c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2549b5fd886ee12ef52126969f712dee0bd4b2eea706Brian Paul_mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat, 2550fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLsizei height, GLsizei depth, 2551fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint border, GLenum format, GLenum type, 2552fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLvoid *pixels ) 2553afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 2554fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 2555d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul teximage(ctx, 3, target, level, internalFormat, width, height, depth, 2556d0b2b8da7d363f6b79fcab7bfe6e81d1d436944eBrian Paul border, format, type, pixels); 2557afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2558afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2559afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2560c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 256143911c8ef06c44d486a17cf9a8fa8ea263b08adeBrian Paul_mesa_TexImage3DEXT( GLenum target, GLint level, GLenum internalFormat, 2562663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul GLsizei width, GLsizei height, GLsizei depth, 2563663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul GLint border, GLenum format, GLenum type, 2564663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul const GLvoid *pixels ) 2565663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul{ 256689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul _mesa_TexImage3D(target, level, (GLint) internalFormat, width, height, 2567663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul depth, border, format, type, pixels); 2568663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul} 2569663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul 2570663049a719ed76aa0a6f24f1951a411d241bc8a4Brian Paul 2571d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg#if FEATURE_OES_EGL_image 2572d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsbergvoid GLAPIENTRY 2573d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg_mesa_EGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image) 2574d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg{ 2575d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg struct gl_texture_object *texObj; 2576d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg struct gl_texture_image *texImage; 257717efc8c05c6931a4638ee9f6138794f2b2b29540Vinson Lee GET_CURRENT_CONTEXT(ctx); 257817efc8c05c6931a4638ee9f6138794f2b2b29540Vinson Lee ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2579d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg 25800c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu if ((target == GL_TEXTURE_2D && 25810c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu !ctx->Extensions.OES_EGL_image) || 25820c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu (target == GL_TEXTURE_EXTERNAL_OES && 25830c87f16817ff0bf1f05e0d634944fd47b097faeeChia-I Wu !ctx->Extensions.OES_EGL_image_external)) { 2584d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg _mesa_error(ctx, GL_INVALID_ENUM, 2585d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg "glEGLImageTargetTexture2D(target=%d)", target); 2586d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg return; 2587d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg } 2588d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg 25897ecb61c30c4984a8513b306b640f9d274d8ecf61Brian Paul if (ctx->NewState & _NEW_PIXEL) 2590d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg _mesa_update_state(ctx); 2591d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg 2592d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg texObj = _mesa_get_current_tex_object(ctx, target); 2593d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg _mesa_lock_texture(ctx, texObj); 2594d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg 2595d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg texImage = _mesa_get_tex_image(ctx, texObj, target, 0); 2596d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg if (!texImage) { 2597d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg _mesa_error(ctx, GL_OUT_OF_MEMORY, "glEGLImageTargetTexture2D"); 2598d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg } else { 259968f8cf72638e974a5bf2ae3e88c2e3539d88e2b6Eric Anholt ctx->Driver.FreeTextureImageBuffer(ctx, texImage); 2600d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg 2601d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg ctx->Driver.EGLImageTargetTexture2D(ctx, target, 2602d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg texObj, texImage, image); 2603d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg 2604d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg /* state update */ 2605d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg texObj->_Complete = GL_FALSE; 2606d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg ctx->NewState |= _NEW_TEXTURE; 2607d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg } 2608d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg _mesa_unlock_texture(ctx, texObj); 2609d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg 2610d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg} 2611d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg#endif 2612d1dc5b124e133379be5bb57b68733c09c0e04f71Kristian Høgsberg 2613afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 261445124e043da5a67e1081526d61b99422f4ccde19Brian Paul 261545124e043da5a67e1081526d61b99422f4ccde19Brian Paul/** 261645124e043da5a67e1081526d61b99422f4ccde19Brian Paul * Implement all the glTexSubImage1/2/3D() functions. 261745124e043da5a67e1081526d61b99422f4ccde19Brian Paul */ 261845124e043da5a67e1081526d61b99422f4ccde19Brian Paulstatic void 261945124e043da5a67e1081526d61b99422f4ccde19Brian Paultexsubimage(struct gl_context *ctx, GLuint dims, GLenum target, GLint level, 262045124e043da5a67e1081526d61b99422f4ccde19Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 262145124e043da5a67e1081526d61b99422f4ccde19Brian Paul GLsizei width, GLsizei height, GLsizei depth, 262245124e043da5a67e1081526d61b99422f4ccde19Brian Paul GLenum format, GLenum type, const GLvoid *pixels ) 2623afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 26240293878846551bfe349a4aa029a0489f9a73f1ffBrian Paul struct gl_texture_object *texObj; 2625b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul struct gl_texture_image *texImage; 262645124e043da5a67e1081526d61b99422f4ccde19Brian Paul 262775280a2c742ee241d392618a3b29548fce1520a9Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 262875280a2c742ee241d392618a3b29548fce1520a9Brian Paul 2629d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) 263045124e043da5a67e1081526d61b99422f4ccde19Brian Paul _mesa_debug(ctx, "glTexSubImage%uD %s %d %d %d %d %d %d %d %s %s %p\n", 263145124e043da5a67e1081526d61b99422f4ccde19Brian Paul dims, 2632d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora _mesa_lookup_enum_by_nr(target), level, 263345124e043da5a67e1081526d61b99422f4ccde19Brian Paul xoffset, yoffset, zoffset, width, height, depth, 263445124e043da5a67e1081526d61b99422f4ccde19Brian Paul _mesa_lookup_enum_by_nr(format), 2635d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora _mesa_lookup_enum_by_nr(type), pixels); 2636d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora 263745124e043da5a67e1081526d61b99422f4ccde19Brian Paul /* check target (proxies not allowed) */ 263809a5e028a6d254f619132e302a96c8535018603dBrian Paul if (!legal_texsubimage_target(ctx, dims, target)) { 263945124e043da5a67e1081526d61b99422f4ccde19Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexSubImage%uD(target=%s)", 264045124e043da5a67e1081526d61b99422f4ccde19Brian Paul dims, _mesa_lookup_enum_by_nr(target)); 264145124e043da5a67e1081526d61b99422f4ccde19Brian Paul return; 264245124e043da5a67e1081526d61b99422f4ccde19Brian Paul } 264345124e043da5a67e1081526d61b99422f4ccde19Brian Paul 26447ecb61c30c4984a8513b306b640f9d274d8ecf61Brian Paul if (ctx->NewState & _NEW_PIXEL) 264508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_update_state(ctx); 26462aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul 264745124e043da5a67e1081526d61b99422f4ccde19Brian Paul if (subtexture_error_check(ctx, dims, target, level, xoffset, yoffset, zoffset, 264845124e043da5a67e1081526d61b99422f4ccde19Brian Paul width, height, depth, format, type)) { 2649f7b5707d66678f09bec652ecce024a0da6cc4a4bBrian Paul return; /* error was detected */ 2650afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg } 2651afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2652b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul texObj = _mesa_get_current_tex_object(ctx, target); 2653afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 26545ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 26555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 26565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 2657afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 265845124e043da5a67e1081526d61b99422f4ccde19Brian Paul if (subtexture_error_check2(ctx, dims, target, level, 265945124e043da5a67e1081526d61b99422f4ccde19Brian Paul xoffset, yoffset, zoffset, 266045124e043da5a67e1081526d61b99422f4ccde19Brian Paul width, height, depth, 266145124e043da5a67e1081526d61b99422f4ccde19Brian Paul format, type, texImage)) { 2662a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul /* error was recorded */ 26635ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 26644609e80288bacf19af99b0ed7656eef9bb280912Brian Paul else if (width > 0 && height > 0 && depth > 0) { 266545124e043da5a67e1081526d61b99422f4ccde19Brian Paul /* If we have a border, offset=-1 is legal. Bias by border width. */ 266645124e043da5a67e1081526d61b99422f4ccde19Brian Paul switch (dims) { 266745124e043da5a67e1081526d61b99422f4ccde19Brian Paul case 3: 266845124e043da5a67e1081526d61b99422f4ccde19Brian Paul zoffset += texImage->Border; 266945124e043da5a67e1081526d61b99422f4ccde19Brian Paul /* fall-through */ 267045124e043da5a67e1081526d61b99422f4ccde19Brian Paul case 2: 267145124e043da5a67e1081526d61b99422f4ccde19Brian Paul yoffset += texImage->Border; 267245124e043da5a67e1081526d61b99422f4ccde19Brian Paul /* fall-through */ 267345124e043da5a67e1081526d61b99422f4ccde19Brian Paul case 1: 267445124e043da5a67e1081526d61b99422f4ccde19Brian Paul xoffset += texImage->Border; 267545124e043da5a67e1081526d61b99422f4ccde19Brian Paul } 2676347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul 267745124e043da5a67e1081526d61b99422f4ccde19Brian Paul switch (dims) { 267845124e043da5a67e1081526d61b99422f4ccde19Brian Paul case 1: 267945124e043da5a67e1081526d61b99422f4ccde19Brian Paul ctx->Driver.TexSubImage1D(ctx, target, level, 268045124e043da5a67e1081526d61b99422f4ccde19Brian Paul xoffset, width, 268145124e043da5a67e1081526d61b99422f4ccde19Brian Paul format, type, pixels, 268245124e043da5a67e1081526d61b99422f4ccde19Brian Paul &ctx->Unpack, texObj, texImage ); 268345124e043da5a67e1081526d61b99422f4ccde19Brian Paul break; 268445124e043da5a67e1081526d61b99422f4ccde19Brian Paul case 2: 268545124e043da5a67e1081526d61b99422f4ccde19Brian Paul ctx->Driver.TexSubImage2D(ctx, target, level, 268645124e043da5a67e1081526d61b99422f4ccde19Brian Paul xoffset, yoffset, width, height, 268745124e043da5a67e1081526d61b99422f4ccde19Brian Paul format, type, pixels, 268845124e043da5a67e1081526d61b99422f4ccde19Brian Paul &ctx->Unpack, texObj, texImage ); 268945124e043da5a67e1081526d61b99422f4ccde19Brian Paul break; 269045124e043da5a67e1081526d61b99422f4ccde19Brian Paul case 3: 269145124e043da5a67e1081526d61b99422f4ccde19Brian Paul ctx->Driver.TexSubImage3D(ctx, target, level, 269245124e043da5a67e1081526d61b99422f4ccde19Brian Paul xoffset, yoffset, zoffset, 269345124e043da5a67e1081526d61b99422f4ccde19Brian Paul width, height, depth, 269445124e043da5a67e1081526d61b99422f4ccde19Brian Paul format, type, pixels, 269545124e043da5a67e1081526d61b99422f4ccde19Brian Paul &ctx->Unpack, texObj, texImage ); 269645124e043da5a67e1081526d61b99422f4ccde19Brian Paul break; 269745124e043da5a67e1081526d61b99422f4ccde19Brian Paul default: 269845124e043da5a67e1081526d61b99422f4ccde19Brian Paul _mesa_problem(ctx, "unexpected dims in subteximage()"); 269945124e043da5a67e1081526d61b99422f4ccde19Brian Paul } 27002914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 27012914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul check_gen_mipmap(ctx, target, texObj, level); 27022914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 2703ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul ctx->NewState |= _NEW_TEXTURE; 2704ecf6f37fc201d7c88f8214b04ca1f61071c460a1Brian Paul } 27055ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 27065ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2707afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2708afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2709afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2710c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 271145124e043da5a67e1081526d61b99422f4ccde19Brian Paul_mesa_TexSubImage1D( GLenum target, GLint level, 271245124e043da5a67e1081526d61b99422f4ccde19Brian Paul GLint xoffset, GLsizei width, 271345124e043da5a67e1081526d61b99422f4ccde19Brian Paul GLenum format, GLenum type, 271445124e043da5a67e1081526d61b99422f4ccde19Brian Paul const GLvoid *pixels ) 271545124e043da5a67e1081526d61b99422f4ccde19Brian Paul{ 271645124e043da5a67e1081526d61b99422f4ccde19Brian Paul GET_CURRENT_CONTEXT(ctx); 271745124e043da5a67e1081526d61b99422f4ccde19Brian Paul texsubimage(ctx, 1, target, level, 271845124e043da5a67e1081526d61b99422f4ccde19Brian Paul xoffset, 0, 0, 271945124e043da5a67e1081526d61b99422f4ccde19Brian Paul width, 1, 1, 272045124e043da5a67e1081526d61b99422f4ccde19Brian Paul format, type, pixels); 272145124e043da5a67e1081526d61b99422f4ccde19Brian Paul} 272245124e043da5a67e1081526d61b99422f4ccde19Brian Paul 272345124e043da5a67e1081526d61b99422f4ccde19Brian Paul 272445124e043da5a67e1081526d61b99422f4ccde19Brian Paulvoid GLAPIENTRY 2725fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_TexSubImage2D( GLenum target, GLint level, 2726fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLint yoffset, 2727fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLsizei height, 2728fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum format, GLenum type, 2729fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLvoid *pixels ) 2730afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 27312c3d34c905fa6b831a066afae83b938de05eb241Gareth Hughes GET_CURRENT_CONTEXT(ctx); 273245124e043da5a67e1081526d61b99422f4ccde19Brian Paul texsubimage(ctx, 2, target, level, 273345124e043da5a67e1081526d61b99422f4ccde19Brian Paul xoffset, yoffset, 0, 273445124e043da5a67e1081526d61b99422f4ccde19Brian Paul width, height, 1, 273545124e043da5a67e1081526d61b99422f4ccde19Brian Paul format, type, pixels); 2736c3f0a511a725c7b3d3d7d93b1955aaaa2bb32f0dBrian Paul} 2737afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2738afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2739afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2740c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2741fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_TexSubImage3D( GLenum target, GLint level, 2742fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 2743fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLsizei width, GLsizei height, GLsizei depth, 2744fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLenum format, GLenum type, 2745fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul const GLvoid *pixels ) 2746afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 27472c3d34c905fa6b831a066afae83b938de05eb241Gareth Hughes GET_CURRENT_CONTEXT(ctx); 274845124e043da5a67e1081526d61b99422f4ccde19Brian Paul texsubimage(ctx, 3, target, level, 274945124e043da5a67e1081526d61b99422f4ccde19Brian Paul xoffset, yoffset, zoffset, 275045124e043da5a67e1081526d61b99422f4ccde19Brian Paul width, height, depth, 275145124e043da5a67e1081526d61b99422f4ccde19Brian Paul format, type, pixels); 2752afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2753afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2754afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2755afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 275611f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul/** 275711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul * Implement the glCopyTexImage1/2D() functions. 275811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul */ 275911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paulstatic void 276011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paulcopyteximage(struct gl_context *ctx, GLuint dims, 276111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul GLenum target, GLint level, GLenum internalFormat, 276211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul GLint x, GLint y, GLsizei width, GLsizei height, GLint border ) 2763afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 27642aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul struct gl_texture_object *texObj; 27652aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul struct gl_texture_image *texImage; 2766e93243f8b7d43695654a36334c8cc5cea140d23cBrian const GLuint face = _mesa_tex_target_to_face(target); 276711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul 2768cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2769afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2770d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) 277111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul _mesa_debug(ctx, "glCopyTexImage%uD %s %d %s %d %d %d %d %d\n", 277211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul dims, 2773d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora _mesa_lookup_enum_by_nr(target), level, 2774d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora _mesa_lookup_enum_by_nr(internalFormat), 277511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul x, y, width, height, border); 2776d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora 277763f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul if (ctx->NewState & NEW_COPY_TEX_STATE) 277808836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_update_state(ctx); 2779fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 278011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul if (copytexture_error_check(ctx, dims, target, level, internalFormat, 278111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul width, height, border)) 2782ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul return; 2783ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul 2784b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul texObj = _mesa_get_current_tex_object(ctx, target); 2785a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul 2786638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt if (border && ctx->Const.StripTextureBorder) { 2787638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt x += border; 2788638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt width -= border * 2; 2789638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt if (dims == 2) { 2790638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt y += border; 2791638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt height -= border * 2; 2792638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt } 2793638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt border = 0; 2794638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt } 2795638b657f838266e3d4892d06ff53a1c1bee24a9bEric Anholt 27965ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 27975ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 27985ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_get_tex_image(ctx, texObj, target, level); 279911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul 28005ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage) { 280111f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage%uD", dims); 28025ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 2803c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul else { 28045874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul /* choose actual hw format */ 28055874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul gl_format texFormat = _mesa_choose_texture_format(ctx, texObj, 28065874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul target, level, 28075874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul internalFormat, 28085874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul GL_NONE, GL_NONE); 28097dac13272a959654f1010b80c1f1ec6dcae5a4faBrian Paul 28105874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul if (legal_texture_size(ctx, texFormat, width, height, 1)) { 28115874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul GLint srcX = x, srcY = y, dstX = 0, dstY = 0; 28127dac13272a959654f1010b80c1f1ec6dcae5a4faBrian Paul 28135874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul /* Free old texture image */ 28140bb29949ba8a9e5a15dc0640dbb0a4e7990a1d57Eric Anholt ctx->Driver.FreeTextureImageBuffer(ctx, texImage); 28152aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul 281611f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul _mesa_init_teximage_fields(ctx, target, texImage, width, height, 1, 28174b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul border, internalFormat, texFormat); 281811caea687e3f10ae12d33e44edf84635f73047ddBrian Paul 28195874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul /* Allocate texture memory (no pixel data yet) */ 28205874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul if (dims == 1) { 28215874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul ctx->Driver.TexImage1D(ctx, target, level, internalFormat, 28225874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul width, border, GL_NONE, GL_NONE, NULL, 28235874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul &ctx->Unpack, texObj, texImage); 28245874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul } 28255874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul else { 28265874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul ctx->Driver.TexImage2D(ctx, target, level, internalFormat, 28275874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul width, height, border, GL_NONE, GL_NONE, 28285874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul NULL, &ctx->Unpack, texObj, texImage); 28295874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul } 28305874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul 28315874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul if (_mesa_clip_copytexsubimage(ctx, &dstX, &dstY, &srcX, &srcY, 28325874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul &width, &height)) { 28335874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul if (dims == 1) 28345874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul ctx->Driver.CopyTexSubImage1D(ctx, target, level, dstX, 28355874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul srcX, srcY, width); 28365874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul 28375874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul else 28385874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul ctx->Driver.CopyTexSubImage2D(ctx, target, level, dstX, dstY, 28395874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul srcX, srcY, width, height); 28405874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul } 28412aadbf41dfd4f63c6118d0ad2d8659d289cbe454Brian Paul 28424b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul check_gen_mipmap(ctx, target, texObj, level); 28432914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 28444b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul update_fbo_texture(ctx, texObj, face, level); 2845519b23b21f9cd6945fd17cdb26e7a6f531cdeec0Brian Paul 28464b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul /* state update */ 28474b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul texObj->_Complete = GL_FALSE; 28484b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul ctx->NewState |= _NEW_TEXTURE; 28494b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul } 28504b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul else { 28515874890c26f434f54e9218b83fae4eb8175c24e9Brian Paul /* probably too large of image */ 285211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage%uD", dims); 28534b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul } 2854c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul } 28555ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 28565ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2857afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2858afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2859afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2860afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2861c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 286211f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul_mesa_CopyTexImage1D( GLenum target, GLint level, 286311f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul GLenum internalFormat, 286411f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul GLint x, GLint y, 286511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul GLsizei width, GLint border ) 2866afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 2867fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 286811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul copyteximage(ctx, 1, target, level, internalFormat, x, y, width, 1, border); 286911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul} 2870c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul 28712914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 2872c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul 287311f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paulvoid GLAPIENTRY 287411f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul_mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat, 287511f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul GLint x, GLint y, GLsizei width, GLsizei height, 287611f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul GLint border ) 287711f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul{ 287811f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul GET_CURRENT_CONTEXT(ctx); 287911f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul copyteximage(ctx, 2, target, level, internalFormat, 288011f386fb504b9f07dd501a65f31185cfa0e9a679Brian Paul x, y, width, height, border); 2881afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2882afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2883afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 28841c23b860cea93534f726d2a18658444f37f43538Brian Paul 28851c23b860cea93534f726d2a18658444f37f43538Brian Paul/** 28861c23b860cea93534f726d2a18658444f37f43538Brian Paul * Implementation for glCopyTexSubImage1/2/3D() functions. 28871c23b860cea93534f726d2a18658444f37f43538Brian Paul */ 28881c23b860cea93534f726d2a18658444f37f43538Brian Paulstatic void 28891c23b860cea93534f726d2a18658444f37f43538Brian Paulcopytexsubimage(struct gl_context *ctx, GLuint dims, GLenum target, GLint level, 28901c23b860cea93534f726d2a18658444f37f43538Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 28911c23b860cea93534f726d2a18658444f37f43538Brian Paul GLint x, GLint y, GLsizei width, GLsizei height) 2892afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 28935ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell struct gl_texture_object *texObj; 2894347b3f0dafe8d0cc30e9d1e7595d12b0ac31bb4aBrian Paul struct gl_texture_image *texImage; 289503bafd1f9fa000abdb794b2ae344a68840c83201Brian 2896cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2897afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2898d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) 28991c23b860cea93534f726d2a18658444f37f43538Brian Paul _mesa_debug(ctx, "glCopyTexSubImage%uD %s %d %d %d %d %d %d %d %d\n", 29001c23b860cea93534f726d2a18658444f37f43538Brian Paul dims, 2901d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora _mesa_lookup_enum_by_nr(target), 29021c23b860cea93534f726d2a18658444f37f43538Brian Paul level, xoffset, yoffset, zoffset, x, y, width, height); 2903d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora 290463f01309801c5a900d8d7f5ccd63413e33ff9bffBrian Paul if (ctx->NewState & NEW_COPY_TEX_STATE) 290508836341788a9f9d638d9dc8328510ccd18ddeb5Brian Paul _mesa_update_state(ctx); 2906fa4525e289b475b928a7b2c4055af9dd7fe46600Brian Paul 29071c23b860cea93534f726d2a18658444f37f43538Brian Paul if (copytexsubimage_error_check1(ctx, dims, target, level)) 2908ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul return; 2909ab6e78f3a0abac7becbd8a58ed2c89f860cc6b0bBrian Paul 2910b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul texObj = _mesa_get_current_tex_object(ctx, target); 29115ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 29125ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 29135ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 29145ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 29155ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 29161c23b860cea93534f726d2a18658444f37f43538Brian Paul if (copytexsubimage_error_check2(ctx, dims, target, level, xoffset, yoffset, 29171c23b860cea93534f726d2a18658444f37f43538Brian Paul zoffset, width, height, texImage)) { 29181c23b860cea93534f726d2a18658444f37f43538Brian Paul /* error was recored */ 291903bafd1f9fa000abdb794b2ae344a68840c83201Brian } 2920a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul else { 29211c23b860cea93534f726d2a18658444f37f43538Brian Paul /* If we have a border, offset=-1 is legal. Bias by border width. */ 29221c23b860cea93534f726d2a18658444f37f43538Brian Paul switch (dims) { 29231c23b860cea93534f726d2a18658444f37f43538Brian Paul case 3: 29241c23b860cea93534f726d2a18658444f37f43538Brian Paul zoffset += texImage->Border; 29251c23b860cea93534f726d2a18658444f37f43538Brian Paul /* fall-through */ 29261c23b860cea93534f726d2a18658444f37f43538Brian Paul case 2: 29271c23b860cea93534f726d2a18658444f37f43538Brian Paul yoffset += texImage->Border; 29281c23b860cea93534f726d2a18658444f37f43538Brian Paul /* fall-through */ 29291c23b860cea93534f726d2a18658444f37f43538Brian Paul case 1: 29301c23b860cea93534f726d2a18658444f37f43538Brian Paul xoffset += texImage->Border; 29311c23b860cea93534f726d2a18658444f37f43538Brian Paul } 293203bafd1f9fa000abdb794b2ae344a68840c83201Brian 2933a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y, 2934a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul &width, &height)) { 29351c23b860cea93534f726d2a18658444f37f43538Brian Paul switch (dims) { 29361c23b860cea93534f726d2a18658444f37f43538Brian Paul case 1: 29371c23b860cea93534f726d2a18658444f37f43538Brian Paul ctx->Driver.CopyTexSubImage1D(ctx, target, level, 29381c23b860cea93534f726d2a18658444f37f43538Brian Paul xoffset, x, y, width); 29391c23b860cea93534f726d2a18658444f37f43538Brian Paul break; 29401c23b860cea93534f726d2a18658444f37f43538Brian Paul case 2: 29411c23b860cea93534f726d2a18658444f37f43538Brian Paul ctx->Driver.CopyTexSubImage2D(ctx, target, level, 29421c23b860cea93534f726d2a18658444f37f43538Brian Paul xoffset, yoffset, 29431c23b860cea93534f726d2a18658444f37f43538Brian Paul x, y, width, height); 29441c23b860cea93534f726d2a18658444f37f43538Brian Paul break; 29451c23b860cea93534f726d2a18658444f37f43538Brian Paul case 3: 29461c23b860cea93534f726d2a18658444f37f43538Brian Paul ctx->Driver.CopyTexSubImage3D(ctx, target, level, 29471c23b860cea93534f726d2a18658444f37f43538Brian Paul xoffset, yoffset, zoffset, 29481c23b860cea93534f726d2a18658444f37f43538Brian Paul x, y, width, height); 29491c23b860cea93534f726d2a18658444f37f43538Brian Paul break; 29501c23b860cea93534f726d2a18658444f37f43538Brian Paul default: 29511c23b860cea93534f726d2a18658444f37f43538Brian Paul _mesa_problem(ctx, "bad dims in copytexsubimage()"); 29521c23b860cea93534f726d2a18658444f37f43538Brian Paul } 29532914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 29542914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul check_gen_mipmap(ctx, target, texObj, level); 29552914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 2956a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul ctx->NewState |= _NEW_TEXTURE; 2957a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul } 2958a31ac84d743e33dabdcbbb4998fb6b7ceccf27d4Brian Paul } 29595ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 29605ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 2961afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 2962afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2963afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 29641c23b860cea93534f726d2a18658444f37f43538Brian Paulvoid GLAPIENTRY 29651c23b860cea93534f726d2a18658444f37f43538Brian Paul_mesa_CopyTexSubImage1D( GLenum target, GLint level, 29661c23b860cea93534f726d2a18658444f37f43538Brian Paul GLint xoffset, GLint x, GLint y, GLsizei width ) 29671c23b860cea93534f726d2a18658444f37f43538Brian Paul{ 29681c23b860cea93534f726d2a18658444f37f43538Brian Paul GET_CURRENT_CONTEXT(ctx); 29691c23b860cea93534f726d2a18658444f37f43538Brian Paul copytexsubimage(ctx, 1, target, level, xoffset, 0, 0, x, y, width, 1); 29701c23b860cea93534f726d2a18658444f37f43538Brian Paul} 29711c23b860cea93534f726d2a18658444f37f43538Brian Paul 29721c23b860cea93534f726d2a18658444f37f43538Brian Paul 2973afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg 2974c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 2975fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul_mesa_CopyTexSubImage2D( GLenum target, GLint level, 2976fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint xoffset, GLint yoffset, 2977fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GLint x, GLint y, GLsizei width, GLsizei height ) 2978afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg{ 2979fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 29801c23b860cea93534f726d2a18658444f37f43538Brian Paul copytexsubimage(ctx, 2, target, level, xoffset, yoffset, 0, x, y, 29811c23b860cea93534f726d2a18658444f37f43538Brian Paul width, height); 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{ 2991fbd8f212c3866ec98c1d8c9d3db3ddb7e7c479a5Brian Paul GET_CURRENT_CONTEXT(ctx); 29921c23b860cea93534f726d2a18658444f37f43538Brian Paul copytexsubimage(ctx, 3, target, level, xoffset, yoffset, zoffset, 29931c23b860cea93534f726d2a18658444f37f43538Brian Paul x, y, width, height); 2994afb833d4e89c312460a4ab9ed6a7a8ca4ebbfe1cjtg} 29951207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 29961207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 29971207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 299889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 299989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**********************************************************************/ 300089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/****** Compressed Textures ******/ 300189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/**********************************************************************/ 300289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 300389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 300489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 300554bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul * Return expected size of a compressed texture. 300654bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul */ 300754bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paulstatic GLuint 300854bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paulcompressed_tex_size(GLsizei width, GLsizei height, GLsizei depth, 300954bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul GLenum glformat) 301054bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul{ 301154bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul gl_format mesaFormat = _mesa_glenum_to_compressed_format(glformat); 301254bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul return _mesa_format_image_size(mesaFormat, width, height, depth); 301354bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul} 301454bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul 301554bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul 301607ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul/* 301707ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul * Return compressed texture block size, in pixels. 301807ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul */ 301907ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paulstatic void 302007ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paulget_compressed_block_size(GLenum glformat, GLuint *bw, GLuint *bh) 302107ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul{ 302207ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul gl_format mesaFormat = _mesa_glenum_to_compressed_format(glformat); 302307ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul _mesa_get_format_block_size(mesaFormat, bw, bh); 302407ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul} 302554bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul 302654bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul 302754bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul/** 302889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Error checking for glCompressedTexImage[123]D(). 3029d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch * \param reason returns reason for error, if any 303089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * \return error code or GL_NO_ERROR. 303189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 303289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulstatic GLenum 3033f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcompressed_texture_error_check(struct gl_context *ctx, GLint dimensions, 303489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum target, GLint level, 303589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum internalFormat, GLsizei width, 303689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei height, GLsizei depth, GLint border, 3037d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch GLsizei imageSize, char **reason) 303889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 30394ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul const GLenum proxyTarget = get_proxy_target(target); 30404ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul const GLint maxLevels = _mesa_max_texture_levels(ctx, target); 30414ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GLint expectedSize; 30423ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick GLenum choose_format; 30433ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick GLenum choose_type; 30443ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick GLenum proxy_format; 304589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3046d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch *reason = ""; /* no error */ 3047d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch 30487404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul if (!target_can_be_compressed(ctx, target, internalFormat)) { 3049d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch *reason = "target"; 30507404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul return GL_INVALID_ENUM; 30517404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul } 30527404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul 3053c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul /* This will detect any invalid internalFormat value */ 3054d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch if (!_mesa_is_compressed_format(ctx, internalFormat)) { 3055d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch *reason = "internalFormat"; 305689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; 3057d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch } 305889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 30593ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick switch (internalFormat) { 30603ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick#if FEATURE_ES 30613ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick case GL_PALETTE4_RGB8_OES: 30623ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick case GL_PALETTE4_RGBA8_OES: 30633ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick case GL_PALETTE4_R5_G6_B5_OES: 30643ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick case GL_PALETTE4_RGBA4_OES: 30653ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick case GL_PALETTE4_RGB5_A1_OES: 30663ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick case GL_PALETTE8_RGB8_OES: 30673ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick case GL_PALETTE8_RGBA8_OES: 30683ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick case GL_PALETTE8_R5_G6_B5_OES: 30693ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick case GL_PALETTE8_RGBA4_OES: 30703ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick case GL_PALETTE8_RGB5_A1_OES: 30713ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick _mesa_cpal_compressed_format_type(internalFormat, &choose_format, 30723ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick &choose_type); 30733ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick proxy_format = choose_format; 30743ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick 30753ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick /* check level */ 30763ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick if (level > 0 || level < -maxLevels) { 30773ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick *reason = "level"; 30783ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick return GL_INVALID_VALUE; 30793ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick } 30803ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick 30813ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick if (dimensions != 2) { 30823ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick *reason = "compressed paletted textures must be 2D"; 30833ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick return GL_INVALID_OPERATION; 30843ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick } 30853ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick 30863ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick /* Figure out the expected texture size (in bytes). This will be 30873ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick * checked against the actual size later. 30883ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick */ 30893ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick expectedSize = _mesa_cpal_compressed_size(level, internalFormat, 30903ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick width, height); 30913ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick 30923ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick /* This is for the benefit of the TestProxyTexImage below. It expects 30933ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick * level to be non-negative. OES_compressed_paletted_texture uses a 30943ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick * weird mechanism where the level specified to glCompressedTexImage2D 30953ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick * is -(n-1) number of levels in the texture, and the data specifies the 30963ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick * complete mipmap stack. This is done to ensure the palette is the 30973ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick * same for all levels. 30983ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick */ 30993ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick level = -level; 31003ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick break; 31013ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick#endif 31023ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick 31033ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick default: 31043ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick choose_format = GL_NONE; 31053ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick choose_type = GL_NONE; 31063ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick proxy_format = internalFormat; 31073ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick 31083ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick /* check level */ 31093ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick if (level < 0 || level >= maxLevels) { 31103ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick *reason = "level"; 31113ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick return GL_INVALID_VALUE; 31123ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick } 31133ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick 31143ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick /* Figure out the expected texture size (in bytes). This will be 31153ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick * checked against the actual size later. 31163ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick */ 31173ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick expectedSize = compressed_tex_size(width, height, depth, internalFormat); 31183ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick break; 31193ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick } 31203ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick 3121c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul /* This should really never fail */ 3122d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch if (_mesa_base_tex_format(ctx, internalFormat) < 0) { 3123d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch *reason = "internalFormat"; 3124a2dc424acfe83f3c66d3509f5a1efc24ce884367Ian Romanick return GL_INVALID_ENUM; 3125d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch } 3126a2dc424acfe83f3c66d3509f5a1efc24ce884367Ian Romanick 31274ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul /* No compressed formats support borders at this time */ 3128d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch if (border != 0) { 3129d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch *reason = "border != 0"; 313089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 3131d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch } 313289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 313389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* For cube map, width must equal height */ 31342efa3d4f9fd1e1683c5366d402d8740ecfb688e5Brian Paul if (_mesa_is_cube_face(target) && width != height) { 3135d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch *reason = "width != height"; 313689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 3137d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch } 313889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 31397404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul /* check image size against compression block size */ 31407404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul { 31417404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul gl_format texFormat = 31423ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick ctx->Driver.ChooseTextureFormat(ctx, proxy_format, 31433ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick choose_format, choose_type); 31447404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul GLuint bw, bh; 31457404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul 31467404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul _mesa_get_format_block_size(texFormat, &bw, &bh); 31477404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul if ((width > bw && width % bw > 0) || 31487404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul (height > bh && height % bh > 0)) { 31497404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul /* 31507404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul * Per GL_ARB_texture_compression: GL_INVALID_OPERATION is 31517404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul * generated [...] if any parameter combinations are not 31527404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul * supported by the specific compressed internal format. 31537404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul */ 3154d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch *reason = "invalid width or height for compression format"; 31557404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul return GL_INVALID_OPERATION; 31567404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul } 31577404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul } 31587404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul 31594ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul /* check image sizes */ 31604ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul if (!ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level, 31613ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick proxy_format, choose_format, 31623ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick choose_type, 31633ebbfc8372d410801c799b3eb7821075dae73b17Ian Romanick width, height, depth, border)) { 31647404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul /* See error comment above */ 3165d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch *reason = "invalid width, height or format"; 31667404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul return GL_INVALID_OPERATION; 31674ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul } 316889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 31694ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul /* check image size in bytes */ 31707404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul if (expectedSize != imageSize) { 31717404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul /* Per GL_ARB_texture_compression: GL_INVALID_VALUE is generated [...] 31727404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul * if <imageSize> is not consistent with the format, dimensions, and 31737404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul * contents of the specified image. 31747404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul */ 3175d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch *reason = "imageSize inconsistant with width/height/format"; 317689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 31777404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul } 317889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3179a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul if (!mutable_tex_object(ctx, target)) { 3180a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul *reason = "immutable texture"; 3181a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul return GL_INVALID_OPERATION; 3182a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul } 3183a0d736b3b7c325ab0295da3b0e3b92d170b44261Brian Paul 318489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_NO_ERROR; 318589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 318689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 318789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 318889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul/** 318989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * Error checking for glCompressedTexSubImage[123]D(). 31902371033bbaf6e7477bfa893654a0467a084f335bBrian Paul * \warning There are some bad assumptions here about the size of compressed 31912371033bbaf6e7477bfa893654a0467a084f335bBrian Paul * texture tiles (multiple of 4) used to test the validity of the 31922371033bbaf6e7477bfa893654a0467a084f335bBrian Paul * offset and size parameters. 319389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul * \return error code or GL_NO_ERROR. 319489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul */ 319589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paulstatic GLenum 3196f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcompressed_subtexture_error_check(struct gl_context *ctx, GLint dimensions, 319789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum target, GLint level, 319889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint xoffset, GLint yoffset, GLint zoffset, 319989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLsizei width, GLsizei height, GLsizei depth, 320089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum format, GLsizei imageSize) 320189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul{ 320289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLint expectedSize, maxLevels = 0, maxTextureSize; 320307ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul GLuint bw, bh; 3204a6c423d95663cfd8601cf84e10e8e1b12fa6ef15Brian Paul (void) zoffset; 320589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 320689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (dimensions == 1) { 320789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* 1D compressed textures not allowed */ 320889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; 320989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 321089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (dimensions == 2) { 321189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (target == GL_PROXY_TEXTURE_2D) { 321289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxLevels = ctx->Const.MaxTextureLevels; 321389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 321489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (target == GL_TEXTURE_2D) { 321589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxLevels = ctx->Const.MaxTextureLevels; 321689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 321789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (target == GL_PROXY_TEXTURE_CUBE_MAP_ARB) { 321889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (!ctx->Extensions.ARB_texture_cube_map) 321989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; /*target*/ 322089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxLevels = ctx->Const.MaxCubeTextureLevels; 322189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 32222efa3d4f9fd1e1683c5366d402d8740ecfb688e5Brian Paul else if (_mesa_is_cube_face(target)) { 322389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (!ctx->Extensions.ARB_texture_cube_map) 322489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; /*target*/ 322589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxLevels = ctx->Const.MaxCubeTextureLevels; 322689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 322789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else { 322889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; /*target*/ 322989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 323089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 323189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul else if (dimensions == 3) { 323289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul /* 3D compressed textures not allowed */ 323389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; 323489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 323589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 323689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul maxTextureSize = 1 << (maxLevels - 1); 323789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3238c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul /* this will catch any invalid compressed format token */ 3239c34feadd1c2fa5c62022c1f48ee675b25a985ac6Brian Paul if (!_mesa_is_compressed_format(ctx, format)) 324089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_ENUM; 324189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3242887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul if (width < 1 || width > maxTextureSize) 324389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 324489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3245887e2cf01a99f7fe1b7c94320b7bdbbf0d6ad2f8Brian Paul if ((height < 1 || height > maxTextureSize) 324689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul && dimensions > 1) 324789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 324889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 324989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (level < 0 || level >= maxLevels) 325089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 325189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 325207ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul /* 325307ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul * do checks which depend on compression block size 32542371033bbaf6e7477bfa893654a0467a084f335bBrian Paul */ 325507ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul get_compressed_block_size(format, &bw, &bh); 325607ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul 325707ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul if ((xoffset % bw != 0) || (yoffset % bh != 0)) 325889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 325989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 326007ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul if ((width % bw != 0) && width != 2 && width != 1) 326189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 326289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 326307ad6393cb31d8f1f086f9c46705334ef9cf25f6Brian Paul if ((height % bh != 0) && height != 2 && height != 1) 326489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 326589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 326654bb414e00a4daedbe530b9933bc11bac4ae7149Brian Paul expectedSize = compressed_tex_size(width, height, depth, format); 326789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (expectedSize != imageSize) 326889fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_INVALID_VALUE; 326989fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 327089fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return GL_NO_ERROR; 327189fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul} 327289fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 327389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul 3274f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul/** 3275f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul * Do second part of glCompressedTexSubImage error checking. 3276f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul * \return GL_TRUE if error found, GL_FALSE otherwise. 3277f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul */ 3278f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paulstatic GLboolean 3279f9995b30756140724f41daf963fa06167912be7fKristian Høgsbergcompressed_subtexture_error_check2(struct gl_context *ctx, GLuint dims, 3280f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul GLsizei width, GLsizei height, 3281f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul GLsizei depth, GLenum format, 3282f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul struct gl_texture_image *texImage) 3283f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul{ 3284f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul 3285f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul if ((GLint) format != texImage->InternalFormat) { 3286f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 3287f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul "glCompressedTexSubImage%uD(format=0x%x)", dims, format); 3288f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul return GL_TRUE; 3289f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul } 3290f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul 3291d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu if (compressedteximage_only_format(ctx, format)) { 3292d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu _mesa_error(ctx, GL_INVALID_OPERATION, 3293d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu "glCompressedTexSubImage%uD(format=0x%x cannot be updated)" 3294d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu , dims, format); 3295d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu return GL_TRUE; 3296d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu } 3297d4a38e86d4b4d66cca20ee63222f940cb73fa709Chia-I Wu 3298f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul if (((width == 1 || width == 2) && 3299ca0d048e4e0cc5885cd309cdf9057cfe6044924eBrian Paul width != (GLsizei) texImage->Width) || 3300ca0d048e4e0cc5885cd309cdf9057cfe6044924eBrian Paul (width > (GLsizei) texImage->Width)) { 3301f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 3302f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul "glCompressedTexSubImage%uD(width=%d)", dims, width); 3303f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul return GL_TRUE; 3304f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul } 3305f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul 3306f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul if (dims >= 2) { 3307f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul if (((height == 1 || height == 2) && 3308ca0d048e4e0cc5885cd309cdf9057cfe6044924eBrian Paul height != (GLsizei) texImage->Height) || 3309ca0d048e4e0cc5885cd309cdf9057cfe6044924eBrian Paul (height > (GLsizei) texImage->Height)) { 3310f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 3311f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul "glCompressedTexSubImage%uD(height=%d)", dims, height); 3312f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul return GL_TRUE; 3313f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul } 3314f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul } 3315f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul 3316f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul if (dims >= 3) { 3317f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul if (((depth == 1 || depth == 2) && 3318ca0d048e4e0cc5885cd309cdf9057cfe6044924eBrian Paul depth != (GLsizei) texImage->Depth) || 3319ca0d048e4e0cc5885cd309cdf9057cfe6044924eBrian Paul (depth > (GLsizei) texImage->Depth)) { 3320f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul _mesa_error(ctx, GL_INVALID_VALUE, 3321f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul "glCompressedTexSubImage%uD(depth=%d)", dims, depth); 3322f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul return GL_TRUE; 3323f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul } 3324f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul } 3325f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul 3326f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul return GL_FALSE; 3327f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul} 3328f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul 3329f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul 33304ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul/** 33314ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul * Implementation of the glCompressedTexImage1/2/3D() functions. 33324ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul */ 33334ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paulstatic void 33344ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paulcompressedteximage(struct gl_context *ctx, GLuint dims, 33354ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GLenum target, GLint level, 33364ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GLenum internalFormat, GLsizei width, 33374ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GLsizei height, GLsizei depth, GLint border, 33384ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GLsizei imageSize, const GLvoid *data) 33391207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{ 33404ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GLenum error; 3341d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch char *reason = ""; 33424ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul 3343cab974cf6c2dbfbf5dd5d291e1aae0f8eeb34290Keith Whitwell ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3344aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 3345d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) 33464ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul _mesa_debug(ctx, 33474ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul "glCompressedTexImage%uDARB %s %d %s %d %d %d %d %d %p\n", 33484ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul dims, 3349d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora _mesa_lookup_enum_by_nr(target), level, 3350d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora _mesa_lookup_enum_by_nr(internalFormat), 33514ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul width, height, depth, border, imageSize, data); 33525ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 33534ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul /* check target */ 33547404fa3f07a953343f2640fa97d82ab82ba5545dBrian Paul if (!legal_teximage_target(ctx, dims, target)) { 33554ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glCompressedTexImage%uD(target=%s)", 33564ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul dims, _mesa_lookup_enum_by_nr(target)); 3357aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul return; 3358aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 33591207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 33604ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul error = compressed_texture_error_check(ctx, dims, target, level, 33614ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul internalFormat, width, height, depth, 3362d5a5893adc395158e1dc77dacd417f4eb2696237Carl-Philip Haensch border, imageSize, &reason); 3363d100cbf721010f4eacc87507cc87c5314150d493Maciej Cencora 33644ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul if (error) { 3365ca7510bbf9bdff35f813f970e3120a9c7f728ccaBrian Paul _mesa_error(ctx, error, "glCompressedTexImage%uD(%s)", dims, reason); 33667179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg return; 33677179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg } 33687179a822628963d8cfa0817cf072c5acb70638a7Kristian Høgsberg 3369af0e2ef8cc5c823e3c950233a09b8de87933a363Brian Paul#if FEATURE_ES 3370af0e2ef8cc5c823e3c950233a09b8de87933a363Brian Paul /* XXX this is kind of a hack */ 33714ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul if (dims == 2) { 33724ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul switch (internalFormat) { 33734ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul case GL_PALETTE4_RGB8_OES: 33744ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul case GL_PALETTE4_RGBA8_OES: 33754ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul case GL_PALETTE4_R5_G6_B5_OES: 33764ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul case GL_PALETTE4_RGBA4_OES: 33774ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul case GL_PALETTE4_RGB5_A1_OES: 33784ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul case GL_PALETTE8_RGB8_OES: 33794ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul case GL_PALETTE8_RGBA8_OES: 33804ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul case GL_PALETTE8_R5_G6_B5_OES: 33814ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul case GL_PALETTE8_RGBA4_OES: 33824ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul case GL_PALETTE8_RGB5_A1_OES: 33834ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul _mesa_cpal_compressed_teximage2d(target, level, internalFormat, 33844ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul width, height, imageSize, data); 338589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 3386aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 33874ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul } 33884ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul#endif 3389aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 33904ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul if (_mesa_is_proxy_texture(target)) { 33914ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul /* Proxy texture: just check for errors and update proxy state */ 33924ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul struct gl_texture_image *texImage; 33932914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 33948e39ad2cd67d49be40ff0822f3269affdf83d601Brian Paul if (!error) { 33954ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul struct gl_texture_object *texObj = 33964ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul _mesa_get_current_tex_object(ctx, target); 33974ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul gl_format texFormat = 33984ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul _mesa_choose_texture_format(ctx, texObj, target, level, 33994ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul internalFormat, GL_NONE, GL_NONE); 34004ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul if (!legal_texture_size(ctx, texFormat, width, height, depth)) { 34014ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul error = GL_OUT_OF_MEMORY; 34024ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul } 3403aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 34045ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell 34054ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul texImage = _mesa_get_proxy_tex_image(ctx, target, level); 34064ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul if (texImage) { 34074ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul if (error) { 34084ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul /* if error, clear all proxy texture image parameters */ 34094ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul clear_teximage_fields(texImage); 34104ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul } 34114ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul else { 34124ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul /* no error: store the teximage parameters */ 34134ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul _mesa_init_teximage_fields(ctx, target, texImage, width, height, 34144ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul depth, border, internalFormat, 34154ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul MESA_FORMAT_NONE); 34164ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul } 341789fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul } 3418aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 3419aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul else { 34208c3ddf4270ff075ee783a67e5d5d04fa16a9cb45Brian Paul /* non-proxy target */ 3421aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul struct gl_texture_object *texObj; 3422aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul struct gl_texture_image *texImage; 34234ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul 342489fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (error) { 34254ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul _mesa_error(ctx, error, "glCompressedTexImage%uD", dims); 342689fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 3427aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 3428aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul 3429b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul texObj = _mesa_get_current_tex_object(ctx, target); 34309519603f7405a1043ea39bf1dfaf4c88529ce2d1Brian Paul 34315ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 34325ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 34335ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_get_tex_image(ctx, texObj, target, level); 34345ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell if (!texImage) { 34354ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, 34364ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul "glCompressedTexImage%uD", dims); 34375ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 3438c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul else { 343983e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul gl_format texFormat; 344083e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul 344168f8cf72638e974a5bf2ae3e88c2e3539d88e2b6Eric Anholt ctx->Driver.FreeTextureImageBuffer(ctx, texImage); 3442c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul 344383e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul texFormat = _mesa_choose_texture_format(ctx, texObj, target, level, 344483e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul internalFormat, GL_NONE, 344583e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul GL_NONE); 344683e93b6008213ad86607027e8434ecaccc8b1a2cBrian Paul 34474b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul if (legal_texture_size(ctx, texFormat, width, height, depth)) { 34484b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul _mesa_init_teximage_fields(ctx, target, texImage, 34494b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul width, height, depth, 34504b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul border, internalFormat, texFormat); 345111caea687e3f10ae12d33e44edf84635f73047ddBrian Paul 34524ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul switch (dims) { 34534ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul case 1: 34544ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul ASSERT(ctx->Driver.CompressedTexImage1D); 34554ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul ctx->Driver.CompressedTexImage1D(ctx, target, level, 34564ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul internalFormat, 34574ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul width, 34584ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul border, imageSize, data, 34594ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul texObj, texImage); 34604ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul break; 34614ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul case 2: 34624ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul ASSERT(ctx->Driver.CompressedTexImage2D); 34634ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul ctx->Driver.CompressedTexImage2D(ctx, target, level, 34644ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul internalFormat, 34654ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul width, height, 34664ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul border, imageSize, data, 34674ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul texObj, texImage); 34684ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul break; 34694ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul case 3: 34704ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul ASSERT(ctx->Driver.CompressedTexImage3D); 34714ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul ctx->Driver.CompressedTexImage3D(ctx, target, level, 34724ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul internalFormat, 34734ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul width, height, depth, 34744ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul border, imageSize, data, 34754ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul texObj, texImage); 34764ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul break; 34774ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul default: 34784ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul _mesa_problem(ctx, "bad dims in compressedteximage"); 34794ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul } 3480c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul 34814b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul check_gen_mipmap(ctx, target, texObj, level); 34822914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 34834b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul /* state update */ 34844b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul texObj->_Complete = GL_FALSE; 34854b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul ctx->NewState |= _NEW_TEXTURE; 34864b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul } 34874b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul else { 34884ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul _mesa_error(ctx, GL_OUT_OF_MEMORY, 34894ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul "glCompressedTexImage%uD", dims); 34904b08f35487fa439fd9ca4d653d3a146c3dc09c1cBrian Paul } 3491c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul } 3492c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul } 34935ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 3494aea66b135eaa5a5f2bc8c652fa7a1a42cca2fe83Brian Paul } 34954ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul} 34969519603f7405a1043ea39bf1dfaf4c88529ce2d1Brian Paul 34979519603f7405a1043ea39bf1dfaf4c88529ce2d1Brian Paul 34984ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paulvoid GLAPIENTRY 34994ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul_mesa_CompressedTexImage1DARB(GLenum target, GLint level, 35004ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GLenum internalFormat, GLsizei width, 35014ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GLint border, GLsizei imageSize, 35024ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul const GLvoid *data) 35034ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul{ 35044ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GET_CURRENT_CONTEXT(ctx); 35054ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul compressedteximage(ctx, 1, target, level, internalFormat, 35064ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul width, 1, 1, border, imageSize, data); 35074ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul} 35084ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul 35094ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul 35104ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paulvoid GLAPIENTRY 35114ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul_mesa_CompressedTexImage2DARB(GLenum target, GLint level, 35124ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GLenum internalFormat, GLsizei width, 35134ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GLsizei height, GLint border, GLsizei imageSize, 35144ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul const GLvoid *data) 35154ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul{ 35164ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GET_CURRENT_CONTEXT(ctx); 35174ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul compressedteximage(ctx, 2, target, level, internalFormat, 35184ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul width, height, 1, border, imageSize, data); 35194ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul} 35204ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul 35214ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul 35224ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paulvoid GLAPIENTRY 35234ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul_mesa_CompressedTexImage3DARB(GLenum target, GLint level, 35244ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GLenum internalFormat, GLsizei width, 35254ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GLsizei height, GLsizei depth, GLint border, 35264ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GLsizei imageSize, const GLvoid *data) 35274ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul{ 35284ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul GET_CURRENT_CONTEXT(ctx); 35294ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul compressedteximage(ctx, 3, target, level, internalFormat, 35304ff70b7a8f5f6383d8f320e68d798d0654799210Brian Paul width, height, depth, border, imageSize, data); 35311207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul} 35321207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 35331207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 35346bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul/** 35356bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul * Common helper for glCompressedTexSubImage1/2/3D(). 35366bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul */ 35376bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paulstatic void 35386bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paulcompressed_tex_sub_image(GLuint dims, GLenum target, GLint level, 35396bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul GLint xoffset, GLint yoffset, GLint zoffset, 35406bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul GLsizei width, GLsizei height, GLsizei depth, 35416bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul GLenum format, GLsizei imageSize, const GLvoid *data) 35421207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{ 35439540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul struct gl_texture_object *texObj; 35449540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul struct gl_texture_image *texImage; 354589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul GLenum error; 3546a1f1586bcb9fcd4a30930fd14b73323642ce85c5Brian Paul GET_CURRENT_CONTEXT(ctx); 354775280a2c742ee241d392618a3b29548fce1520a9Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 354875280a2c742ee241d392618a3b29548fce1520a9Brian Paul 35496bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul error = compressed_subtexture_error_check(ctx, dims, target, level, 3550c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul xoffset, 0, 0, /* pos */ 35516bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul width, height, depth, /* size */ 3552c3c19be8e0d0b13916cc128cf3c8e839935c912aBrian Paul format, imageSize); 355389fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul if (error) { 35546bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul _mesa_error(ctx, error, "glCompressedTexSubImage%uD", dims); 355589fb06fcc11cbe3f23521312155d6c55d869f526Brian Paul return; 35569540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul } 35579540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 3558b8fdb900fb9b1c8b1e9ec88509624237307a869aBrian Paul texObj = _mesa_get_current_tex_object(ctx, target); 3559c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul 35605ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_lock_texture(ctx, texObj); 35615ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell { 35625ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell texImage = _mesa_select_tex_image(ctx, texObj, target, level); 35635ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell assert(texImage); 35649540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul 35656bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul if (compressed_subtexture_error_check2(ctx, dims, width, height, depth, 3566f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul format, texImage)) { 3567f3c29bd74f01370a6bbff1329966ca9d1864315fBrian Paul /* error was recorded */ 3568c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul } 35696bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul else if (width > 0 && height > 0 && depth > 0) { 35706bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul switch (dims) { 35716bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul case 1: 35726bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul if (ctx->Driver.CompressedTexSubImage1D) { 35736bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul ctx->Driver.CompressedTexSubImage1D(ctx, target, level, 35746bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul xoffset, width, 35756bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul format, imageSize, data, 35766bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul texObj, texImage); 35776bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul } 35786bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul break; 35796bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul case 2: 35806bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul if (ctx->Driver.CompressedTexSubImage2D) { 35816bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul ctx->Driver.CompressedTexSubImage2D(ctx, target, level, 35826bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul xoffset, yoffset, 35836bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul width, height, 35846bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul format, imageSize, data, 35856bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul texObj, texImage); 35866bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul } 35876bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul break; 35886bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul case 3: 35896bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul if (ctx->Driver.CompressedTexSubImage3D) { 35906bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul ctx->Driver.CompressedTexSubImage3D(ctx, target, level, 35916bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul xoffset, yoffset, zoffset, 35926bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul width, height, depth, 35936bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul format, imageSize, data, 35946bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul texObj, texImage); 35956bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul } 35966bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul break; 35976bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul default: 35986bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul ; 3599c352566933b932ef09cea3f144df21147a7f6bc1Brian Paul } 36002914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 36012914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul check_gen_mipmap(ctx, target, texObj, level); 36022914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul 36032914f2b7fd9bd1082f8cce724d234208b900c3d4Brian Paul ctx->NewState |= _NEW_TEXTURE; 36045ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell } 36059540a1dbcf213645b23c6cd9284e92a1152cca05Brian Paul } 36065ac93f86210eb5c2a8dee74ec19b0ecd54376863Keith Whitwell _mesa_unlock_texture(ctx, texObj); 36071207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul} 36081207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 36091207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 3610c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 36116bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul_mesa_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, 36126bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul GLsizei width, GLenum format, 36136bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul GLsizei imageSize, const GLvoid *data) 36146bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul{ 36156bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul compressed_tex_sub_image(1, target, level, xoffset, 0, 0, width, 1, 1, 36166bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul format, imageSize, data); 36176bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul} 36186bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul 36196bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul 36206bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paulvoid GLAPIENTRY 36211207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul_mesa_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, 36221207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLint yoffset, GLsizei width, GLsizei height, 36231207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLenum format, GLsizei imageSize, 36241207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul const GLvoid *data) 36251207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{ 36266bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul compressed_tex_sub_image(2, target, level, xoffset, yoffset, 0, 36276bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul width, height, 1, format, imageSize, data); 36281207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul} 36291207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 36301207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul 3631c40d1dd62dd9bcbb97128e37a75d991a8d3b2d8cKendall Bennettvoid GLAPIENTRY 36321207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul_mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, 36331207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLint yoffset, GLint zoffset, GLsizei width, 36341207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLsizei height, GLsizei depth, GLenum format, 36351207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul GLsizei imageSize, const GLvoid *data) 36361207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul{ 36376bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul compressed_tex_sub_image(3, target, level, xoffset, yoffset, zoffset, 36386bc1e9fd6989483fbc1c94730a8014b4c62b242cBrian Paul width, height, depth, format, imageSize, data); 36391207bf057aeea3376e5e0f03f789a5d67ed4d29dBrian Paul} 3640874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3641874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3642874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul/** 3643874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul * Helper for glTexBuffer(). Check if internalFormat is legal. If so, 3644874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul * return the basic data type and number of components for the format. 3645874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul * \param return GL_TRUE if internalFormat is legal, GL_FALSE otherwise 3646874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul */ 3647874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paulstatic GLboolean 3648874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paulget_sized_format_info(const struct gl_context *ctx, GLenum internalFormat, 3649874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul GLenum *datatype, GLuint *components) 3650874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul{ 3651874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul switch (internalFormat) { 3652874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_ALPHA8: 3653874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_BYTE; 3654874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3655874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3656874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_ALPHA16: 3657874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_SHORT; 3658874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3659874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3660874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_ALPHA16F_ARB: 3661874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_HALF_FLOAT; 3662874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3663874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3664874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_ALPHA32F_ARB: 3665874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_FLOAT; 3666874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3667874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3668874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_ALPHA8I_EXT: 3669874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_BYTE; 3670874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3671874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3672874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_ALPHA16I_EXT: 3673874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_SHORT; 3674874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3675874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3676874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_ALPHA32I_EXT: 3677874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_INT; 3678874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3679874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3680874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_ALPHA8UI_EXT: 3681874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_BYTE; 3682874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3683874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3684874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_ALPHA16UI_EXT: 3685874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_SHORT; 3686874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3687874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3688874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_ALPHA32UI_EXT: 3689874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_INT; 3690874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3691874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3692874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE8: 3693874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_BYTE; 3694874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3695874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3696874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE16: 3697874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_SHORT; 3698874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3699874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3700874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE16F_ARB: 3701874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_HALF_FLOAT; 3702874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3703874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3704874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE32F_ARB: 3705874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_FLOAT; 3706874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3707874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3708874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE8I_EXT: 3709874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_BYTE; 3710874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3711874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3712874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE16I_EXT: 3713874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_SHORT; 3714874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3715874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3716874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE32I_EXT: 3717874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_INT; 3718874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3719874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3720874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE8UI_EXT: 3721874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_BYTE; 3722874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3723874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3724874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE16UI_EXT: 3725874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_SHORT; 3726874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3727874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3728874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE32UI_EXT: 3729874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_INT; 3730874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3731874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3732874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE8_ALPHA8: 3733874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_BYTE; 3734874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 2; 3735874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3736874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE16_ALPHA16: 3737874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_SHORT; 3738874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 2; 3739874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3740874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE_ALPHA16F_ARB: 3741874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_HALF_FLOAT; 3742874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 2; 3743874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3744874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE_ALPHA32F_ARB: 3745874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_FLOAT; 3746874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 2; 3747874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3748874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE_ALPHA8I_EXT: 3749874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_BYTE; 3750874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 2; 3751874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3752874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE_ALPHA16I_EXT: 3753874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_SHORT; 3754874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 2; 3755874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3756874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE_ALPHA32I_EXT: 3757874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_INT; 3758874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 2; 3759874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3760874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE_ALPHA8UI_EXT: 3761874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_BYTE; 3762874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 2; 3763874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3764874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE_ALPHA16UI_EXT: 3765874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_SHORT; 3766874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 2; 3767874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3768874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_LUMINANCE_ALPHA32UI_EXT: 3769874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_INT; 3770874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 2; 3771874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3772874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_INTENSITY8: 3773874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_BYTE; 3774874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3775874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3776874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_INTENSITY16: 3777874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_SHORT; 3778874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3779874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3780874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_INTENSITY16F_ARB: 3781874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_HALF_FLOAT; 3782874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3783874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3784874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_INTENSITY32F_ARB: 3785874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_FLOAT; 3786874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3787874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3788874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_INTENSITY8I_EXT: 3789874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_BYTE; 3790874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3791874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3792874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_INTENSITY16I_EXT: 3793874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_SHORT; 3794874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3795874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3796874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_INTENSITY32I_EXT: 3797874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_INT; 3798874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3799874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3800874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_INTENSITY8UI_EXT: 3801874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_BYTE; 3802874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3803874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3804874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_INTENSITY16UI_EXT: 3805874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_SHORT; 3806874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3807874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3808874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_INTENSITY32UI_EXT: 3809874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_INT; 3810874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 1; 3811874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3812874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_RGBA8: 3813874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_BYTE; 3814874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 4; 3815874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3816874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_RGBA16: 3817874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_SHORT; 3818874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 4; 3819874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3820874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_RGBA16F_ARB: 3821874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_HALF_FLOAT; 3822874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 4; 3823874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3824874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_RGBA32F_ARB: 3825874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_FLOAT; 3826874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 4; 3827874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3828874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_RGBA8I_EXT: 3829874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_BYTE; 3830874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 4; 3831874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3832874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_RGBA16I_EXT: 3833874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_SHORT; 3834874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 4; 3835874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3836874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_RGBA32I_EXT: 3837874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_INT; 3838874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 4; 3839874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3840874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_RGBA8UI_EXT: 3841874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_BYTE; 3842874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 4; 3843874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3844874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_RGBA16UI_EXT: 3845874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_SHORT; 3846874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 4; 3847874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3848874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul case GL_RGBA32UI_EXT: 3849874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *datatype = GL_UNSIGNED_INT; 3850874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul *components = 4; 3851874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul break; 3852874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul default: 3853874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul return GL_FALSE; 3854874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul } 3855874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3856874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul if (*datatype == GL_FLOAT && !ctx->Extensions.ARB_texture_float) 3857874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul return GL_FALSE; 3858874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3859874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul if (*datatype == GL_HALF_FLOAT && !ctx->Extensions.ARB_half_float_pixel) 3860874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul return GL_FALSE; 3861874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3862874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul return GL_TRUE; 3863874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul} 3864874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3865874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3866874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul/** GL_ARB_texture_buffer_object */ 3867874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paulvoid GLAPIENTRY 3868874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul_mesa_TexBuffer(GLenum target, GLenum internalFormat, GLuint buffer) 3869874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul{ 3870874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul struct gl_texture_object *texObj; 3871874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul struct gl_buffer_object *bufObj; 3872874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul GLenum dataType; 3873874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul GLuint comps; 3874874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3875874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul GET_CURRENT_CONTEXT(ctx); 3876874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3877874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3878874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul if (!ctx->Extensions.ARB_texture_buffer_object) { 3879874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBuffer"); 3880874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul return; 3881874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul } 3882874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3883874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul if (target != GL_TEXTURE_BUFFER_ARB) { 3884874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexBuffer(target)"); 3885874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul return; 3886874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul } 3887874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3888874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul if (!get_sized_format_info(ctx, internalFormat, &dataType, &comps)) { 3889874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul _mesa_error(ctx, GL_INVALID_ENUM, "glTexBuffer(internalFormat 0x%x)", 3890874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul internalFormat); 3891874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul return; 3892874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul } 3893874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3894874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul bufObj = _mesa_lookup_bufferobj(ctx, buffer); 3895874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul if (buffer && !bufObj) { 3896874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBuffer(buffer %u)", buffer); 3897874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul return; 3898874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul } 3899874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3900874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul texObj = _mesa_get_current_tex_object(ctx, target); 3901874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul 3902874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul _mesa_lock_texture(ctx, texObj); 3903874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul { 3904874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul _mesa_reference_buffer_object(ctx, &texObj->BufferObject, bufObj); 3905874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul texObj->BufferObjectFormat = internalFormat; 3906874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul } 3907874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul _mesa_unlock_texture(ctx, texObj); 3908874a2c0b7da62f4dd08dedcec221f55b22e40e95Brian Paul} 3909