1f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 2f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Mesa 3-D graphics library 3f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 4f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 1999-2008 Brian Paul All Rights Reserved. 5f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Copyright (C) 2009 VMware, Inc. All Rights Reserved. 6f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 7f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Permission is hereby granted, free of charge, to any person obtaining a 8f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * copy of this software and associated documentation files (the "Software"), 9f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to deal in the Software without restriction, including without limitation 10f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the rights to use, copy, modify, merge, publish, distribute, sublicense, 11f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and/or sell copies of the Software, and to permit persons to whom the 12f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Software is furnished to do so, subject to the following conditions: 13f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 14f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The above copyright notice and this permission notice shall be included 15f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in all copies or substantial portions of the Software. 16f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 17f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 18f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 19f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 20f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN 21f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 24f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 25f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 26f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 27f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \file teximage.c 28f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Texture image-related functions. 29f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 30f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 31f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include <stdbool.h> 32f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glheader.h" 33f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "bufferobj.h" 34f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "context.h" 35f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "enums.h" 36f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "fbobject.h" 37f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "framebuffer.h" 38f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "hash.h" 39f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "image.h" 40f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "imports.h" 41f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "macros.h" 42f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mfeatures.h" 43f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "state.h" 44f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress.h" 45f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texcompress_cpal.h" 46f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "teximage.h" 47f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texobj.h" 48f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "texstate.h" 49f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "mtypes.h" 50f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#include "glformats.h" 51f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 52f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 53f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* Inexplicably, GL_HALF_FLOAT_OES has a different value than GL_HALF_FLOAT. 54f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 55f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifndef GL_HALF_FLOAT_OES 56f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define GL_HALF_FLOAT_OES 0x8D61 57f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 58f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 59f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 60f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * State changes which we care about for glCopyTex[Sub]Image() calls. 61f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * In particular, we care about pixel transfer state and buffer state 62f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * (such as glReadBuffer to make sure we read from the right renderbuffer). 63f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 64f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define NEW_COPY_TEX_STATE (_NEW_BUFFERS | _NEW_PIXEL) 65f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 66f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 67f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 68f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 69f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the simple base format for a given internal texture format. 70f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For example, given GL_LUMINANCE12_ALPHA4, return GL_LUMINANCE_ALPHA. 71f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 72f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 73f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param internalFormat the internal texture format token or 1, 2, 3, or 4. 74f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 75f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return the corresponding \u base internal format (GL_ALPHA, GL_LUMINANCE, 76f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_LUMANCE_ALPHA, GL_INTENSITY, GL_RGB, or GL_RGBA), or -1 if invalid enum. 77f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 78f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the format which is used during texture application (i.e. the 79f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture format and env mode determine the arithmetic used. 80f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 81f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint 82f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_base_tex_format( struct gl_context *ctx, GLint internalFormat ) 83f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 84f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 85f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 86f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA4: 87f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA8: 88f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA12: 89f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA16: 90f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (ctx->API != API_OPENGL_CORE) ? GL_ALPHA : -1; 91f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 92f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 93f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE4: 94f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE8: 95f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE12: 96f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16: 97f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE : -1; 98f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 99f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE4_ALPHA4: 101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE6_ALPHA2: 102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE8_ALPHA8: 103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE12_ALPHA4: 104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE12_ALPHA12: 105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16_ALPHA16: 106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (ctx->API != API_OPENGL_CORE) ? GL_LUMINANCE_ALPHA : -1; 107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY: 108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY4: 109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY8: 110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY12: 111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY16: 112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (ctx->API != API_OPENGL_CORE) ? GL_INTENSITY : -1; 113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (ctx->API != API_OPENGL_CORE) ? GL_RGB : -1; 115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R3_G3_B2: 117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB4: 118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB5: 119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB8: 120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB10: 121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB12: 122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB16: 123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 4: 125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (ctx->API != API_OPENGL_CORE) ? GL_RGBA : -1; 126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA2: 128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA4: 129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB5_A1: 130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA8: 131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB10_A2: 132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA12: 133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA16: 134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGBA; 135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* GL_BGRA can be an internal format *only* in OpenGL ES (1.x or 2.0). 140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_gles(ctx)) { 142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA: 144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGBA; 145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ARB_ES2_compatibility) { 151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB565: 153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ARB_depth_texture) { 160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_COMPONENT: 162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_COMPONENT16: 163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_COMPONENT24: 164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_COMPONENT32: 165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_DEPTH_COMPONENT; 166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_ALPHA: 173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_ALPHA; 174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_LUMINANCE: 175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE; 176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_LUMINANCE_ALPHA: 177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE_ALPHA; 178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_INTENSITY: 179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INTENSITY; 180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGB: 181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGBA: 183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGBA; 184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.TDFX_texture_compression_FXT1) { 189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGB_FXT1_3DFX: 191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGBA_FXT1_3DFX: 193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGBA; 194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.EXT_texture_compression_s3tc) { 200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGBA; 207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.S3_s3tc) { 213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_S3TC: 215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB4_S3TC: 216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA_S3TC: 218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA4_S3TC: 219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGBA; 220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.MESA_ycbcr_texture) { 226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (internalFormat == GL_YCBCR_MESA) 227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_YCBCR_MESA; 228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ARB_texture_float) { 231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA16F_ARB: 233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA32F_ARB: 234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_ALPHA; 235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA16F_ARB: 236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA32F_ARB: 237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGBA; 238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB16F_ARB: 239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB32F_ARB: 240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY16F_ARB: 242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY32F_ARB: 243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INTENSITY; 244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16F_ARB: 245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE32F_ARB: 246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE; 247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA16F_ARB: 248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA32F_ARB: 249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE_ALPHA; 250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ATI_envmap_bumpmap) { 256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DUDV_ATI: 258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DU8DV8_ATI: 259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_DUDV_ATI; 260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.EXT_texture_snorm) { 266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED_SNORM: 268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R8_SNORM: 269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R16_SNORM: 270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RED; 271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG_SNORM: 272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG8_SNORM: 273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG16_SNORM: 274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RG; 275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB_SNORM: 276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB8_SNORM: 277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB16_SNORM: 278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA_SNORM: 280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA8_SNORM: 281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA16_SNORM: 282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGBA; 283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA_SNORM: 284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA8_SNORM: 285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA16_SNORM: 286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_ALPHA; 287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_SNORM: 288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE8_SNORM: 289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16_SNORM: 290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE; 291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA_SNORM: 292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE8_ALPHA8_SNORM: 293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16_ALPHA16_SNORM: 294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE_ALPHA; 295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY_SNORM: 296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY8_SNORM: 297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY16_SNORM: 298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INTENSITY; 299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.EXT_packed_depth_stencil) { 305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_STENCIL_EXT: 307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH24_STENCIL8_EXT: 308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_DEPTH_STENCIL_EXT; 309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_EXT_texture_sRGB 315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.EXT_texture_sRGB) { 316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SRGB_EXT: 318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SRGB8_EXT: 319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SRGB_EXT: 320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SRGB_S3TC_DXT1_EXT: 321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SRGB_ALPHA_EXT: 323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SRGB8_ALPHA8_EXT: 324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SRGB_ALPHA_EXT: 325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT: 326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT: 327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT: 328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGBA; 329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SLUMINANCE_ALPHA_EXT: 330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SLUMINANCE8_ALPHA8_EXT: 331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SLUMINANCE_ALPHA_EXT: 332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE_ALPHA; 333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SLUMINANCE_EXT: 334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_SLUMINANCE8_EXT: 335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SLUMINANCE_EXT: 336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE; 337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif /* FEATURE_EXT_texture_sRGB */ 342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Version >= 30 || 344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_integer) { 345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA8UI_EXT: 347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA16UI_EXT: 348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA32UI_EXT: 349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA8I_EXT: 350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA16I_EXT: 351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA32I_EXT: 352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB10_A2UI: 353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGBA; 354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB8UI_EXT: 355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB16UI_EXT: 356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB32UI_EXT: 357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB8I_EXT: 358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB16I_EXT: 359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB32I_EXT: 360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.EXT_texture_integer) { 365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA8UI_EXT: 367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA16UI_EXT: 368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA32UI_EXT: 369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA8I_EXT: 370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA16I_EXT: 371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA32I_EXT: 372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_ALPHA; 373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY8UI_EXT: 374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY16UI_EXT: 375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY32UI_EXT: 376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY8I_EXT: 377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY16I_EXT: 378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY32I_EXT: 379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INTENSITY; 380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE8UI_EXT: 381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16UI_EXT: 382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE32UI_EXT: 383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE8I_EXT: 384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16I_EXT: 385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE32I_EXT: 386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE; 387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA8UI_EXT: 388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA16UI_EXT: 389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA32UI_EXT: 390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA8I_EXT: 391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA16I_EXT: 392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA32I_EXT: 393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE_ALPHA; 394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ARB_texture_rg) { 400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R16F: 402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* R16F depends on both ARB_half_float_pixel and ARB_texture_float. 403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_half_float_pixel) 405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FALLTHROUGH */ 407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R32F: 408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_texture_float) 409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RED; 411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R8I: 412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R8UI: 413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R16I: 414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R16UI: 415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R32I: 416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R32UI: 417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Version < 30 && !ctx->Extensions.EXT_texture_integer) 418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FALLTHROUGH */ 420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R8: 421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R16: 422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RED: 423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RED: 424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RED; 425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG16F: 427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* RG16F depends on both ARB_half_float_pixel and ARB_texture_float. 428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_half_float_pixel) 430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FALLTHROUGH */ 432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG32F: 433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_texture_float) 434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RG; 436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG8I: 437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG8UI: 438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG16I: 439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG16UI: 440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG32I: 441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG32UI: 442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Version < 30 && !ctx->Extensions.EXT_texture_integer) 443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* FALLTHROUGH */ 445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG: 446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG8: 447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG16: 448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RG: 449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RG; 450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.EXT_texture_shared_exponent) { 456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB9_E5_EXT: 458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.EXT_packed_float) { 465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R11F_G11F_B10F_EXT: 467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ARB_depth_buffer_float) { 474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_COMPONENT32F: 476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_DEPTH_COMPONENT; 477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH32F_STENCIL8: 478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_DEPTH_STENCIL; 479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ARB_texture_compression_rgtc) { 485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RED_RGTC1: 487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SIGNED_RED_RGTC1: 488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RED; 489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RG_RGTC2: 490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SIGNED_RG_RGTC2: 491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RG; 492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.EXT_texture_compression_latc) { 498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_LUMINANCE_LATC1_EXT: 500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SIGNED_LUMINANCE_LATC1_EXT: 501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE; 502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_LUMINANCE_ALPHA_LATC2_EXT: 503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_SIGNED_LUMINANCE_ALPHA_LATC2_EXT: 504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE_ALPHA; 505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ATI_texture_compression_3dc) { 511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_LUMINANCE_ALPHA_3DC_ATI: 513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE_ALPHA; 514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.OES_compressed_ETC1_RGB8_texture) { 520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ETC1_RGB8_OES: 522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->API == API_OPENGLES) { 529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGB8_OES: 531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_R5_G6_B5_OES: 532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGB8_OES: 533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_R5_G6_B5_OES: 534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGBA8_OES: 536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGB5_A1_OES: 537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGBA4_OES: 538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGB5_A1_OES: 539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGBA8_OES: 540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGBA4_OES: 541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGBA; 542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ; /* fallthrough */ 544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return -1; /* error */ 548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For cube map faces, return a face index in [0,5]. 553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For other targets return 0; 554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLuint 556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_tex_target_to_face(GLenum target) 557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_cube_face(target)) 559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (GLuint) target - (GLuint) GL_TEXTURE_CUBE_MAP_POSITIVE_X; 560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Install gl_texture_image in a gl_texture_object according to the target 568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and level parameters. 569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param tObj texture object. 571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target. 572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level image level. 573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param texImage texture image. 574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgset_tex_image(struct gl_texture_object *tObj, 577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, GLint level, 578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage) 579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint face = _mesa_tex_target_to_face(target); 581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(tObj); 583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(texImage); 584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == GL_TEXTURE_RECTANGLE_NV || target == GL_TEXTURE_EXTERNAL_OES) 585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(level == 0); 586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org tObj->Image[face][level] = texImage; 588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set the 'back' pointer */ 590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->TexObject = tObj; 591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->Level = level; 592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->Face = face; 593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Allocate a texture image structure. 598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called via ctx->Driver.NewTextureImage() unless overriden by a device 600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * driver. 601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return a pointer to gl_texture_image struct with all fields initialized to 603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * zero. 604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_texture_image * 606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_new_texture_image( struct gl_context *ctx ) 607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) ctx; 609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return CALLOC_STRUCT(gl_texture_image); 610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free a gl_texture_image and associated data. 615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This function is a fallback called via ctx->Driver.DeleteTextureImage(). 616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param texImage texture image. 618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free the texture image structure and the associated image data. 620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_delete_texture_image(struct gl_context *ctx, 623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage) 624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Free texImage->Data and/or any other driver-specific texture 626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * image storage. 627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(ctx->Driver.FreeTextureImageBuffer); 629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.FreeTextureImageBuffer( ctx, texImage ); 630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org free(texImage); 631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test if a target is a proxy target. 636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target. 638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if the target is a proxy target, GL_FALSE otherwise. 640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean 642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_is_proxy_texture(GLenum target) 643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * NUM_TEXTURE_TARGETS should match number of terms below, except there's no 646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * proxy for GL_TEXTURE_BUFFER and GL_TEXTURE_EXTERNAL_OES. 647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(NUM_TEXTURE_TARGETS == 7 + 2); 649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (target == GL_PROXY_TEXTURE_1D || 651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target == GL_PROXY_TEXTURE_2D || 652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target == GL_PROXY_TEXTURE_3D || 653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target == GL_PROXY_TEXTURE_CUBE_MAP_ARB || 654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target == GL_PROXY_TEXTURE_RECTANGLE_NV || 655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target == GL_PROXY_TEXTURE_1D_ARRAY_EXT || 656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target == GL_PROXY_TEXTURE_2D_ARRAY_EXT); 657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the proxy target which corresponds to the given texture target 662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLenum 664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_proxy_target(GLenum target) 665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D: 668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D: 669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_PROXY_TEXTURE_1D; 670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D: 671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D: 672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_PROXY_TEXTURE_2D; 673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_3D: 674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_3D: 675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_PROXY_TEXTURE_3D; 676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_ARB: 683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_CUBE_MAP_ARB: 684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_PROXY_TEXTURE_CUBE_MAP_ARB; 685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_RECTANGLE_NV: 686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_RECTANGLE_NV: 687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_PROXY_TEXTURE_RECTANGLE_NV; 688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D_ARRAY_EXT: 689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_PROXY_TEXTURE_1D_ARRAY_EXT; 691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D_ARRAY_EXT: 692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_PROXY_TEXTURE_2D_ARRAY_EXT; 694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "unexpected target in _mesa_get_proxy_target()"); 696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; 697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the texture object that corresponds to the target of the given 703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture unit. The target should have already been checked for validity. 704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param texUnit texture unit. 707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target. 708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return pointer to the texture object on success, or NULL on failure. 710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_texture_object * 712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_select_tex_object(struct gl_context *ctx, 713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_unit *texUnit, 714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target) 715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean arrayTex = (ctx->Extensions.MESA_texture_array || 717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_array); 718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D: 721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->CurrentTex[TEXTURE_1D_INDEX]; 722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D: 723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Texture.ProxyTex[TEXTURE_1D_INDEX]; 724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D: 725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->CurrentTex[TEXTURE_2D_INDEX]; 726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D: 727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Texture.ProxyTex[TEXTURE_2D_INDEX]; 728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_3D: 729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texUnit->CurrentTex[TEXTURE_3D_INDEX]; 730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_3D: 731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Texture.ProxyTex[TEXTURE_3D_INDEX]; 732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_ARB: 739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Extensions.ARB_texture_cube_map 740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? texUnit->CurrentTex[TEXTURE_CUBE_INDEX] : NULL; 741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_CUBE_MAP_ARB: 742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Extensions.ARB_texture_cube_map 743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? ctx->Texture.ProxyTex[TEXTURE_CUBE_INDEX] : NULL; 744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_RECTANGLE_NV: 745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Extensions.NV_texture_rectangle 746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? texUnit->CurrentTex[TEXTURE_RECT_INDEX] : NULL; 747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_RECTANGLE_NV: 748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Extensions.NV_texture_rectangle 749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? ctx->Texture.ProxyTex[TEXTURE_RECT_INDEX] : NULL; 750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D_ARRAY_EXT: 751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return arrayTex ? texUnit->CurrentTex[TEXTURE_1D_ARRAY_INDEX] : NULL; 752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return arrayTex ? ctx->Texture.ProxyTex[TEXTURE_1D_ARRAY_INDEX] : NULL; 754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D_ARRAY_EXT: 755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return arrayTex ? texUnit->CurrentTex[TEXTURE_2D_ARRAY_INDEX] : NULL; 756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return arrayTex ? ctx->Texture.ProxyTex[TEXTURE_2D_ARRAY_INDEX] : NULL; 758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_BUFFER: 759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_is_desktop_gl(ctx) 760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ctx->Extensions.ARB_texture_buffer_object 761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? texUnit->CurrentTex[TEXTURE_BUFFER_INDEX] : NULL; 762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_EXTERNAL_OES: 763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Extensions.OES_EGL_image_external 764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? texUnit->CurrentTex[TEXTURE_EXTERNAL_INDEX] : NULL; 765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "bad target in _mesa_select_tex_object()"); 767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return pointer to texture object for given target on current texture unit. 774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_texture_object * 776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_current_tex_object(struct gl_context *ctx, GLenum target) 777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_unit *texUnit = _mesa_get_current_tex_unit(ctx); 779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_select_tex_object(ctx, texUnit, target); 780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get a texture image pointer from a texture object, given a texture 785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * target and mipmap level. The target and level parameters should 786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * have already been error-checked. 787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param texObj texture unit. 790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target. 791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level image level. 792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return pointer to the texture image structure, or NULL on failure. 794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_texture_image * 796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_select_tex_image(struct gl_context *ctx, 797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_object *texObj, 798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, GLint level) 799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint face = _mesa_tex_target_to_face(target); 801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(texObj); 803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(level >= 0); 804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(level < MAX_TEXTURE_LEVELS); 805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texObj->Image[face][level]; 807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Like _mesa_select_tex_image() but if the image doesn't exist, allocate 812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * it and install it. Only return NULL if passed a bad parameter or run 813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * out of memory. 814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct gl_texture_image * 816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_tex_image(struct gl_context *ctx, struct gl_texture_object *texObj, 817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, GLint level) 818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage; 820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!texObj) 822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage = _mesa_select_tex_image(ctx, texObj, target, level); 825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!texImage) { 826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage = ctx->Driver.NewTextureImage(ctx); 827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!texImage) { 828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "texture image allocation"); 829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org set_tex_image(texObj, target, level, texImage); 833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texImage; 836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return pointer to the specified proxy texture image. 841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that proxy textures are per-context, not per-texture unit. 842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return pointer to texture image or NULL if invalid target, invalid 843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * level, or out of memory. 844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_texture_image * 846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_proxy_tex_image(struct gl_context *ctx, GLenum target, GLint level) 847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage; 849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint texIndex; 850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level < 0) 852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D: 856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level >= ctx->Const.MaxTextureLevels) 857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texIndex = TEXTURE_1D_INDEX; 859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D: 861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level >= ctx->Const.MaxTextureLevels) 862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texIndex = TEXTURE_2D_INDEX; 864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_3D: 866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level >= ctx->Const.Max3DTextureLevels) 867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texIndex = TEXTURE_3D_INDEX; 869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_CUBE_MAP: 871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level >= ctx->Const.MaxCubeTextureLevels) 872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texIndex = TEXTURE_CUBE_INDEX; 874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_RECTANGLE_NV: 876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level > 0) 877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texIndex = TEXTURE_RECT_INDEX; 879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level >= ctx->Const.MaxTextureLevels) 882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texIndex = TEXTURE_1D_ARRAY_INDEX; 884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level >= ctx->Const.MaxTextureLevels) 887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texIndex = TEXTURE_2D_ARRAY_INDEX; 889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage = ctx->Texture.ProxyTex[texIndex]->Image[0][level]; 895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!texImage) { 896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage = ctx->Driver.NewTextureImage(ctx); 897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!texImage) { 898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "proxy texture allocation"); 899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return NULL; 900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Texture.ProxyTex[texIndex]->Image[0][level] = texImage; 902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Set the 'back' pointer */ 903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage->TexObject = ctx->Texture.ProxyTex[texIndex]; 904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return texImage; 906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Get the maximum number of allowed mipmap levels. 911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target. 914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return the maximum number of allowed mipmap levels for the given 916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture target, or zero if passed a bad target. 917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \sa gl_constants. 919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint 921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_max_texture_levels(struct gl_context *ctx, GLenum target) 922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D: 925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D: 926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D: 927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D: 928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Const.MaxTextureLevels; 929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_3D: 930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_3D: 931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Const.Max3DTextureLevels; 932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP: 933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB: 934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB: 935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB: 936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB: 937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB: 938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB: 939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_CUBE_MAP_ARB: 940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Extensions.ARB_texture_cube_map 941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? ctx->Const.MaxCubeTextureLevels : 0; 942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_RECTANGLE_NV: 943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_RECTANGLE_NV: 944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Extensions.NV_texture_rectangle ? 1 : 0; 945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D_ARRAY_EXT: 946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D_ARRAY_EXT: 948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (ctx->Extensions.MESA_texture_array || 950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_array) 951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? ctx->Const.MaxTextureLevels : 0; 952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_BUFFER: 953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_is_desktop_gl(ctx) 954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ctx->Extensions.ARB_texture_buffer_object 955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? 1 : 0; 956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_EXTERNAL_OES: 957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 0; /* bad target */ 960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return number of dimensions per mipmap level for the given texture target. 966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLint 968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_texture_dimensions(GLenum target) 969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D: 972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D: 973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D: 975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_RECTANGLE: 976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP: 977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D: 978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_RECTANGLE: 979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_CUBE_MAP: 980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D_ARRAY: 987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D_ARRAY: 988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_EXTERNAL_OES: 989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 2; 990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_3D: 991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_3D: 992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D_ARRAY: 993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D_ARRAY: 994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 3; 995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_BUFFER: 996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "invalid target 0x%x in get_texture_dimensions()", 999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target); 1000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 2; 1001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return the maximum number of mipmap levels for the given target 1007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and the dimensions. 1008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The dimensions are expected not to include the border. 1009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLsizei 1011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_get_tex_max_num_levels(GLenum target, GLsizei width, GLsizei height, 1012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei depth) 1013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei size; 1015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 1017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D: 1018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D_ARRAY: 1019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = width; 1020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP: 1022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_ARRAY: 1023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(width == height); 1024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = width; 1025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D: 1027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D_ARRAY: 1028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = MAX2(width, height); 1029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_3D: 1031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org size = MAX3(width, height, depth); 1032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_RECTANGLE: 1034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 1035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(0); 1037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return 1; 1038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_logbase2(size) + 1; 1041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 000 /* not used anymore */ 1045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glTexImage[123]D can accept a NULL image pointer. In this case we 1047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * create a texture image with unspecified image contents per the OpenGL 1048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * spec. 1049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLubyte * 1051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmake_null_texture(GLint width, GLint height, GLint depth, GLenum format) 1052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint components = _mesa_components_in_format(format); 1054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint numPixels = width * height * depth; 1055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *data = (GLubyte *) MALLOC(numPixels * components * sizeof(GLubyte)); 1056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#ifdef DEBUG 1058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Let's see if anyone finds this. If glTexImage2D() is called with 1060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a NULL image pointer then load the texture image with something 1061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * interesting instead of leaving it indeterminate. 1062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (data) { 1064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org static const char message[8][32] = { 1065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org " X X XXXXX XXX X ", 1066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org " XX XX X X X X X ", 1067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org " X X X X X X X ", 1068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org " X X XXXX XXX XXXXX ", 1069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org " X X X X X X ", 1070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org " X X X X X X X ", 1071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org " X X XXXXX XXX X X ", 1072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org " " 1073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org }; 1074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte *imgPtr = data; 1076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint h, i, j, k; 1077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (h = 0; h < depth; h++) { 1078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < height; i++) { 1079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint srcRow = 7 - (i % 8); 1080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (j = 0; j < width; j++) { 1081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint srcCol = j % 32; 1082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLubyte texel = (message[srcRow][srcCol]=='X') ? 255 : 70; 1083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (k = 0; k < components; k++) { 1084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *imgPtr++ = texel; 1085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return data; 1093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 1095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Set the size and format-related fields of a gl_texture_image struct 1100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to zero. This is used when a proxy texture test fails. 1101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgclear_teximage_fields(struct gl_texture_image *img) 1104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(img); 1106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->_BaseFormat = 0; 1107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->InternalFormat = 0; 1108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Border = 0; 1109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Width = 0; 1110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Height = 0; 1111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Depth = 0; 1112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Width2 = 0; 1113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Height2 = 0; 1114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Depth2 = 0; 1115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->WidthLog2 = 0; 1116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->HeightLog2 = 0; 1117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->DepthLog2 = 0; 1118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->TexFormat = MESA_FORMAT_NONE; 1119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Initialize basic fields of the gl_texture_image struct. 1124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 1126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param img texture image structure to be initialized. 1127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width image width. 1128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height image height. 1129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param depth image depth. 1130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param border image border. 1131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param internalFormat internal format. 1132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format the actual hardware format (one of MESA_FORMAT_*) 1133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Fills in the fields of \p img with the given information. 1135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note: width, height and depth include the border. 1136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_init_teximage_fields(struct gl_context *ctx, 1139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *img, 1140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, GLsizei depth, 1141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint border, GLenum internalFormat, 1142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format format) 1143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target; 1145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(img); 1146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(width >= 0); 1147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(height >= 0); 1148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(depth >= 0); 1149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target = img->TexObject->Target; 1151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->_BaseFormat = _mesa_base_tex_format( ctx, internalFormat ); 1152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(img->_BaseFormat > 0); 1153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->InternalFormat = internalFormat; 1154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Border = border; 1155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Width = width; 1156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Height = height; 1157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Depth = depth; 1158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Width2 = width - 2 * border; /* == 1 << img->WidthLog2; */ 1160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->WidthLog2 = _mesa_logbase2(img->Width2); 1161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch(target) { 1163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D: 1164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_BUFFER: 1165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D: 1166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height == 0) 1167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Height2 = 0; 1168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Height2 = 1; 1170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->HeightLog2 = 0; 1171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth == 0) 1172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Depth2 = 0; 1173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Depth2 = 1; 1175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->DepthLog2 = 0; 1176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D_ARRAY: 1178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D_ARRAY: 1179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Height2 = height; /* no border */ 1180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->HeightLog2 = 0; /* not used */ 1181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth == 0) 1182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Depth2 = 0; 1183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Depth2 = 1; 1185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->DepthLog2 = 0; 1186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D: 1188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_RECTANGLE: 1189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP: 1190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 1191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 1192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 1193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 1194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 1195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 1196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_EXTERNAL_OES: 1197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D: 1198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_RECTANGLE: 1199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_CUBE_MAP: 1200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Height2 = height - 2 * border; /* == 1 << img->HeightLog2; */ 1201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->HeightLog2 = _mesa_logbase2(img->Height2); 1202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth == 0) 1203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Depth2 = 0; 1204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 1205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Depth2 = 1; 1206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->DepthLog2 = 0; 1207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D_ARRAY: 1209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D_ARRAY: 1210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Height2 = height - 2 * border; /* == 1 << img->HeightLog2; */ 1211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->HeightLog2 = _mesa_logbase2(img->Height2); 1212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Depth2 = depth; /* no border */ 1213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->DepthLog2 = 0; /* not used */ 1214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_3D: 1216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_3D: 1217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Height2 = height - 2 * border; /* == 1 << img->HeightLog2; */ 1218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->HeightLog2 = _mesa_logbase2(img->Height2); 1219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Depth2 = depth - 2 * border; /* == 1 << img->DepthLog2; */ 1220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->DepthLog2 = _mesa_logbase2(img->Depth2); 1221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(NULL, "invalid target 0x%x in _mesa_init_teximage_fields()", 1224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target); 1225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->MaxNumLevels = 1228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_get_tex_max_num_levels(target, 1229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->Width2, img->Height2, img->Depth2); 1230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org img->TexFormat = format; 1231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Free and clear fields of the gl_texture_image struct. 1236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 1238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param texImage texture image structure to be cleared. 1239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * After the call, \p texImage will have no data associated with it. Its 1241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fields are cleared so that its parent object will test incomplete. 1242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 1244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_clear_texture_image(struct gl_context *ctx, 1245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage) 1246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.FreeTextureImageBuffer(ctx, texImage); 1248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clear_teximage_fields(texImage); 1249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This is the fallback for Driver.TestProxyTexImage(). Test the texture 1254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * level, width, height and depth against the ctx->Const limits for textures. 1255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * A hardware driver might override this function if, for example, the 1257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * max 3D texture size is 512x512x64 (i.e. not a cube). 1258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that width, height, depth == 0 is not an error. However, a 1260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture with zero width/height/depth will be considered "incomplete" 1261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and texturing will effectively be disabled. 1262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target one of GL_PROXY_TEXTURE_1D, GL_PROXY_TEXTURE_2D, 1264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_PROXY_TEXTURE_3D, GL_PROXY_TEXTURE_RECTANGLE_NV, 1265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_PROXY_TEXTURE_CUBE_MAP_ARB. 1266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level as passed to glTexImage 1267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param internalFormat as passed to glTexImage 1268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format as passed to glTexImage 1269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type as passed to glTexImage 1270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width as passed to glTexImage 1271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height as passed to glTexImage 1272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param depth as passed to glTexImage 1273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param border as passed to glTexImage 1274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if the image is acceptable, GL_FALSE if not acceptable. 1275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLboolean 1277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_test_proxy_teximage(struct gl_context *ctx, GLenum target, GLint level, 1278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint internalFormat, GLenum format, GLenum type, 1279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint width, GLint height, GLint depth, GLint border) 1280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint maxSize; 1282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) internalFormat; 1284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) format; 1285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) type; 1286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 1288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D: 1289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level >= ctx->Const.MaxTextureLevels) 1290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); /* level zero size */ 1292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize >>= level; /* level size */ 1293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width < 2 * border || width > 2 * border + maxSize) 1294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_texture_non_power_of_two) { 1296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) 1297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D: 1302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level >= ctx->Const.MaxTextureLevels) 1303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); 1305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize >>= level; 1306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width < 2 * border || width > 2 * border + maxSize) 1307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height < 2 * border || height > 2 * border + maxSize) 1309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_texture_non_power_of_two) { 1311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) 1312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height > 0 && !_mesa_is_pow_two(height - 2 * border)) 1314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_3D: 1319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level >= ctx->Const.Max3DTextureLevels) 1320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize = 1 << (ctx->Const.Max3DTextureLevels - 1); 1322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize >>= level; 1323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width < 2 * border || width > 2 * border + maxSize) 1324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height < 2 * border || height > 2 * border + maxSize) 1326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth < 2 * border || depth > 2 * border + maxSize) 1328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_texture_non_power_of_two) { 1330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) 1331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height > 0 && !_mesa_is_pow_two(height - 2 * border)) 1333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth > 0 && !_mesa_is_pow_two(depth - 2 * border)) 1335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_RECTANGLE_NV: 1340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level != 0) 1341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize = ctx->Const.MaxTextureRectSize; 1343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width < 0 || width > maxSize) 1344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height < 0 || height > maxSize) 1346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_CUBE_MAP_ARB: 1350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level >= ctx->Const.MaxCubeTextureLevels) 1351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize = 1 << (ctx->Const.MaxCubeTextureLevels - 1); 1353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize >>= level; 1354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width < 2 * border || width > 2 * border + maxSize) 1355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height < 2 * border || height > 2 * border + maxSize) 1357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_texture_non_power_of_two) { 1359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) 1360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height > 0 && !_mesa_is_pow_two(height - 2 * border)) 1362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 1367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level >= ctx->Const.MaxTextureLevels) 1368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); 1370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize >>= level; 1371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width < 2 * border || width > 2 * border + maxSize) 1372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height < 1 || height > ctx->Const.MaxArrayTextureLayers) 1374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_texture_non_power_of_two) { 1376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) 1377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 1382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level >= ctx->Const.MaxTextureLevels) 1383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize = 1 << (ctx->Const.MaxTextureLevels - 1); 1385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxSize >>= level; 1386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width < 2 * border || width > 2 * border + maxSize) 1387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height < 2 * border || height > 2 * border + maxSize) 1389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth < 1 || depth > ctx->Const.MaxArrayTextureLayers) 1391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_texture_non_power_of_two) { 1393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width > 0 && !_mesa_is_pow_two(width - 2 * border)) 1394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height > 0 && !_mesa_is_pow_two(height - 2 * border)) 1396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "Invalid target in _mesa_test_proxy_teximage"); 1402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check if the memory used by the texture would exceed the driver's limit. 1409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * This lets us support a max 3D texture size of 8K (for example) but 1410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * prevents allocating a full 8K x 8K x 8K texture. 1411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * XXX this could be rolled into the proxy texture size test (above) but 1412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * we don't have the actual texture internal format at that point. 1413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglegal_texture_size(struct gl_context *ctx, gl_format format, 1416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint width, GLint height, GLint depth) 1417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t bytes = _mesa_format_image_size64(format, width, height, depth); 1419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org uint64_t mbytes = bytes / (1024 * 1024); /* convert to MB */ 1420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return mbytes <= (uint64_t) ctx->Const.MaxTextureMbytes; 1421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return true if the format is only valid for glCompressedTexImage. 1426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompressedteximage_only_format(const struct gl_context *ctx, GLenum format) 1429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 1431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ETC1_RGB8_OES: 1432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGB8_OES: 1433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGBA8_OES: 1434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_R5_G6_B5_OES: 1435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGBA4_OES: 1436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGB5_A1_OES: 1437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGB8_OES: 1438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGBA8_OES: 1439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_R5_G6_B5_OES: 1440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGBA4_OES: 1441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGB5_A1_OES: 1442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper function to determine whether a target and specific compression 1451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * format are supported. 1452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtarget_can_be_compressed(const struct gl_context *ctx, GLenum target, 1455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum intFormat) 1456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) intFormat; /* not used yet */ 1458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 1460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D: 1461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D: 1462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; /* true for any compressed format so far */ 1463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_CUBE_MAP: 1464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 1465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 1466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 1467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 1468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 1469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 1470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Extensions.ARB_texture_cube_map; 1471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 1472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D_ARRAY_EXT: 1473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (ctx->Extensions.MESA_texture_array || 1474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_array); 1475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check if the given texture target value is legal for a 1483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glTexImage1/2/3D call. 1484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglegal_teximage_target(struct gl_context *ctx, GLuint dims, GLenum target) 1487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dims) { 1489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 1490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 1491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D: 1492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D: 1493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_is_desktop_gl(ctx); 1494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 1499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D: 1500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D: 1502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_is_desktop_gl(ctx); 1503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_CUBE_MAP: 1504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_is_desktop_gl(ctx) 1505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ctx->Extensions.ARB_texture_cube_map; 1506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 1507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 1508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 1509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 1510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 1511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 1512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Extensions.ARB_texture_cube_map; 1513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_RECTANGLE_NV: 1514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_RECTANGLE_NV: 1515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_is_desktop_gl(ctx) 1516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ctx->Extensions.NV_texture_rectangle; 1517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D_ARRAY_EXT: 1518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_1D_ARRAY_EXT: 1519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_is_desktop_gl(ctx) 1520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && (ctx->Extensions.MESA_texture_array || 1521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_array); 1522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 1526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 1527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_3D: 1528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_3D: 1530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_is_desktop_gl(ctx); 1531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D_ARRAY_EXT: 1532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (_mesa_is_desktop_gl(ctx) 1533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && (ctx->Extensions.MESA_texture_array || 1534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_array)) 1535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || _mesa_is_gles3(ctx); 1536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PROXY_TEXTURE_2D_ARRAY_EXT: 1537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_is_desktop_gl(ctx) 1538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && (ctx->Extensions.MESA_texture_array || 1539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_array); 1540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "invalid dims=%u in legal_teximage_target()", dims); 1545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check if the given texture target value is legal for a 1552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * glTexSubImage, glCopyTexSubImage or glCopyTexImage call. 1553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * The difference compared to legal_teximage_target() above is that 1554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * proxy targets are not supported. 1555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orglegal_texsubimage_target(struct gl_context *ctx, GLuint dims, GLenum target) 1558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dims) { 1560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 1561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_is_desktop_gl(ctx) && target == GL_TEXTURE_1D; 1562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 1563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 1564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D: 1565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_X: 1567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_X: 1568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Y: 1569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Y: 1570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_POSITIVE_Z: 1571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_CUBE_MAP_NEGATIVE_Z: 1572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->Extensions.ARB_texture_cube_map; 1573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_RECTANGLE_NV: 1574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_is_desktop_gl(ctx) 1575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && ctx->Extensions.NV_texture_rectangle; 1576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_1D_ARRAY_EXT: 1577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_is_desktop_gl(ctx) 1578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && (ctx->Extensions.MESA_texture_array || 1579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_array); 1580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 1584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 1585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_3D: 1586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D_ARRAY_EXT: 1588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return (_mesa_is_desktop_gl(ctx) 1589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && (ctx->Extensions.MESA_texture_array || 1590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Extensions.EXT_texture_array)) 1591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || _mesa_is_gles3(ctx); 1592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_problem(ctx, "invalid dims=%u in legal_texsubimage_target()", 1597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims); 1598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Helper function to determine if a texture object is mutable (in terms 1605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * of GL_ARB_texture_storage). 1606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 1608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgmutable_tex_object(struct gl_context *ctx, GLenum target) 1609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Extensions.ARB_texture_storage) { 1611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj = 1612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_get_current_tex_object(ctx, target); 1613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return !texObj->Immutable; 1614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgGLenum 1620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_es_error_check_format_and_type(GLenum format, GLenum type, 1621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unsigned dimensions) 1622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool type_valid = true; 1624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (format) { 1626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 1627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 1628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 1629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type_valid = (type == GL_UNSIGNED_BYTE 1630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || type == GL_FLOAT 1631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || type == GL_HALF_FLOAT_OES); 1632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 1635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type_valid = (type == GL_UNSIGNED_BYTE 1636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || type == GL_UNSIGNED_SHORT_5_6_5 1637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || type == GL_FLOAT 1638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || type == GL_HALF_FLOAT_OES); 1639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 1642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type_valid = (type == GL_UNSIGNED_BYTE 1643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || type == GL_UNSIGNED_SHORT_4_4_4_4 1644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || type == GL_UNSIGNED_SHORT_5_5_5_1 1645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || type == GL_FLOAT 1646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || type == GL_HALF_FLOAT_OES 1647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || type == GL_UNSIGNED_INT_2_10_10_10_REV); 1648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_COMPONENT: 1651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This format is filtered against invalid dimensionalities elsewhere. 1652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type_valid = (type == GL_UNSIGNED_SHORT 1654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org || type == GL_UNSIGNED_INT); 1655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_DEPTH_STENCIL: 1658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This format is filtered against invalid dimensionalities elsewhere. 1659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type_valid = (type == GL_UNSIGNED_INT_24_8); 1661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_BGRA_EXT: 1664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type_valid = (type == GL_UNSIGNED_BYTE); 1665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This feels like a bug in the EXT_texture_format_BGRA8888 spec, but 1667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * the format does not appear to be allowed for 3D textures in OpenGL 1668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * ES. 1669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dimensions != 2) 1671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_VALUE; 1672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 1674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 1676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_VALUE; 1677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return type_valid ? GL_NO_ERROR : GL_INVALID_OPERATION; 1680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return expected size of a compressed texture. 1686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLuint 1688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompressed_tex_size(GLsizei width, GLsizei height, GLsizei depth, 1689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum glformat) 1690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format mesaFormat = _mesa_glenum_to_compressed_format(glformat); 1692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return _mesa_format_image_size(mesaFormat, width, height, depth); 1693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 1697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Return compressed texture block size, in pixels. 1698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 1700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_compressed_block_size(GLenum glformat, GLuint *bw, GLuint *bh) 1701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format mesaFormat = _mesa_glenum_to_compressed_format(glformat); 1703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_get_format_block_size(mesaFormat, bw, bh); 1704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Special value returned by error some texture error checking functions when 1709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * an error is detected and the proxy texture image's width/height/depth/format 1710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * fields should be zeroed-out. 1711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#define PROXY_ERROR 2 1713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test the glTexImage[123]D() parameters for errors. 1717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 1719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dimensions texture image dimensions (must be 1, 2 or 3). 1720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target given by the user. 1721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level image level given by the user. 1722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param internalFormat internal format given by the user. 1723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format pixel data format given by the user. 1724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type pixel data type given by the user. 1725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width image width given by the user. 1726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height image height given by the user. 1727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param depth image depth given by the user. 1728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param border image border given by the user. 1729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return PROXY_ERROR if there's an error that should zero-out the proxy image, 1731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_TRUE if a regular GL error is found, or GL_FALSE if no error, 1732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 1733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies each of the parameters against the constants specified in 1734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __struct gl_contextRec::Const and the supported extensions, and according 1735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the OpenGL specification. 1736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLenum 1738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtexture_error_check( struct gl_context *ctx, 1739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint dimensions, GLenum target, 1740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint level, GLint internalFormat, 1741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLenum type, 1742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint width, GLint height, 1743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint depth, GLint border ) 1744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum proxyTarget = _mesa_get_proxy_target(target); 1746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean isProxy = target == proxyTarget; 1747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean sizeOK = GL_TRUE; 1748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean colorFormat; 1749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum err; 1750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Even though there are no color-index textures, we still have to support 1752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * uploading color-index data and remapping it to RGB via the 1753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_PIXEL_MAP_I_TO_[RGBA] tables. 1754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLboolean indexFormat = (format == GL_COLOR_INDEX); 1756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Note: for proxy textures, some error conditions immediately generate 1758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * a GL error in the usual way. But others do not generate a GL error. 1759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Instead, they cause the width, height, depth, format fields of the 1760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture image to be zeroed-out. The GL spec seems to indicate that the 1761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * zero-out behaviour is only used in cases related to memory allocation. 1762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Basic level check (more checking in ctx->Driver.TestProxyTexImage) */ 1765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level < 0 || level >= MAX_TEXTURE_LEVELS) { 1766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 1767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(level=%d)", dimensions, level); 1768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check border */ 1772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (border < 0 || border > 1 || 1773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((ctx->API != API_OPENGL || 1774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target == GL_TEXTURE_RECTANGLE_NV || 1775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target == GL_PROXY_TEXTURE_RECTANGLE_NV) && border != 0)) { 1776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 1777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(border=%d)", dimensions, border); 1778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width < 0 || height < 0 || depth < 0) { 1782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 1783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(width, height or depth < 0)", dimensions); 1784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* OpenGL ES 1.x and OpenGL ES 2.0 impose additional restrictions on the 1788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * combinations of format, internalFormat, and type that can be used. 1789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Formats and types that require additional extensions (e.g., GL_FLOAT 1790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * requires GL_OES_texture_float) are filtered elsewhere. 1791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_gles(ctx) && !_mesa_is_gles3(ctx)) { 1793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (format != internalFormat) { 1794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 1795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(format = %s, internalFormat = %s)", 1796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, 1797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(format), 1798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(internalFormat)); 1799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org err = _mesa_es_error_check_format_and_type(format, type, dimensions); 1803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (err != GL_NO_ERROR) { 1804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, err, 1805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(format = %s, type = %s)", 1806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, 1807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(format), 1808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(type)); 1809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Do this simple check before calling the TestProxyTexImage() function */ 1814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (proxyTarget == GL_PROXY_TEXTURE_CUBE_MAP_ARB) { 1815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeOK = (width == height); 1816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Use the proxy texture driver hook to see if the size/level/etc are 1820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * legal. 1821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeOK = sizeOK && ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level, 1823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat, format, 1824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type, width, height, 1825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth, border); 1826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!sizeOK) { 1827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (isProxy) { 1828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No GL error is recorded, but we need to zero-out the image dims */ 1829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PROXY_ERROR; 1830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 1832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 1833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(level=%d, width=%d, height=%d, depth=%d)", 1834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, level, width, height, depth); 1835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check internalFormat */ 1840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_base_tex_format(ctx, internalFormat) < 0) { 1841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 1842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(internalFormat=%s)", 1843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, _mesa_lookup_enum_by_nr(internalFormat)); 1844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check incoming image format and type */ 1848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org err = _mesa_error_check_format_and_type(ctx, format, type); 1849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (err != GL_NO_ERROR) { 1850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, err, 1851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(incompatible format 0x%x, type 0x%x)", 1852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, format, type); 1853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* make sure internal format and format basically agree */ 1857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org colorFormat = _mesa_is_color_format(format); 1858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((_mesa_is_color_format(internalFormat) && !colorFormat && !indexFormat) || 1859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (_mesa_is_depth_format(internalFormat) != _mesa_is_depth_format(format)) || 1860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (_mesa_is_ycbcr_format(internalFormat) != _mesa_is_ycbcr_format(format)) || 1861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (_mesa_is_depthstencil_format(internalFormat) != _mesa_is_depthstencil_format(format)) || 1862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (_mesa_is_dudv_format(internalFormat) != _mesa_is_dudv_format(format))) { 1863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 1864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(incompatible internalFormat 0x%x, format 0x%x)", 1865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, internalFormat, format); 1866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* additional checks for ycbcr textures */ 1870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (internalFormat == GL_YCBCR_MESA) { 1871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(ctx->Extensions.MESA_ycbcr_texture); 1872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (type != GL_UNSIGNED_SHORT_8_8_MESA && 1873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type != GL_UNSIGNED_SHORT_8_8_REV_MESA) { 1874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char message[100]; 1875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_snprintf(message, sizeof(message), 1876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(format/type YCBCR mismatch)", 1877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions); 1878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "%s", message); 1879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; /* error */ 1880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target != GL_TEXTURE_2D && 1882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target != GL_PROXY_TEXTURE_2D && 1883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target != GL_TEXTURE_RECTANGLE_NV && 1884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target != GL_PROXY_TEXTURE_RECTANGLE_NV) { 1885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, 1886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(bad target for YCbCr texture)", 1887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions); 1888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (border != 0) { 1891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char message[100]; 1892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_snprintf(message, sizeof(message), 1893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(format=GL_YCBCR_MESA and border=%d)", 1894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, border); 1895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "%s", message); 1896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* additional checks for depth textures */ 1901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_base_tex_format(ctx, internalFormat) == GL_DEPTH_COMPONENT) { 1902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Only 1D, 2D, rect, array and cube textures supported, not 3D 1903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Cubemaps are only supported for GL version > 3.0 or with EXT_gpu_shader4 */ 1904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target != GL_TEXTURE_1D && 1905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target != GL_PROXY_TEXTURE_1D && 1906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target != GL_TEXTURE_2D && 1907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target != GL_PROXY_TEXTURE_2D && 1908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target != GL_TEXTURE_1D_ARRAY && 1909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target != GL_PROXY_TEXTURE_1D_ARRAY && 1910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target != GL_TEXTURE_2D_ARRAY && 1911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target != GL_PROXY_TEXTURE_2D_ARRAY && 1912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target != GL_TEXTURE_RECTANGLE_ARB && 1913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target != GL_PROXY_TEXTURE_RECTANGLE_ARB && 1914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org !((_mesa_is_cube_face(target) || target == GL_PROXY_TEXTURE_CUBE_MAP) && 1915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (ctx->Version >= 30 || ctx->Extensions.EXT_gpu_shader4))) { 1916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, 1917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(bad target for depth texture)", 1918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions); 1919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* additional checks for compressed textures */ 1924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_compressed_format(ctx, internalFormat)) { 1925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!target_can_be_compressed(ctx, target, internalFormat)) { 1926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, 1927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(target can't be compressed)", dimensions); 1928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (compressedteximage_only_format(ctx, internalFormat)) { 1931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 1932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(no compression for format)", dimensions); 1933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (border != 0) { 1936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 1937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(border!=0)", dimensions); 1938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* additional checks for integer textures */ 1943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((ctx->Version >= 30 || ctx->Extensions.EXT_texture_integer) && 1944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (_mesa_is_enum_format_integer(format) != 1945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_is_enum_format_integer(internalFormat))) { 1946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 1947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(integer/non-integer format mismatch)", 1948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions); 1949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!mutable_tex_object(ctx, target)) { 1953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 1954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%dD(immutable texture)", dimensions); 1955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 1956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if we get here, the parameters are OK */ 1959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 1960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 1961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 1964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Error checking for glCompressedTexImage[123]D(). 1965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param reason returns reason for error, if any 1966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return error code or GL_NO_ERROR or PROXY_ERROR. 1967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 1968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLenum 1969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompressed_texture_error_check(struct gl_context *ctx, GLint dimensions, 1970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, GLint level, 1971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum internalFormat, GLsizei width, 1972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei height, GLsizei depth, GLint border, 1973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei imageSize) 1974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 1975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum proxyTarget = _mesa_get_proxy_target(target); 1976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLint maxLevels = _mesa_max_texture_levels(ctx, target); 1977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint expectedSize; 1978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum choose_format; 1979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum choose_type; 1980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum proxy_format; 1981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum error = GL_NO_ERROR; 1982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org char *reason = ""; /* no error */ 1983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!target_can_be_compressed(ctx, target, internalFormat)) { 1985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reason = "target"; 1986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = GL_INVALID_ENUM; 1987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 1988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This will detect any invalid internalFormat value */ 1991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_mesa_is_compressed_format(ctx, internalFormat)) { 1992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reason = "internalFormat"; 1993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = GL_INVALID_ENUM; 1994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 1995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 1996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 1998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_ES 1999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGB8_OES: 2000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGBA8_OES: 2001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_R5_G6_B5_OES: 2002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGBA4_OES: 2003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGB5_A1_OES: 2004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGB8_OES: 2005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGBA8_OES: 2006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_R5_G6_B5_OES: 2007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGBA4_OES: 2008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGB5_A1_OES: 2009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_cpal_compressed_format_type(internalFormat, &choose_format, 2010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &choose_type); 2011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org proxy_format = choose_format; 2012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check level (note that level should be zero or less!) */ 2014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level > 0 || level < -maxLevels) { 2015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reason = "level"; 2016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = GL_INVALID_VALUE; 2017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 2018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dimensions != 2) { 2021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reason = "compressed paletted textures must be 2D"; 2022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = GL_INVALID_OPERATION; 2023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 2024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Figure out the expected texture size (in bytes). This will be 2027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * checked against the actual size later. 2028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org expectedSize = _mesa_cpal_compressed_size(level, internalFormat, 2030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height); 2031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This is for the benefit of the TestProxyTexImage below. It expects 2033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * level to be non-negative. OES_compressed_paletted_texture uses a 2034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * weird mechanism where the level specified to glCompressedTexImage2D 2035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * is -(n-1) number of levels in the texture, and the data specifies the 2036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * complete mipmap stack. This is done to ensure the palette is the 2037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * same for all levels. 2038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org level = -level; 2040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 2042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org choose_format = GL_NONE; 2045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org choose_type = GL_NONE; 2046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org proxy_format = internalFormat; 2047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check level */ 2049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level < 0 || level >= maxLevels) { 2050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reason = "level"; 2051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = GL_INVALID_VALUE; 2052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 2053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Figure out the expected texture size (in bytes). This will be 2056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * checked against the actual size later. 2057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org expectedSize = compressed_tex_size(width, height, depth, internalFormat); 2059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* This should really never fail */ 2063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_base_tex_format(ctx, internalFormat) < 0) { 2064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reason = "internalFormat"; 2065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = GL_INVALID_ENUM; 2066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 2067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No compressed formats support borders at this time */ 2070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (border != 0) { 2071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reason = "border != 0"; 2072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = GL_INVALID_VALUE; 2073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 2074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* For cube map, width must equal height */ 2077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_cube_face(target) && width != height) { 2078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reason = "width != height"; 2079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = GL_INVALID_VALUE; 2080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 2081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check image sizes */ 2084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level, 2085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org proxy_format, choose_format, 2086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org choose_type, 2087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, border)) { 2088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* See error comment above */ 2089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == proxyTarget) { 2090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return PROXY_ERROR; 2091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reason = "invalid width, height or format"; 2093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = GL_INVALID_OPERATION; 2094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 2095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check image size in bytes */ 2098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (expectedSize != imageSize) { 2099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Per GL_ARB_texture_compression: GL_INVALID_VALUE is generated [...] 2100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if <imageSize> is not consistent with the format, dimensions, and 2101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * contents of the specified image. 2102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reason = "imageSize inconsistant with width/height/format"; 2104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = GL_INVALID_VALUE; 2105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 2106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!mutable_tex_object(ctx, target)) { 2109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org reason = "immutable texture"; 2110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = GL_INVALID_OPERATION; 2111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org goto error; 2112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_NO_ERROR; 2115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgerror: 2117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, error, "glCompressedTexImage%dD(%s)", dimensions, reason); 2118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return error; 2119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test glTexSubImage[123]D() parameters for errors. 2125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 2127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dimensions texture image dimensions (must be 1, 2 or 3). 2128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target given by the user. 2129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level image level given by the user. 2130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param xoffset sub-image x offset given by the user. 2131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param yoffset sub-image y offset given by the user. 2132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param zoffset sub-image z offset given by the user. 2133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format pixel data format given by the user. 2134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type pixel data type given by the user. 2135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width image width given by the user. 2136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height image height given by the user. 2137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param depth image depth given by the user. 2138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if an error was detected, or GL_FALSE if no errors. 2140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies each of the parameters against the constants specified in 2142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __struct gl_contextRec::Const and the supported extensions, and according 2143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the OpenGL specification. 2144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsubtexture_error_check( struct gl_context *ctx, GLuint dimensions, 2147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, GLint level, 2148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 2149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint width, GLint height, GLint depth, 2150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLenum type ) 2151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum err; 2153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Basic level check */ 2155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level < 0 || level >= MAX_TEXTURE_LEVELS) { 2156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glTexSubImage2D(level=%d)", level); 2157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check for negative sizes */ 2161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width < 0) { 2162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexSubImage%dD(width=%d)", dimensions, width); 2164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (height < 0 && dimensions > 1) { 2167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexSubImage%dD(height=%d)", dimensions, height); 2169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (depth < 0 && dimensions > 2) { 2172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexSubImage%dD(depth=%d)", dimensions, depth); 2174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* OpenGL ES 1.x and OpenGL ES 2.0 impose additional restrictions on the 2178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * combinations of format and type that can be used. Formats and types 2179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * that require additional extensions (e.g., GL_FLOAT requires 2180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * GL_OES_texture_float) are filtered elsewhere. 2181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_gles(ctx) && !_mesa_is_gles3(ctx)) { 2183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org err = _mesa_es_error_check_format_and_type(format, type, dimensions); 2184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (err != GL_NO_ERROR) { 2185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, err, 2186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexSubImage%dD(format = %s, type = %s)", 2187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, 2188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(format), 2189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(type)); 2190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org err = _mesa_error_check_format_and_type(ctx, format, type); 2195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (err != GL_NO_ERROR) { 2196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, err, 2197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexSubImage%dD(incompatible format 0x%x, type 0x%x)", 2198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, format, type); 2199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do second part of glTexSubImage which depends on the destination texture. 2208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if error recorded, GL_FALSE otherwise 2209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgsubtexture_error_check2( struct gl_context *ctx, GLuint dimensions, 2212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, GLint level, 2213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 2214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint width, GLint height, GLint depth, 2215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLenum type, 2216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_image *destTex ) 2217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!destTex) { 2219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* undefined image level */ 2220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glTexSubImage%dD", dimensions); 2221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xoffset < -((GLint)destTex->Border)) { 2225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(xoffset)", 2226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions); 2227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xoffset + width > (GLint) (destTex->Width + destTex->Border)) { 2230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(xoffset+width)", 2231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions); 2232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dimensions > 1) { 2235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint yBorder = (target == GL_TEXTURE_1D_ARRAY) ? 0 : destTex->Border; 2236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (yoffset < -yBorder) { 2237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(yoffset)", 2238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions); 2239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (yoffset + height > (GLint) destTex->Height + yBorder) { 2242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage%dD(yoffset+height)", 2243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions); 2244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dimensions > 2) { 2248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint zBorder = (target == GL_TEXTURE_2D_ARRAY) ? 0 : destTex->Border; 2249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (zoffset < -zBorder) { 2250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset)"); 2251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (zoffset + depth > (GLint) destTex->Depth + zBorder) { 2254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, "glTexSubImage3D(zoffset+depth)"); 2255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_format_compressed(destTex->TexFormat)) { 2260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint bw, bh; 2261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (compressedteximage_only_format(ctx, destTex->InternalFormat)) { 2263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexSubImage%dD(no compression for format)", dimensions); 2265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* do tests which depend on compression block size */ 2269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_get_format_block_size(destTex->TexFormat, &bw, &bh); 2270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* offset must be multiple of block size */ 2272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((xoffset % bw != 0) || (yoffset % bh != 0)) { 2273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexSubImage%dD(xoffset = %d, yoffset = %d)", 2275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, xoffset, yoffset); 2276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* size must be multiple of bw by bh or equal to whole texture size */ 2279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((width % bw != 0) && (GLuint) width != destTex->Width) { 2280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexSubImage%dD(width = %d)", dimensions, width); 2282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((height % bh != 0) && (GLuint) height != destTex->Height) { 2285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexSubImage%dD(height = %d)", dimensions, height); 2287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Version >= 30 || ctx->Extensions.EXT_texture_integer) { 2292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* both source and dest must be integer-valued, or neither */ 2293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_format_integer_color(destTex->TexFormat) != 2294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_is_enum_format_integer(format)) { 2295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexSubImage%dD(integer/non-integer format mismatch)", 2297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions); 2298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test glCopyTexImage[12]D() parameters for errors. 2308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 2310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dimensions texture image dimensions (must be 1, 2 or 3). 2311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target given by the user. 2312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level image level given by the user. 2313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param internalFormat internal format given by the user. 2314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width image width given by the user. 2315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height image height given by the user. 2316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param border texture border. 2317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if an error was detected, or GL_FALSE if no errors. 2319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Verifies each of the parameters against the constants specified in 2321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * __struct gl_contextRec::Const and the supported extensions, and according 2322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * to the OpenGL specification. 2323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopytexture_error_check( struct gl_context *ctx, GLuint dimensions, 2326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, GLint level, GLint internalFormat, 2327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint width, GLint height, GLint border ) 2328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum proxyTarget = _mesa_get_proxy_target(target); 2330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum type = GL_FLOAT; 2331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLboolean sizeOK; 2332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint baseFormat; 2333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check target */ 2335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!legal_texsubimage_target(ctx, dimensions, target)) { 2336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glCopyTexImage%uD(target=%s)", 2337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, _mesa_lookup_enum_by_nr(target)); 2338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Basic level check (more checking in ctx->Driver.TestProxyTexImage) */ 2342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level < 0 || level >= MAX_TEXTURE_LEVELS) { 2343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(level=%d)", dimensions, level); 2345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check that the source buffer is complete */ 2349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_user_fbo(ctx->ReadBuffer)) { 2350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->ReadBuffer->_Status == 0) { 2351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_test_framebuffer_completeness(ctx, ctx->ReadBuffer); 2352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) { 2354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT, 2355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(invalid readbuffer)", dimensions); 2356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->ReadBuffer->Visual.samples > 0) { 2360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(multisample FBO)", 2362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions); 2363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check border */ 2368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (border < 0 || border > 1 || 2369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ((ctx->API != API_OPENGL || 2370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target == GL_TEXTURE_RECTANGLE_NV || 2371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target == GL_PROXY_TEXTURE_RECTANGLE_NV) && border != 0)) { 2372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(border=%d)", dimensions, border); 2374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* OpenGL ES 1.x and OpenGL ES 2.0 impose additional restrictions on the 2378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * internalFormat. 2379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_gles(ctx) && !_mesa_is_gles3(ctx)) { 2381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 2382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA: 2383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGB: 2384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA: 2385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE: 2386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA: 2387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(internalFormat)", dimensions); 2391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org baseFormat = _mesa_base_tex_format(ctx, internalFormat); 2396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (baseFormat < 0) { 2397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(internalFormat)", dimensions); 2399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_mesa_source_buffer_exists(ctx, baseFormat)) { 2403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(missing readbuffer)", dimensions); 2405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* From the EXT_texture_integer spec: 2409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "INVALID_OPERATION is generated by CopyTexImage* and CopyTexSubImage* 2411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if the texture internalformat is an integer format and the read color 2412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffer is not an integer format, or if the internalformat is not an 2413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * integer format and the read color buffer is an integer format." 2414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_color_format(internalFormat)) { 2416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer; 2417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_enum_format_integer(rb->InternalFormat) != 2419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_is_enum_format_integer(internalFormat)) { 2420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(integer vs non-integer)", dimensions); 2422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Do size, level checking */ 2427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeOK = (proxyTarget == GL_PROXY_TEXTURE_CUBE_MAP_ARB) 2428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ? (width == height) : 1; 2429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org sizeOK = sizeOK && ctx->Driver.TestProxyTexImage(ctx, proxyTarget, level, 2431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat, baseFormat, 2432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type, width, height, 2433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 1, border); 2434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!sizeOK) { 2436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dimensions == 1) { 2437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage1D(width=%d)", width); 2439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(dimensions == 2); 2442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage2D(width=%d, height=%d)", width, height); 2444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_compressed_format(ctx, internalFormat)) { 2449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!target_can_be_compressed(ctx, target, internalFormat)) { 2450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, 2451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(target)", dimensions); 2452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (compressedteximage_only_format(ctx, internalFormat)) { 2455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(no compression for format)", dimensions); 2457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (border != 0) { 2460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(border!=0)", dimensions); 2462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!mutable_tex_object(ctx, target)) { 2467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(immutable texture)", dimensions); 2469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if we get here, the parameters are OK */ 2473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Test glCopyTexSubImage[12]D() parameters for errors. 2479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that this is the first part of error checking. 2480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * See also copytexsubimage_error_check2() below for the second part. 2481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param ctx GL context. 2483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param dimensions texture image dimensions (must be 1, 2 or 3). 2484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param target texture target given by the user. 2485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param level image level given by the user. 2486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if an error was detected, or GL_FALSE if no errors. 2488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopytexsubimage_error_check1( struct gl_context *ctx, GLuint dimensions, 2491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, GLint level) 2492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check that the source buffer is complete */ 2494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_user_fbo(ctx->ReadBuffer)) { 2495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->ReadBuffer->_Status == 0) { 2496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_test_framebuffer_completeness(ctx, ctx->ReadBuffer); 2497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->ReadBuffer->_Status != GL_FRAMEBUFFER_COMPLETE_EXT) { 2499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_FRAMEBUFFER_OPERATION_EXT, 2500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(invalid readbuffer)", dimensions); 2501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->ReadBuffer->Visual.samples > 0) { 2505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(multisample FBO)", 2507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions); 2508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check target (proxies not allowed) */ 2513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!legal_texsubimage_target(ctx, dimensions, target)) { 2514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glCopyTexSubImage%uD(target=%s)", 2515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, _mesa_lookup_enum_by_nr(target)); 2516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check level */ 2520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level < 0 || level >= MAX_TEXTURE_LEVELS) { 2521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(level=%d)", dimensions, level); 2523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Second part of error checking for glCopyTexSubImage[12]D(). 2532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param xoffset sub-image x offset given by the user. 2533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param yoffset sub-image y offset given by the user. 2534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param zoffset sub-image z offset given by the user. 2535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param width image width given by the user. 2536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param height image height given by the user. 2537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 2539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopytexsubimage_error_check2( struct gl_context *ctx, GLuint dimensions, 2540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, GLint level, 2541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 2542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, 2543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_image *teximage ) 2544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check that dest tex image exists */ 2546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!teximage) { 2547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(undefined texture level: %d)", 2549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, level); 2550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Check size */ 2554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width < 0) { 2555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(width=%d)", dimensions, width); 2557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dimensions > 1 && height < 0) { 2560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(height=%d)", dimensions, height); 2562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check x/y offsets */ 2566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xoffset < -((GLint)teximage->Border)) { 2567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(xoffset=%d)", dimensions, xoffset); 2569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (xoffset + width > (GLint) (teximage->Width + teximage->Border)) { 2572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(xoffset+width)", dimensions); 2574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dimensions > 1) { 2577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint yBorder = (target == GL_TEXTURE_1D_ARRAY) ? 0 : teximage->Border; 2578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (yoffset < -yBorder) { 2579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(yoffset=%d)", dimensions, yoffset); 2581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* NOTE: we're adding the border here, not subtracting! */ 2584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (yoffset + height > (GLint) teximage->Height + yBorder) { 2585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(yoffset+height)", dimensions); 2587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check z offset */ 2592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dimensions > 2) { 2593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint zBorder = (target == GL_TEXTURE_2D_ARRAY) ? 0 : teximage->Border; 2594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (zoffset < -zBorder) { 2595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(zoffset)", dimensions); 2597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (zoffset > (GLint) teximage->Depth + zBorder) { 2600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(zoffset+depth)", dimensions); 2602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_format_compressed(teximage->TexFormat)) { 2607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (compressedteximage_only_format(ctx, teximage->InternalFormat)) { 2608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(no compression for format)", dimensions); 2610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* offset must be multiple of 4 */ 2613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((xoffset & 3) || (yoffset & 3)) { 2614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(xoffset or yoffset)", dimensions); 2616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* size must be multiple of 4 */ 2619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((width & 3) != 0 && (GLuint) width != teximage->Width) { 2620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(width)", dimensions); 2622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((height & 3) != 0 && (GLuint) height != teximage->Height) { 2625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 2626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(height)", dimensions); 2627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (teximage->InternalFormat == GL_YCBCR_MESA) { 2632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glCopyTexSubImage2D"); 2633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_mesa_source_buffer_exists(ctx, teximage->_BaseFormat)) { 2637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexSubImage%dD(missing readbuffer, format=0x%x)", 2639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dimensions, teximage->_BaseFormat); 2640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* From the EXT_texture_integer spec: 2644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * "INVALID_OPERATION is generated by CopyTexImage* and CopyTexSubImage* 2646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * if the texture internalformat is an integer format and the read color 2647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * buffer is not an integer format, or if the internalformat is not an 2648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * integer format and the read color buffer is an integer format." 2649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_color_format(teximage->InternalFormat)) { 2651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *rb = ctx->ReadBuffer->_ColorReadBuffer; 2652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_format_integer_color(rb->Format) != 2654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_is_format_integer_color(teximage->TexFormat)) { 2655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 2656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCopyTexImage%dD(integer vs non-integer)", dimensions); 2657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 2658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* if we get here, the parameters are OK */ 2662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 2663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Callback info for walking over FBO hash table */ 2667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstruct cb_info 2668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx; 2670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj; 2671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint level, face; 2672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org}; 2673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Check render to texture callback. Called from _mesa_HashWalk(). 2677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 2679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcheck_rtt_cb(GLuint key, void *data, void *userData) 2680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_framebuffer *fb = (struct gl_framebuffer *) data; 2682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct cb_info *info = (struct cb_info *) userData; 2683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_context *ctx = info->ctx; 2684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_texture_object *texObj = info->texObj; 2685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint level = info->level, face = info->face; 2686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If this is a user-created FBO */ 2688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_user_fbo(fb)) { 2689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint i; 2690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check if any of the FBO's attachments point to 'texObj' */ 2691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org for (i = 0; i < BUFFER_COUNT; i++) { 2692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer_attachment *att = fb->Attachment + i; 2693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (att->Type == GL_TEXTURE && 2694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org att->Texture == texObj && 2695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org att->TextureLevel == level && 2696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org att->CubeMapFace == face) { 2697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(_mesa_get_attachment_teximage(att)); 2698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Tell driver about the new renderbuffer texture */ 2699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.RenderTexture(ctx, ctx->DrawBuffer, att); 2700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Mark fb status as indeterminate to force re-validation */ 2701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org fb->_Status = 0; 2702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * When a texture image is specified we have to check if it's bound to 2710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * any framebuffer objects (render to texture) in order to detect changes 2711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * in size or format since that effects FBO completeness. 2712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Any FBOs rendering into the texture must be re-validated. 2713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid 2715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_update_fbo_texture(struct gl_context *ctx, 2716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj, 2717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint face, GLuint level) 2718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Only check this texture if it's been marked as RenderToTexture */ 2720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texObj->_RenderToTexture) { 2721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct cb_info info; 2722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.ctx = ctx; 2723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.texObj = texObj; 2724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.level = level; 2725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org info.face = face; 2726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_HashWalk(ctx->Shared->FrameBuffers, check_rtt_cb, &info); 2727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * If the texture object's GenerateMipmap flag is set and we've 2733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * changed the texture base level image, regenerate the rest of the 2734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * mipmap levels now. 2735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic inline void 2737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcheck_gen_mipmap(struct gl_context *ctx, GLenum target, 2738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj, GLint level) 2739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(target != GL_TEXTURE_CUBE_MAP); 2741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texObj->GenerateMipmap && 2742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org level == texObj->BaseLevel && 2743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org level < texObj->MaxLevel) { 2744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(ctx->Driver.GenerateMipmap); 2745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.GenerateMipmap(ctx, target, texObj); 2746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** Debug helper: override the user-requested internal format */ 2751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLenum 2752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgoverride_internal_format(GLenum internalFormat, GLint width, GLint height) 2753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if 0 2755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (internalFormat == GL_RGBA16F_ARB || 2756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat == GL_RGBA32F_ARB) { 2757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("Convert rgba float tex to int %d x %d\n", width, height); 2758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGBA; 2759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (internalFormat == GL_RGB16F_ARB || 2761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat == GL_RGB32F_ARB) { 2762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("Convert rgb float tex to int %d x %d\n", width, height); 2763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_RGB; 2764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (internalFormat == GL_LUMINANCE_ALPHA16F_ARB || 2766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat == GL_LUMINANCE_ALPHA32F_ARB) { 2767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("Convert luminance float tex to int %d x %d\n", width, height); 2768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE_ALPHA; 2769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (internalFormat == GL_LUMINANCE16F_ARB || 2771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat == GL_LUMINANCE32F_ARB) { 2772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("Convert luminance float tex to int %d x %d\n", width, height); 2773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_LUMINANCE; 2774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (internalFormat == GL_ALPHA16F_ARB || 2776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat == GL_ALPHA32F_ARB) { 2777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org printf("Convert luminance float tex to int %d x %d\n", width, height); 2778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_ALPHA; 2779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 2781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (internalFormat == GL_COMPRESSED_RGBA_S3TC_DXT1_EXT) { 2782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat = GL_RGBA; 2783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return internalFormat; 2787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#else 2789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return internalFormat; 2790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 2791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Choose the actual hardware format for a texture image. 2796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Try to use the same format as the previous image level when possible. 2797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Otherwise, ask the driver for the best format. 2798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * It's important to try to choose a consistant format for all levels 2799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * for efficient texture memory layout/allocation. In particular, this 2800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * comes up during automatic mipmap generation. 2801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orggl_format 2803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_choose_texture_format(struct gl_context *ctx, 2804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj, 2805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, GLint level, 2806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum internalFormat, GLenum format, GLenum type) 2807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format f; 2809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* see if we've already chosen a format for the previous level */ 2811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level > 0) { 2812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *prevImage = 2813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_select_tex_image(ctx, texObj, target, level - 1); 2814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* See if the prev level is defined and has an internal format which 2815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * matches the new internal format. 2816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (prevImage && 2818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prevImage->Width > 0 && 2819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org prevImage->InternalFormat == internalFormat) { 2820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* use the same format */ 2821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(prevImage->TexFormat != MESA_FORMAT_NONE); 2822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return prevImage->TexFormat; 2823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If the application requested compression to an S3TC format but we don't 2827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * have the DTXn library, force a generic compressed format instead. 2828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (internalFormat != format && format != GL_NONE) { 2830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLenum before = internalFormat; 2831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 2833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGB_S3TC_DXT1_EXT: 2834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Mesa_DXTn) 2835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat = GL_COMPRESSED_RGB; 2836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGBA_S3TC_DXT1_EXT: 2838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGBA_S3TC_DXT3_EXT: 2839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_COMPRESSED_RGBA_S3TC_DXT5_EXT: 2840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Mesa_DXTn) 2841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat = GL_COMPRESSED_RGBA; 2842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 2844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 2845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (before != internalFormat) { 2848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_warning(ctx, 2849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "DXT compression requested (%s), " 2850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "but libtxc_dxtn library not installed. Using %s " 2851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "instead.", 2852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(before), 2853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(internalFormat)); 2854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* choose format from scratch */ 2858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org f = ctx->Driver.ChooseTextureFormat(ctx, texObj->Target, internalFormat, 2859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type); 2860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT(f != MESA_FORMAT_NONE); 2861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return f; 2862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Adjust pixel unpack params and image dimensions to strip off the 2866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * one-pixel texture border. 2867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Gallium and intel don't support texture borders. They've seldem been used 2869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * and seldom been implemented correctly anyway. 2870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * 2871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param unpackNew returns the new pixel unpack parameters 2872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 2874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstrip_texture_border(GLenum target, 2875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint *width, GLint *height, GLint *depth, 2876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *unpack, 2877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_pixelstore_attrib *unpackNew) 2878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(width); 2880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(height); 2881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(depth); 2882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *unpackNew = *unpack; 2884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unpackNew->RowLength == 0) 2886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unpackNew->RowLength = *width; 2887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (unpackNew->ImageHeight == 0) 2889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unpackNew->ImageHeight = *height; 2890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org assert(*width >= 3); 2892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unpackNew->SkipPixels++; /* skip the border */ 2893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *width = *width - 2; /* reduce the width by two border pixels */ 2894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The min height of a texture with a border is 3 */ 2896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*height >= 3 && target != GL_TEXTURE_1D_ARRAY) { 2897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unpackNew->SkipRows++; /* skip the border */ 2898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *height = *height - 2; /* reduce the height by two border pixels */ 2899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (*depth >= 3 && target != GL_TEXTURE_2D_ARRAY) { 2902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unpackNew->SkipImages++; /* skip the border */ 2903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org *depth = *depth - 2; /* reduce the depth by two border pixels */ 2904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 2906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 2909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Common code to implement all the glTexImage1D/2D/3D functions 2910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * as well as glCompressedTexImage1D/2D/3D. 2911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param compressed only GL_TRUE for glCompressedTexImage1D/2D/3D calls. 2912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param format the user's image format (only used if !compressed) 2913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param type the user's image type (only used if !compressed) 2914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \param imageSize only used for glCompressedTexImage1D/2D/3D calls. 2915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 2917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgteximage(struct gl_context *ctx, GLboolean compressed, GLuint dims, 2918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, GLint level, GLint internalFormat, 2919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, GLsizei depth, 2920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint border, GLenum format, GLenum type, 2921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei imageSize, const GLvoid *pixels) 2922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 2923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const char *func = compressed ? "glCompressedTexImage" : "glTexImage"; 2924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum error; 2925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_pixelstore_attrib unpack_no_border; 2926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const struct gl_pixelstore_attrib *unpack = &ctx->Unpack; 2927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 2929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) { 2931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (compressed) 2932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, 2933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCompressedTexImage%uD %s %d %s %d %d %d %d %p\n", 2934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims, 2935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(target), level, 2936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(internalFormat), 2937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, border, pixels); 2938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else 2939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, 2940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glTexImage%uD %s %d %s %d %d %d %d %s %s %p\n", 2941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims, 2942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(target), level, 2943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(internalFormat), 2944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, border, 2945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(format), 2946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(type), pixels); 2947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat = override_internal_format(internalFormat, width, height); 2950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* target error checking */ 2952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!legal_teximage_target(ctx, dims, target)) { 2953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "%s%uD(target=%s)", 2954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org func, dims, _mesa_lookup_enum_by_nr(target)); 2955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 2956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* general error checking */ 2959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (compressed) { 2960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = compressed_texture_error_check(ctx, dims, target, level, 2961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat, 2962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, 2963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border, imageSize); 2964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 2966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = texture_error_check(ctx, dims, target, level, internalFormat, 2967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type, width, height, depth, border); 2968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_ES 2971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Here we convert a cpal compressed image into a regular glTexImage2D 2972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * call by decompressing the texture. If we really want to support cpal 2973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * textures in any driver this would have to be changed. 2974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 2975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (compressed && !error && dims == 2) { 2976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 2977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGB8_OES: 2978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGBA8_OES: 2979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_R5_G6_B5_OES: 2980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGBA4_OES: 2981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE4_RGB5_A1_OES: 2982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGB8_OES: 2983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGBA8_OES: 2984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_R5_G6_B5_OES: 2985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGBA4_OES: 2986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_PALETTE8_RGB5_A1_OES: 2987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_cpal_compressed_teximage2d(target, level, internalFormat, 2988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, imageSize, pixels); 2989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 2990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 2992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 2993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 2994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_is_proxy_texture(target)) { 2995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Proxy texture: just clear or set state depending on error checking */ 2996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage = 2997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_proxy_tex_image(ctx, target, level); 2998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format texFormat = MESA_FORMAT_NONE; 2999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!error) { 3001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* No parameter errors. Choose a texture format and see if we 3002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * can really allocate the texture. 3003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj = 3005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_get_current_tex_object(ctx, target); 3006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texFormat = _mesa_choose_texture_format(ctx, texObj, target, level, 3007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat, format, type); 3008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!legal_texture_size(ctx, texFormat, width, height, depth)) { 3009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = PROXY_ERROR; 3010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (error == PROXY_ERROR) { 3014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* image too large, etc. Clear all proxy texture image parameters. */ 3015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texImage) 3016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org clear_teximage_fields(texImage); 3017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (error == GL_FALSE) { 3019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* no error: store the teximage parameters */ 3020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texImage) 3021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_init_teximage_fields(ctx, texImage, width, height, depth, 3022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border, internalFormat, texFormat); 3023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* other, regular error (was already recorded) */ 3026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* non-proxy target */ 3030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint face = _mesa_tex_target_to_face(target); 3031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj; 3032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage; 3033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (error) { 3035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; /* error was recorded */ 3036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Allow a hardware driver to just strip out the border, to provide 3039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * reliable but slightly incorrect hardware rendering instead of 3040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * rarely-tested software fallback rendering. 3041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (border && ctx->Const.StripTextureBorder) { 3043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org strip_texture_border(target, &width, &height, &depth, unpack, 3044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &unpack_no_border); 3045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border = 0; 3046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org unpack = &unpack_no_border; 3047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->NewState & _NEW_PIXEL) 3050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_state(ctx); 3051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj = _mesa_get_current_tex_object(ctx, target); 3053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lock_texture(ctx, texObj); 3055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 3056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage = _mesa_get_tex_image(ctx, texObj, target, level); 3057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!texImage) { 3059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s%uD", func, dims); 3060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format texFormat; 3063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.FreeTextureImageBuffer(ctx, texImage); 3065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texFormat = _mesa_choose_texture_format(ctx, texObj, target, level, 3067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat, format, 3068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type); 3069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (legal_texture_size(ctx, texFormat, width, height, depth)) { 3071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_init_teximage_fields(ctx, texImage, 3072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, 3073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border, internalFormat, texFormat); 3074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Give the texture to the driver. <pixels> may be null. */ 3076f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width > 0 && height > 0 && depth > 0) { 3077f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (compressed) { 3078f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.CompressedTexImage(ctx, dims, texImage, 3079f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org imageSize, pixels); 3080f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3081f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3082f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.TexImage(ctx, dims, texImage, format, 3083f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org type, pixels, unpack); 3084f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3085f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3086f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3087f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_gen_mipmap(ctx, target, texObj, level); 3088f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3089f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_fbo_texture(ctx, texObj, face, level); 3090f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3091f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_dirty_texobj(ctx, texObj, GL_TRUE); 3092f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3093f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3094f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "%s%uD", func, dims); 3095f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3096f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3097f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3098f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unlock_texture(ctx, texObj); 3099f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3100f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3101f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3102f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3103f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3104f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called from the API. Note that width includes the border. 3105f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3106f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3107f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexImage1D( GLenum target, GLint level, GLint internalFormat, 3108f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLint border, GLenum format, 3109f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum type, const GLvoid *pixels ) 3110f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3111f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3112f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org teximage(ctx, GL_FALSE, 1, target, level, internalFormat, width, 1, 1, 3113f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border, format, type, 0, pixels); 3114f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3115f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3116f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3117f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3118f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexImage2D( GLenum target, GLint level, GLint internalFormat, 3119f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, GLint border, 3120f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLenum type, 3121f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *pixels ) 3122f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3123f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3124f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org teximage(ctx, GL_FALSE, 2, target, level, internalFormat, width, height, 1, 3125f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border, format, type, 0, pixels); 3126f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3127f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3128f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3129f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/* 3130f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Called by the API or display list executor. 3131f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Note that width and height include the border. 3132f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3133f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3134f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexImage3D( GLenum target, GLint level, GLint internalFormat, 3135f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, GLsizei depth, 3136f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint border, GLenum format, GLenum type, 3137f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *pixels ) 3138f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3139f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3140f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org teximage(ctx, GL_FALSE, 3, target, level, internalFormat, 3141f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, 3142f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border, format, type, 0, pixels); 3143f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3144f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3145f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3146f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3147f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexImage3DEXT( GLenum target, GLint level, GLenum internalFormat, 3148f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, GLsizei depth, 3149f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint border, GLenum format, GLenum type, 3150f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *pixels ) 3151f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3152f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_TexImage3D(target, level, (GLint) internalFormat, width, height, 3153f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth, border, format, type, pixels); 3154f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3155f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3156f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3157f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#if FEATURE_OES_EGL_image 3158f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3159f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_EGLImageTargetTexture2DOES (GLenum target, GLeglImageOES image) 3160f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3161f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj; 3162f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage; 3163f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bool valid_target; 3164f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3165f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3166f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3167f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (target) { 3168f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_2D: 3169f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org valid_target = ctx->Extensions.OES_EGL_image; 3170f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3171f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_TEXTURE_EXTERNAL_OES: 3172f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org valid_target = ctx->Extensions.OES_EGL_image_external; 3173f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3174f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 3175f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org valid_target = false; 3176f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org break; 3177f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3178f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3179f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!valid_target) { 3180f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, 3181f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glEGLImageTargetTexture2D(target=%d)", target); 3182f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 3183f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3184f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3185f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->NewState & _NEW_PIXEL) 3186f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_state(ctx); 3187f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3188f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj = _mesa_get_current_tex_object(ctx, target); 3189f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lock_texture(ctx, texObj); 3190f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3191f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (texObj->Immutable) { 3192f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 3193f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glEGLImageTargetTexture2D(texture is immutable)"); 3194f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unlock_texture(ctx, texObj); 3195f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 3196f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3197f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3198f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage = _mesa_get_tex_image(ctx, texObj, target, 0); 3199f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!texImage) { 3200f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "glEGLImageTargetTexture2D"); 3201f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } else { 3202f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.FreeTextureImageBuffer(ctx, texImage); 3203f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3204f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.EGLImageTargetTexture2D(ctx, target, 3205f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj, texImage, image); 3206f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3207f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_dirty_texobj(ctx, texObj, GL_TRUE); 3208f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3209f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unlock_texture(ctx, texObj); 3210f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3211f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3212f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org#endif 3213f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3214f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3215f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3216f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 3217f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Implement all the glTexSubImage1/2/3D() functions. 3218f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3219f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 3220f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgtexsubimage(struct gl_context *ctx, GLuint dims, GLenum target, GLint level, 3221f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 3222f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, GLsizei depth, 3223f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLenum type, const GLvoid *pixels ) 3224f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3225f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj; 3226f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage; 3227f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3228f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3229f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3230f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) 3231f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, "glTexSubImage%uD %s %d %d %d %d %d %d %d %s %s %p\n", 3232f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims, 3233f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(target), level, 3234f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset, yoffset, zoffset, width, height, depth, 3235f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(format), 3236f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(type), pixels); 3237f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3238f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* check target (proxies not allowed) */ 3239f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!legal_texsubimage_target(ctx, dims, target)) { 3240f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glTexSubImage%uD(target=%s)", 3241f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims, _mesa_lookup_enum_by_nr(target)); 3242f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 3243f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3244f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3245f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->NewState & _NEW_PIXEL) 3246f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_state(ctx); 3247f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3248f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (subtexture_error_check(ctx, dims, target, level, xoffset, yoffset, zoffset, 3249f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, format, type)) { 3250f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; /* error was detected */ 3251f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3252f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3253f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj = _mesa_get_current_tex_object(ctx, target); 3254f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3255f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lock_texture(ctx, texObj); 3256f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 3257f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage = _mesa_select_tex_image(ctx, texObj, target, level); 3258f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3259f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (subtexture_error_check2(ctx, dims, target, level, 3260f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset, yoffset, zoffset, 3261f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, 3262f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type, texImage)) { 3263f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* error was recorded */ 3264f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3265f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (width > 0 && height > 0 && depth > 0) { 3266f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If we have a border, offset=-1 is legal. Bias by border width. */ 3267f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dims) { 3268f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 3269f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target != GL_TEXTURE_2D_ARRAY) 3270f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zoffset += texImage->Border; 3271f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 3272f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 3273f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target != GL_TEXTURE_1D_ARRAY) 3274f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org yoffset += texImage->Border; 3275f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 3276f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 3277f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset += texImage->Border; 3278f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3279f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3280f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.TexSubImage(ctx, dims, texImage, 3281f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset, yoffset, zoffset, 3282f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, 3283f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type, pixels, &ctx->Unpack); 3284f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3285f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_gen_mipmap(ctx, target, texObj, level); 3286f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3287f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->NewState |= _NEW_TEXTURE; 3288f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3289f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3290f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unlock_texture(ctx, texObj); 3291f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3292f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3293f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3294f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3295f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexSubImage1D( GLenum target, GLint level, 3296f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLsizei width, 3297f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLenum type, 3298f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *pixels ) 3299f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3300f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3301f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texsubimage(ctx, 1, target, level, 3302f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset, 0, 0, 3303f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, 1, 1, 3304f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type, pixels); 3305f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3306f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3307f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3308f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3309f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexSubImage2D( GLenum target, GLint level, 3310f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, 3311f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, 3312f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLenum type, 3313f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *pixels ) 3314f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3315f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3316f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texsubimage(ctx, 2, target, level, 3317f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset, yoffset, 0, 3318f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, 1, 3319f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type, pixels); 3320f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3321f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3322f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3323f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3324f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3325f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexSubImage3D( GLenum target, GLint level, 3326f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 3327f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, GLsizei depth, 3328f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLenum type, 3329f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *pixels ) 3330f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3331f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3332f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texsubimage(ctx, 3, target, level, 3333f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset, yoffset, zoffset, 3334f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, 3335f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, type, pixels); 3336f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3337f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3338f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3339f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3340f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 3341f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * For glCopyTexSubImage, return the source renderbuffer to copy texel data 3342f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * from. This depends on whether the texture contains color or depth values. 3343f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3344f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic struct gl_renderbuffer * 3345f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_copy_tex_image_source(struct gl_context *ctx, gl_format texFormat) 3346f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3347f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_get_format_bits(texFormat, GL_DEPTH_BITS) > 0) { 3348f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* reading from depth/stencil buffer */ 3349f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->ReadBuffer->Attachment[BUFFER_DEPTH].Renderbuffer; 3350f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3351f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3352f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* copying from color buffer */ 3353f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return ctx->ReadBuffer->_ColorReadBuffer; 3354f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3355f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3356f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3357f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3358f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3359f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 3360f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Implement the glCopyTexImage1/2D() functions. 3361f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3362f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 3363f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopyteximage(struct gl_context *ctx, GLuint dims, 3364f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, GLint level, GLenum internalFormat, 3365f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint x, GLint y, GLsizei width, GLsizei height, GLint border ) 3366f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3367f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj; 3368f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage; 3369f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLuint face = _mesa_tex_target_to_face(target); 3370f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3371f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3372f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3373f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) 3374f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, "glCopyTexImage%uD %s %d %s %d %d %d %d %d\n", 3375f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims, 3376f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(target), level, 3377f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(internalFormat), 3378f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, y, width, height, border); 3379f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3380f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->NewState & NEW_COPY_TEX_STATE) 3381f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_state(ctx); 3382f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3383f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (copytexture_error_check(ctx, dims, target, level, internalFormat, 3384f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, border)) 3385f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 3386f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3387f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj = _mesa_get_current_tex_object(ctx, target); 3388f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3389f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (border && ctx->Const.StripTextureBorder) { 3390f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x += border; 3391f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width -= border * 2; 3392f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims == 2) { 3393f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org y += border; 3394f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height -= border * 2; 3395f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3396f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border = 0; 3397f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3398f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3399f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lock_texture(ctx, texObj); 3400f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 3401f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage = _mesa_get_tex_image(ctx, texObj, target, level); 3402f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3403f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!texImage) { 3404f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage%uD", dims); 3405f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3406f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3407f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* choose actual hw format */ 3408f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format texFormat = _mesa_choose_texture_format(ctx, texObj, 3409f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org target, level, 3410f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat, 3411f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_NONE, GL_NONE); 3412f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3413f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (legal_texture_size(ctx, texFormat, width, height, 1)) { 3414f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint srcX = x, srcY = y, dstX = 0, dstY = 0, dstZ = 0; 3415f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3416f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Free old texture image */ 3417f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.FreeTextureImageBuffer(ctx, texImage); 3418f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3419f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_init_teximage_fields(ctx, texImage, width, height, 1, 3420f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org border, internalFormat, texFormat); 3421f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3422f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* Allocate texture memory (no pixel data yet) */ 3423f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.TexImage(ctx, dims, texImage, 3424f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GL_NONE, GL_NONE, 3425f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org NULL, &ctx->Unpack); 3426f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3427f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_clip_copytexsubimage(ctx, &dstX, &dstY, &srcX, &srcY, 3428f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &width, &height)) { 3429f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *srcRb = 3430f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_copy_tex_image_source(ctx, texImage->TexFormat); 3431f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3432f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.CopyTexSubImage(ctx, dims, texImage, dstX, dstY, dstZ, 3433f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRb, srcX, srcY, width, height); 3434f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3435f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3436f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_gen_mipmap(ctx, target, texObj, level); 3437f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3438f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_fbo_texture(ctx, texObj, face, level); 3439f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3440f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_dirty_texobj(ctx, texObj, GL_TRUE); 3441f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3442f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3443f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* probably too large of image */ 3444f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_OUT_OF_MEMORY, "glCopyTexImage%uD", dims); 3445f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3446f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3447f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3448f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unlock_texture(ctx, texObj); 3449f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3450f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3451f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3452f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3453f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3454f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CopyTexImage1D( GLenum target, GLint level, 3455f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum internalFormat, 3456f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint x, GLint y, 3457f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLint border ) 3458f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3459f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3460f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org copyteximage(ctx, 1, target, level, internalFormat, x, y, width, 1, border); 3461f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3462f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3463f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3464f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3465f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3466f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CopyTexImage2D( GLenum target, GLint level, GLenum internalFormat, 3467f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint x, GLint y, GLsizei width, GLsizei height, 3468f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint border ) 3469f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3470f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3471f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org copyteximage(ctx, 2, target, level, internalFormat, 3472f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, y, width, height, border); 3473f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3474f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3475f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3476f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3477f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 3478f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Implementation for glCopyTexSubImage1/2/3D() functions. 3479f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3480f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 3481f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcopytexsubimage(struct gl_context *ctx, GLuint dims, GLenum target, GLint level, 3482f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 3483f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint x, GLint y, GLsizei width, GLsizei height) 3484f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3485f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj; 3486f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage; 3487f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3488f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3489f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3490f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (MESA_VERBOSE & (VERBOSE_API|VERBOSE_TEXTURE)) 3491f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_debug(ctx, "glCopyTexSubImage%uD %s %d %d %d %d %d %d %d %d\n", 3492f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org dims, 3493f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lookup_enum_by_nr(target), 3494f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org level, xoffset, yoffset, zoffset, x, y, width, height); 3495f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3496f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->NewState & NEW_COPY_TEX_STATE) 3497f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_update_state(ctx); 3498f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3499f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (copytexsubimage_error_check1(ctx, dims, target, level)) 3500f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 3501f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3502f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj = _mesa_get_current_tex_object(ctx, target); 3503f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3504f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lock_texture(ctx, texObj); 3505f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 3506f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage = _mesa_select_tex_image(ctx, texObj, target, level); 3507f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3508f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (copytexsubimage_error_check2(ctx, dims, target, level, xoffset, yoffset, 3509f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zoffset, width, height, texImage)) { 3510f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* error was recored */ 3511f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3512f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3513f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* If we have a border, offset=-1 is legal. Bias by border width. */ 3514f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (dims) { 3515f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 3: 3516f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target != GL_TEXTURE_2D_ARRAY) 3517f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org zoffset += texImage->Border; 3518f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 3519f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 2: 3520f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target != GL_TEXTURE_1D_ARRAY) 3521f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org yoffset += texImage->Border; 3522f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* fall-through */ 3523f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case 1: 3524f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset += texImage->Border; 3525f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3526f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3527f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (_mesa_clip_copytexsubimage(ctx, &xoffset, &yoffset, &x, &y, 3528f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org &width, &height)) { 3529f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_renderbuffer *srcRb = 3530f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_copy_tex_image_source(ctx, texImage->TexFormat); 3531f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3532f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.CopyTexSubImage(ctx, dims, texImage, 3533f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset, yoffset, zoffset, 3534f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org srcRb, x, y, width, height); 3535f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3536f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_gen_mipmap(ctx, target, texObj, level); 3537f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3538f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->NewState |= _NEW_TEXTURE; 3539f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3540f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3541f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3542f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unlock_texture(ctx, texObj); 3543f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3544f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3545f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3546f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3547f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CopyTexSubImage1D( GLenum target, GLint level, 3548f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint x, GLint y, GLsizei width ) 3549f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3550f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3551f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org copytexsubimage(ctx, 1, target, level, xoffset, 0, 0, x, y, width, 1); 3552f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3553f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3554f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3555f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3556f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3557f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CopyTexSubImage2D( GLenum target, GLint level, 3558f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, 3559f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint x, GLint y, GLsizei width, GLsizei height ) 3560f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3561f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3562f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org copytexsubimage(ctx, 2, target, level, xoffset, yoffset, 0, x, y, 3563f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height); 3564f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3565f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3566f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3567f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3568f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3569f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CopyTexSubImage3D( GLenum target, GLint level, 3570f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 3571f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint x, GLint y, GLsizei width, GLsizei height ) 3572f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3573f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3574f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org copytexsubimage(ctx, 3, target, level, xoffset, yoffset, zoffset, 3575f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org x, y, width, height); 3576f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3577f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3578f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3579f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3580f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3581f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 3582f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/****** Compressed Textures ******/ 3583f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/**********************************************************************/ 3584f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3585f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3586f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 3587f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Error checking for glCompressedTexSubImage[123]D(). 3588f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \warning There are some bad assumptions here about the size of compressed 3589f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * texture tiles (multiple of 4) used to test the validity of the 3590f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * offset and size parameters. 3591f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return error code or GL_NO_ERROR. 3592f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3593f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLenum 3594f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompressed_subtexture_error_check(struct gl_context *ctx, GLint dimensions, 3595f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum target, GLint level, 3596f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 3597f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, GLsizei depth, 3598f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLsizei imageSize) 3599f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3600f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint expectedSize, maxLevels = 0, maxTextureSize; 3601f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLuint bw, bh; 3602f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (void) zoffset; 3603f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3604f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dimensions == 1) { 3605f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 1D compressed textures not allowed */ 3606f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_ENUM; 3607f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3608f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dimensions == 2) { 3609f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target == GL_PROXY_TEXTURE_2D) { 3610f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxLevels = ctx->Const.MaxTextureLevels; 3611f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3612f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (target == GL_TEXTURE_2D) { 3613f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxLevels = ctx->Const.MaxTextureLevels; 3614f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3615f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (target == GL_PROXY_TEXTURE_CUBE_MAP_ARB) { 3616f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_texture_cube_map) 3617f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_ENUM; /*target*/ 3618f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxLevels = ctx->Const.MaxCubeTextureLevels; 3619f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3620f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (_mesa_is_cube_face(target)) { 3621f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!ctx->Extensions.ARB_texture_cube_map) 3622f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_ENUM; /*target*/ 3623f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxLevels = ctx->Const.MaxCubeTextureLevels; 3624f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3625f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else { 3626f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_ENUM; /*target*/ 3627f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3628f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3629f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (dimensions == 3) { 3630f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 3D compressed textures not allowed */ 3631f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_ENUM; 3632f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3633f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3634f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org maxTextureSize = 1 << (maxLevels - 1); 3635f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3636f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* this will catch any invalid compressed format token */ 3637f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!_mesa_is_compressed_format(ctx, format)) 3638f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_ENUM; 3639f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3640f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (width < 0 || width > maxTextureSize) 3641f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_VALUE; 3642f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3643f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((height < 0 || height > maxTextureSize) 3644f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && dimensions > 1) 3645f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_VALUE; 3646f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3647f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (level < 0 || level >= maxLevels) 3648f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_VALUE; 3649f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3650f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* 3651f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * do checks which depend on compression block size 3652f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3653f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org get_compressed_block_size(format, &bw, &bh); 3654f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3655f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((xoffset % bw != 0) || (yoffset % bh != 0)) 3656f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_OPERATION; 3657f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3658f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((width % bw != 0) && width != 2 && width != 1) 3659f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_OPERATION; 3660f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3661f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((height % bh != 0) && height != 2 && height != 1) 3662f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_OPERATION; 3663f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3664f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org expectedSize = compressed_tex_size(width, height, depth, format); 3665f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (expectedSize != imageSize) 3666f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_INVALID_VALUE; 3667f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3668f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_NO_ERROR; 3669f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3670f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3671f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3672f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 3673f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Do second part of glCompressedTexSubImage error checking. 3674f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * \return GL_TRUE if error found, GL_FALSE otherwise. 3675f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3676f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic GLboolean 3677f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompressed_subtexture_error_check2(struct gl_context *ctx, GLuint dims, 3678f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, 3679f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei depth, GLenum format, 3680f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage) 3681f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3682f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!texImage) { 3683f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 3684f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCompressedTexSubImage%uD(undefined image level)", dims); 3685f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3686f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3687f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3688f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if ((GLint) format != texImage->InternalFormat) { 3689f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 3690f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCompressedTexSubImage%uD(format=0x%x)", dims, format); 3691f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3692f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3693f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3694f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (compressedteximage_only_format(ctx, format)) { 3695f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, 3696f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCompressedTexSubImage%uD(format=0x%x cannot be updated)" 3697f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org , dims, format); 3698f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3699f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3700f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3701f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (((width == 1 || width == 2) && 3702f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width != (GLsizei) texImage->Width) || 3703f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (width > (GLsizei) texImage->Width)) { 3704f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 3705f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCompressedTexSubImage%uD(width=%d)", dims, width); 3706f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3707f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3708f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3709f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims >= 2) { 3710f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (((height == 1 || height == 2) && 3711f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org height != (GLsizei) texImage->Height) || 3712f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (height > (GLsizei) texImage->Height)) { 3713f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 3714f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCompressedTexSubImage%uD(height=%d)", dims, height); 3715f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3716f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3717f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3718f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3719f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (dims >= 3) { 3720f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (((depth == 1 || depth == 2) && 3721f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org depth != (GLsizei) texImage->Depth) || 3722f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org (depth > (GLsizei) texImage->Depth)) { 3723f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_VALUE, 3724f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org "glCompressedTexSubImage%uD(depth=%d)", dims, depth); 3725f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_TRUE; 3726f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3727f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3728f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3729f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return GL_FALSE; 3730f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3731f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3732f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3733f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3734f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CompressedTexImage1DARB(GLenum target, GLint level, 3735f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum internalFormat, GLsizei width, 3736f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint border, GLsizei imageSize, 3737f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *data) 3738f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3739f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3740f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org teximage(ctx, GL_TRUE, 1, target, level, internalFormat, 3741f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, 1, 1, border, GL_NONE, GL_NONE, imageSize, data); 3742f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3743f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3744f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3745f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3746f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CompressedTexImage2DARB(GLenum target, GLint level, 3747f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum internalFormat, GLsizei width, 3748f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei height, GLint border, GLsizei imageSize, 3749f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *data) 3750f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3751f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3752f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org teximage(ctx, GL_TRUE, 2, target, level, internalFormat, 3753f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, 1, border, GL_NONE, GL_NONE, imageSize, data); 3754f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3755f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3756f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3757f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3758f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CompressedTexImage3DARB(GLenum target, GLint level, 3759f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum internalFormat, GLsizei width, 3760f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei height, GLsizei depth, GLint border, 3761f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei imageSize, const GLvoid *data) 3762f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3763f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3764f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org teximage(ctx, GL_TRUE, 3, target, level, internalFormat, 3765f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, border, GL_NONE, GL_NONE, imageSize, data); 3766f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3767f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3768f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3769f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** 3770f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * Common helper for glCompressedTexSubImage1/2/3D(). 3771f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 3772f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic void 3773f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgcompressed_tex_sub_image(GLuint dims, GLenum target, GLint level, 3774f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint xoffset, GLint yoffset, GLint zoffset, 3775f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLsizei height, GLsizei depth, 3776f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLsizei imageSize, const GLvoid *data) 3777f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3778f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj; 3779f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_image *texImage; 3780f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum error; 3781f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 3782f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 3783f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3784f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org error = compressed_subtexture_error_check(ctx, dims, target, level, 3785f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset, 0, 0, /* pos */ 3786f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, /* size */ 3787f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, imageSize); 3788f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (error) { 3789f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, error, "glCompressedTexSubImage%uD", dims); 3790f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 3791f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3792f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3793f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj = _mesa_get_current_tex_object(ctx, target); 3794f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3795f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lock_texture(ctx, texObj); 3796f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 3797f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texImage = _mesa_select_tex_image(ctx, texObj, target, level); 3798f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3799f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (compressed_subtexture_error_check2(ctx, dims, width, height, depth, 3800f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, texImage)) { 3801f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* error was recorded */ 3802f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3803f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org else if (width > 0 && height > 0 && depth > 0) { 3804f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->Driver.CompressedTexSubImage(ctx, dims, texImage, 3805f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org xoffset, yoffset, zoffset, 3806f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, 3807f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, imageSize, data); 3808f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3809f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org check_gen_mipmap(ctx, target, texObj, level); 3810f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3811f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ctx->NewState |= _NEW_TEXTURE; 3812f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3813f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3814f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unlock_texture(ctx, texObj); 3815f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3816f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3817f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3818f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3819f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CompressedTexSubImage1DARB(GLenum target, GLint level, GLint xoffset, 3820f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei width, GLenum format, 3821f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei imageSize, const GLvoid *data) 3822f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3823f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compressed_tex_sub_image(1, target, level, xoffset, 0, 0, width, 1, 1, 3824f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format, imageSize, data); 3825f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3826f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3827f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3828f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3829f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CompressedTexSubImage2DARB(GLenum target, GLint level, GLint xoffset, 3830f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint yoffset, GLsizei width, GLsizei height, 3831f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum format, GLsizei imageSize, 3832f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org const GLvoid *data) 3833f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3834f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compressed_tex_sub_image(2, target, level, xoffset, yoffset, 0, 3835f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, 1, format, imageSize, data); 3836f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3837f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3838f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3839f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 3840f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_CompressedTexSubImage3DARB(GLenum target, GLint level, GLint xoffset, 3841f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLint yoffset, GLint zoffset, GLsizei width, 3842f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei height, GLsizei depth, GLenum format, 3843f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLsizei imageSize, const GLvoid *data) 3844f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3845f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org compressed_tex_sub_image(3, target, level, xoffset, yoffset, zoffset, 3846f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org width, height, depth, format, imageSize, data); 3847f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 3848f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3849f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic gl_format 3850f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgget_texbuffer_format(const struct gl_context *ctx, GLenum internalFormat) 3851f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 3852f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org switch (internalFormat) { 3853f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA8: 3854f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_A8; 3855f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA16: 3856f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_A16; 3857f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA16F_ARB: 3858f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_ALPHA_FLOAT16; 3859f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA32F_ARB: 3860f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_ALPHA_FLOAT32; 3861f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA8I_EXT: 3862f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_ALPHA_INT8; 3863f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA16I_EXT: 3864f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_ALPHA_INT16; 3865f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA32I_EXT: 3866f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_ALPHA_INT32; 3867f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA8UI_EXT: 3868f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_ALPHA_UINT8; 3869f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA16UI_EXT: 3870f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_ALPHA_UINT16; 3871f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_ALPHA32UI_EXT: 3872f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_ALPHA_UINT32; 3873f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE8: 3874f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_L8; 3875f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16: 3876f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_L16; 3877f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16F_ARB: 3878f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_FLOAT16; 3879f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE32F_ARB: 3880f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_FLOAT32; 3881f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE8I_EXT: 3882f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_INT8; 3883f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16I_EXT: 3884f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_INT16; 3885f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE32I_EXT: 3886f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_INT32; 3887f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE8UI_EXT: 3888f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_UINT8; 3889f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16UI_EXT: 3890f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_UINT16; 3891f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE32UI_EXT: 3892f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_UINT32; 3893f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE8_ALPHA8: 3894f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_AL88; 3895f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE16_ALPHA16: 3896f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_AL1616; 3897f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA16F_ARB: 3898f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT16; 3899f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA32F_ARB: 3900f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_ALPHA_FLOAT32; 3901f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA8I_EXT: 3902f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_ALPHA_INT8; 3903f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA16I_EXT: 3904f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_ALPHA_INT8; 3905f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA32I_EXT: 3906f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_ALPHA_INT16; 3907f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA8UI_EXT: 3908f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_ALPHA_UINT8; 3909f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA16UI_EXT: 3910f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_ALPHA_UINT16; 3911f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_LUMINANCE_ALPHA32UI_EXT: 3912f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_LUMINANCE_ALPHA_UINT32; 3913f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY8: 3914f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_I8; 3915f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY16: 3916f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_I16; 3917f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY16F_ARB: 3918f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_INTENSITY_FLOAT16; 3919f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY32F_ARB: 3920f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_INTENSITY_FLOAT32; 3921f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY8I_EXT: 3922f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_INTENSITY_INT8; 3923f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY16I_EXT: 3924f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_INTENSITY_INT16; 3925f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY32I_EXT: 3926f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_INTENSITY_INT32; 3927f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY8UI_EXT: 3928f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_INTENSITY_UINT8; 3929f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY16UI_EXT: 3930f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_INTENSITY_UINT16; 3931f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_INTENSITY32UI_EXT: 3932f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_INTENSITY_UINT32; 3933f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA8: 3934f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA8888_REV; 3935f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA16: 3936f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_16; 3937f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA16F_ARB: 3938f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_FLOAT16; 3939f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA32F_ARB: 3940f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_FLOAT32; 3941f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA8I_EXT: 3942f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_INT8; 3943f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA16I_EXT: 3944f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_INT16; 3945f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA32I_EXT: 3946f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_INT32; 3947f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA8UI_EXT: 3948f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_UINT8; 3949f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA16UI_EXT: 3950f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_UINT16; 3951f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RGBA32UI_EXT: 3952f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RGBA_UINT32; 3953f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3954f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG8: 3955f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_GR88; 3956f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG16: 3957f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RG1616; 3958f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG16F: 3959f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RG_FLOAT16; 3960f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG32F: 3961f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RG_FLOAT32; 3962f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG8I: 3963f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RG_INT8; 3964f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG16I: 3965f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RG_INT16; 3966f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG32I: 3967f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RG_INT32; 3968f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG8UI: 3969f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RG_UINT8; 3970f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG16UI: 3971f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RG_UINT16; 3972f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_RG32UI: 3973f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_RG_UINT32; 3974f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3975f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R8: 3976f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_R8; 3977f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R16: 3978f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_R16; 3979f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R16F: 3980f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_R_FLOAT16; 3981f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R32F: 3982f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_R_FLOAT32; 3983f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R8I: 3984f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_R_INT8; 3985f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R16I: 3986f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_R_INT16; 3987f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R32I: 3988f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_R_INT32; 3989f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R8UI: 3990f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_R_UINT8; 3991f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R16UI: 3992f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_R_UINT16; 3993f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org case GL_R32UI: 3994f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_R_UINT32; 3995f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 3996f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org default: 3997f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_NONE; 3998f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 3999f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4000f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4001f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgstatic gl_format 4002f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvalidate_texbuffer_format(const struct gl_context *ctx, GLenum internalFormat) 4003f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4004f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format format = get_texbuffer_format(ctx, internalFormat); 4005f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum datatype; 4006f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4007f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (format == MESA_FORMAT_NONE) 4008f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_NONE; 4009f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4010f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org datatype = _mesa_get_format_datatype(format); 4011f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (datatype == GL_FLOAT && !ctx->Extensions.ARB_texture_float) 4012f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_NONE; 4013f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4014f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (datatype == GL_HALF_FLOAT && !ctx->Extensions.ARB_half_float_pixel) 4015f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_NONE; 4016f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4017f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org /* The GL_ARB_texture_rg and GL_ARB_texture_buffer_object specs don't make 4018f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * any mention of R/RG formats, but they appear in the GL 3.1 core 4019f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org * specification. 4020f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org */ 4021f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (ctx->Version <= 30) { 4022f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GLenum base_format = _mesa_get_format_base_format(format); 4023f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4024f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (base_format == GL_R || base_format == GL_RG) 4025f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return MESA_FORMAT_NONE; 4026f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4027f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return format; 4028f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4029f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4030f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4031f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org/** GL_ARB_texture_buffer_object */ 4032f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.orgvoid GLAPIENTRY 4033f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org_mesa_TexBuffer(GLenum target, GLenum internalFormat, GLuint buffer) 4034f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org{ 4035f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_texture_object *texObj; 4036f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org struct gl_buffer_object *bufObj; 4037f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org gl_format format; 4038f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4039f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org GET_CURRENT_CONTEXT(ctx); 4040f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org ASSERT_OUTSIDE_BEGIN_END_AND_FLUSH(ctx); 4041f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4042f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (!(ctx->Extensions.ARB_texture_buffer_object 4043f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org && _mesa_is_desktop_gl(ctx))) { 4044f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBuffer"); 4045f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4046f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4047f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4048f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (target != GL_TEXTURE_BUFFER_ARB) { 4049f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glTexBuffer(target)"); 4050f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4051f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4052f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4053f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org format = validate_texbuffer_format(ctx, internalFormat); 4054f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (format == MESA_FORMAT_NONE) { 4055f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_ENUM, "glTexBuffer(internalFormat 0x%x)", 4056f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org internalFormat); 4057f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4058f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4059f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4060f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org bufObj = _mesa_lookup_bufferobj(ctx, buffer); 4061f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org if (buffer && !bufObj) { 4062f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_error(ctx, GL_INVALID_OPERATION, "glTexBuffer(buffer %u)", buffer); 4063f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org return; 4064f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4065f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4066f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj = _mesa_get_current_tex_object(ctx, target); 4067f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org 4068f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_lock_texture(ctx, texObj); 4069f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org { 4070f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_reference_buffer_object(ctx, &texObj->BufferObject, bufObj); 4071f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj->BufferObjectFormat = internalFormat; 4072f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org texObj->_BufferObjectFormat = format; 4073f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org } 4074f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org _mesa_unlock_texture(ctx, texObj); 4075f2ba7591b1407a7ee9209f842c50696914dc2dedkbr@chromium.org} 4076