1d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter/* 2d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * Mesa 3-D graphics library 3d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * 4d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * Copyright (C) 2013 LunarG, Inc. 5d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * 6d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * Permission is hereby granted, free of charge, to any person obtaining a 7d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * copy of this software and associated documentation files (the "Software"), 8d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * to deal in the Software without restriction, including without limitation 9d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * the rights to use, copy, modify, merge, publish, distribute, sublicense, 10d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * and/or sell copies of the Software, and to permit persons to whom the 11d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * Software is furnished to do so, subject to the following conditions: 12d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * 13d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * The above copyright notice and this permission notice shall be included 14d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * in all copies or substantial portions of the Software. 15d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * 16d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 17d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 18d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 19d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 20d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 21d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 22d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * DEALINGS IN THE SOFTWARE. 23d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * 24d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * Authors: 25d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * Courtney Goeltzenleuchter <courtney@lunarg.com> 26d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter */ 27d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter 28d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter 29d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter/** 30d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * \file textureview.c 31d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * GL_ARB_texture_view functions 32d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter */ 33d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter 34d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter#include "glheader.h" 35d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter#include "context.h" 36d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter#include "enums.h" 37d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter#include "imports.h" 38d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter#include "macros.h" 39d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter#include "teximage.h" 40d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter#include "texobj.h" 41f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter#include "mipmap.h" 42d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter#include "texstorage.h" 43d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter#include "textureview.h" 44f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter#include "stdbool.h" 45d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter#include "mtypes.h" 46d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter 47f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter/* Table 3.X.2 (Compatible internal formats for TextureView) 48f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 49f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | Class | Internal formats | 50f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 51f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | VIEW_CLASS_128_BITS | RGBA32F, RGBA32UI, RGBA32I | 52f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 53f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | VIEW_CLASS_96_BITS | RGB32F, RGB32UI, RGB32I | 54f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 55f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | VIEW_CLASS_64_BITS | RGBA16F, RG32F, RGBA16UI, RG32UI, RGBA16I, | 56f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | | RG32I, RGBA16, RGBA16_SNORM | 57f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 58f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | VIEW_CLASS_48_BITS | RGB16, RGB16_SNORM, RGB16F, RGB16UI, RGB16I | 59f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 60f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | VIEW_CLASS_32_BITS | RG16F, R11F_G11F_B10F, R32F, | 61f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | | RGB10_A2UI, RGBA8UI, RG16UI, R32UI, | 62f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | | RGBA8I, RG16I, R32I, RGB10_A2, RGBA8, RG16, | 63f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | | RGBA8_SNORM, RG16_SNORM, SRGB8_ALPHA8, RGB9_E5 | 64f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 65f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | VIEW_CLASS_24_BITS | RGB8, RGB8_SNORM, SRGB8, RGB8UI, RGB8I | 66f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 67f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | VIEW_CLASS_16_BITS | R16F, RG8UI, R16UI, RG8I, R16I, RG8, R16, | 68f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | | RG8_SNORM, R16_SNORM | 69f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 70f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | VIEW_CLASS_8_BITS | R8UI, R8I, R8, R8_SNORM | 71f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 72f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | VIEW_CLASS_RGTC1_RED | COMPRESSED_RED_RGTC1, | 73f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | | COMPRESSED_SIGNED_RED_RGTC1 | 74f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 75f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | VIEW_CLASS_RGTC2_RG | COMPRESSED_RG_RGTC2, | 76f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | | COMPRESSED_SIGNED_RG_RGTC2 | 77f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 78f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | VIEW_CLASS_BPTC_UNORM | COMPRESSED_RGBA_BPTC_UNORM, | 79f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | | COMPRESSED_SRGB_ALPHA_BPTC_UNORM | 80f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 81f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | VIEW_CLASS_BPTC_FLOAT | COMPRESSED_RGB_BPTC_SIGNED_FLOAT, | 82f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | | COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT | 83f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------- 84f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 85ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin 86ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_GLES(x) (GL_VIEW_CLASS_BPTC_FLOAT + 1 + x) 87ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_EAC_R11 VIEW_CLASS_GLES(0) 88ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_EAC_RG11 VIEW_CLASS_GLES(1) 89ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ETC2_RGB VIEW_CLASS_GLES(2) 90ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ETC2_RGBA VIEW_CLASS_GLES(3) 91ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ETC2_EAC_RGBA VIEW_CLASS_GLES(4) 92ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_4x4_RGBA VIEW_CLASS_GLES(5) 93ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_5x4_RGBA VIEW_CLASS_GLES(6) 94ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_5x5_RGBA VIEW_CLASS_GLES(7) 95ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_6x5_RGBA VIEW_CLASS_GLES(8) 96ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_6x6_RGBA VIEW_CLASS_GLES(9) 97ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_8x5_RGBA VIEW_CLASS_GLES(10) 98ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_8x6_RGBA VIEW_CLASS_GLES(11) 99ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_8x8_RGBA VIEW_CLASS_GLES(12) 100ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_10x5_RGBA VIEW_CLASS_GLES(13) 101ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_10x6_RGBA VIEW_CLASS_GLES(14) 102ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_10x8_RGBA VIEW_CLASS_GLES(15) 103ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_10x10_RGBA VIEW_CLASS_GLES(16) 104ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_12x10_RGBA VIEW_CLASS_GLES(17) 105ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_12x12_RGBA VIEW_CLASS_GLES(18) 106ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_3x3x3_RGBA VIEW_CLASS_GLES(19) 107ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_4x3x3_RGBA VIEW_CLASS_GLES(20) 108ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_4x4x3_RGBA VIEW_CLASS_GLES(21) 109ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_4x4x4_RGBA VIEW_CLASS_GLES(22) 110ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_5x4x4_RGBA VIEW_CLASS_GLES(23) 111ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_5x5x4_RGBA VIEW_CLASS_GLES(24) 112ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_5x5x5_RGBA VIEW_CLASS_GLES(25) 113ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_6x5x5_RGBA VIEW_CLASS_GLES(26) 114ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_6x6x5_RGBA VIEW_CLASS_GLES(27) 115ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define VIEW_CLASS_ASTC_6x6x6_RGBA VIEW_CLASS_GLES(28) 116ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin 117ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin 118f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchterstruct internal_format_class_info { 119f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter GLenum view_class; 120f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter GLenum internal_format; 121f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter}; 122f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchterstatic const struct internal_format_class_info compatible_internal_formats[] = { 123f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_128_BITS, GL_RGBA32F}, 124f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_128_BITS, GL_RGBA32UI}, 125f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_128_BITS, GL_RGBA32I}, 126f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_96_BITS, GL_RGB32F}, 127f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_96_BITS, GL_RGB32UI}, 128f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_96_BITS, GL_RGB32I}, 129f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_64_BITS, GL_RGBA16F}, 130f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_64_BITS, GL_RG32F}, 131f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_64_BITS, GL_RGBA16UI}, 132f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_64_BITS, GL_RG32UI}, 133f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_64_BITS, GL_RGBA16I}, 134f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_64_BITS, GL_RG32I}, 135f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_64_BITS, GL_RGBA16}, 136f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_64_BITS, GL_RGBA16_SNORM}, 137f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_48_BITS, GL_RGB16}, 138f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_48_BITS, GL_RGB16_SNORM}, 139f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_48_BITS, GL_RGB16F}, 140f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_48_BITS, GL_RGB16UI}, 141f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_48_BITS, GL_RGB16I}, 142f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_RG16F}, 143f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_R11F_G11F_B10F}, 144f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_R32F}, 145f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_RGB10_A2UI}, 146f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_RGBA8UI}, 147f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_RG16UI}, 148f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_R32UI}, 149f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_RGBA8I}, 150f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_RG16I}, 151f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_R32I}, 152f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_RGB10_A2}, 153f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_RGBA8}, 154f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_RG16}, 155f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_RGBA8_SNORM}, 156f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_RG16_SNORM}, 157f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_SRGB8_ALPHA8}, 158f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_32_BITS, GL_RGB9_E5}, 159f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_24_BITS, GL_RGB8}, 160f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_24_BITS, GL_RGB8_SNORM}, 161f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_24_BITS, GL_SRGB8}, 162f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_24_BITS, GL_RGB8UI}, 163f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_24_BITS, GL_RGB8I}, 164f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_16_BITS, GL_R16F}, 165f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_16_BITS, GL_RG8UI}, 166f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_16_BITS, GL_R16UI}, 167f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_16_BITS, GL_RG8I}, 168f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_16_BITS, GL_R16I}, 169f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_16_BITS, GL_RG8}, 170f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_16_BITS, GL_R16}, 171f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_16_BITS, GL_RG8_SNORM}, 172f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_16_BITS, GL_R16_SNORM}, 173f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_8_BITS, GL_R8UI}, 174f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_8_BITS, GL_R8I}, 175f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_8_BITS, GL_R8}, 176f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_8_BITS, GL_R8_SNORM}, 177f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_RGTC1_RED, GL_COMPRESSED_RED_RGTC1}, 178f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_RGTC1_RED, GL_COMPRESSED_SIGNED_RED_RGTC1}, 179f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_RGTC2_RG, GL_COMPRESSED_RG_RGTC2}, 180f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_RGTC2_RG, GL_COMPRESSED_SIGNED_RG_RGTC2}, 181f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_BPTC_UNORM, GL_COMPRESSED_RGBA_BPTC_UNORM_ARB}, 182f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_BPTC_UNORM, GL_COMPRESSED_SRGB_ALPHA_BPTC_UNORM_ARB}, 183f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_BPTC_FLOAT, GL_COMPRESSED_RGB_BPTC_SIGNED_FLOAT_ARB}, 184f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_BPTC_FLOAT, GL_COMPRESSED_RGB_BPTC_UNSIGNED_FLOAT_ARB}, 185f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter}; 186f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 187f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchterstatic const struct internal_format_class_info s3tc_compatible_internal_formats[] = { 188f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_S3TC_DXT1_RGB, GL_COMPRESSED_RGB_S3TC_DXT1_EXT}, 189f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_S3TC_DXT1_RGB, GL_COMPRESSED_SRGB_S3TC_DXT1_EXT}, 190f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_S3TC_DXT1_RGBA, GL_COMPRESSED_RGBA_S3TC_DXT1_EXT}, 191f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_S3TC_DXT1_RGBA, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_EXT}, 192f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_S3TC_DXT3_RGBA, GL_COMPRESSED_RGBA_S3TC_DXT3_EXT}, 193f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_S3TC_DXT3_RGBA, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT3_EXT}, 194f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_S3TC_DXT5_RGBA, GL_COMPRESSED_RGBA_S3TC_DXT5_EXT}, 195f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter {GL_VIEW_CLASS_S3TC_DXT5_RGBA, GL_COMPRESSED_SRGB_ALPHA_S3TC_DXT5_EXT}, 196f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter}; 197f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 198ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkinstatic const struct internal_format_class_info gles_etc2_compatible_internal_formats[] = { 199ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin {VIEW_CLASS_EAC_R11, GL_COMPRESSED_R11_EAC}, 200ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin {VIEW_CLASS_EAC_R11, GL_COMPRESSED_SIGNED_R11_EAC}, 201ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin {VIEW_CLASS_EAC_RG11, GL_COMPRESSED_RG11_EAC}, 202ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin {VIEW_CLASS_EAC_RG11, GL_COMPRESSED_SIGNED_RG11_EAC}, 203ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin {VIEW_CLASS_ETC2_RGB, GL_COMPRESSED_RGB8_ETC2}, 204ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin {VIEW_CLASS_ETC2_RGB, GL_COMPRESSED_SRGB8_ETC2}, 205ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin {VIEW_CLASS_ETC2_RGBA, GL_COMPRESSED_RGB8_PUNCHTHROUGH_ALPHA1_ETC2}, 206ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin {VIEW_CLASS_ETC2_RGBA, GL_COMPRESSED_SRGB8_PUNCHTHROUGH_ALPHA1_ETC2}, 207ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin {VIEW_CLASS_ETC2_EAC_RGBA, GL_COMPRESSED_RGBA8_ETC2_EAC}, 208ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin {VIEW_CLASS_ETC2_EAC_RGBA, GL_COMPRESSED_SRGB8_ALPHA8_ETC2_EAC}, 209ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin}; 210ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin 211ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkinstatic const struct internal_format_class_info gles_astc_compatible_internal_formats[] = { 212ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#define ASTC_FMT(size) \ 21337266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin {VIEW_CLASS_ASTC_##size##_RGBA, GL_COMPRESSED_RGBA_ASTC_##size##_KHR}, \ 214ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin {VIEW_CLASS_ASTC_##size##_RGBA, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_##size##_KHR} 215ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin 216ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(4x4), 217ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(5x4), 218ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(5x5), 219ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(6x5), 220ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(6x6), 221ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(8x5), 222ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(8x6), 223ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(8x8), 224ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(10x5), 225ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(10x6), 226ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(10x8), 227ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(10x10), 228ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(12x10), 229ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin ASTC_FMT(12x12), 230ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin#undef ASTC_FMT 231ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin}; 232ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin 23337266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkinstatic const struct internal_format_class_info gles_astc_3d_compatible_internal_formats[] = { 23437266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin#define ASTC_FMT(size) \ 23537266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin {VIEW_CLASS_ASTC_##size##_RGBA, GL_COMPRESSED_RGBA_ASTC_##size##_OES}, \ 23637266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin {VIEW_CLASS_ASTC_##size##_RGBA, GL_COMPRESSED_SRGB8_ALPHA8_ASTC_##size##_OES} 23737266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin 23837266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin ASTC_FMT(3x3x3), 23937266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin ASTC_FMT(4x3x3), 24037266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin ASTC_FMT(4x4x3), 24137266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin ASTC_FMT(4x4x4), 24237266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin ASTC_FMT(5x4x4), 24337266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin ASTC_FMT(5x5x4), 24437266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin ASTC_FMT(5x5x5), 24537266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin ASTC_FMT(6x5x5), 24637266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin ASTC_FMT(6x6x5), 24737266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin ASTC_FMT(6x6x6), 24837266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin#undef ASTC_FMT 24937266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin}; 25037266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin 25104e2e0b24a72dc4f66a0d56cee8b5d50233374a7Antia PuentesGLenum 25204e2e0b24a72dc4f66a0d56cee8b5d50233374a7Antia Puentes_mesa_texture_view_lookup_view_class(const struct gl_context *ctx, GLenum internalformat) 253f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter{ 254e735dfd35b036b3427ba6c73f482f75062a3d75fBrian Paul GLuint i; 255f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 256f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter for (i = 0; i < ARRAY_SIZE(compatible_internal_formats); i++) { 257f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (compatible_internal_formats[i].internal_format == internalformat) 258f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return compatible_internal_formats[i].view_class; 259f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 260f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 2618369675a55ab300a84b3a82632042a33883ca255Brian Paul if (ctx->Extensions.EXT_texture_compression_s3tc && 2628369675a55ab300a84b3a82632042a33883ca255Brian Paul ctx->Extensions.EXT_texture_sRGB) { 263f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter for (i = 0; i < ARRAY_SIZE(s3tc_compatible_internal_formats); i++) { 2648369675a55ab300a84b3a82632042a33883ca255Brian Paul if (s3tc_compatible_internal_formats[i].internal_format 2658369675a55ab300a84b3a82632042a33883ca255Brian Paul == internalformat) 266f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return s3tc_compatible_internal_formats[i].view_class; 267f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 268f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 269ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin 270ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin if (_mesa_is_gles3(ctx)) { 271ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin for (i = 0; i < ARRAY_SIZE(gles_etc2_compatible_internal_formats); i++) { 272ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin if (gles_etc2_compatible_internal_formats[i].internal_format 273ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin == internalformat) 274ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin return gles_etc2_compatible_internal_formats[i].view_class; 275ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin } 276ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin 277ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin if (ctx->Extensions.KHR_texture_compression_astc_ldr) { 278ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin for (i = 0; i < ARRAY_SIZE(gles_astc_compatible_internal_formats); i++) { 279ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin if (gles_astc_compatible_internal_formats[i].internal_format 280ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin == internalformat) 281ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin return gles_astc_compatible_internal_formats[i].view_class; 282ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin } 283ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin } 284ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin 28537266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin if (ctx->Extensions.OES_texture_compression_astc) { 28637266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin for (i = 0; i < ARRAY_SIZE(gles_astc_3d_compatible_internal_formats); i++) { 28737266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin if (gles_astc_3d_compatible_internal_formats[i].internal_format 28837266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin == internalformat) 28937266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin return gles_astc_3d_compatible_internal_formats[i].view_class; 29037266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin } 29137266dfb7c747536d254b32eefa9222c60a37508Ilia Mirkin } 292ebdb5345480957c4fc3068fab17926be28d7dcd4Ilia Mirkin } 293f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return GL_FALSE; 294f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter} 295f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 296f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter/** 297f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * Initialize new texture's gl_texture_image structures. Will not call driver 298f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * to allocate new space, simply record relevant layer, face, format, etc. 299f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * \return GL_FALSE if any error, GL_TRUE otherwise. 300f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 301f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchterstatic GLboolean 302f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchterinitialize_texture_fields(struct gl_context *ctx, 303f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter GLenum target, 304f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter struct gl_texture_object *texObj, 305f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter GLint levels, 306f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter GLsizei width, GLsizei height, GLsizei depth, 30771fe9437169cfdafda8814aa814bb85429fb6cfcMark Mueller GLenum internalFormat, mesa_format texFormat) 308f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter{ 309f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter const GLuint numFaces = _mesa_num_tex_faces(target); 310f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter GLint level, levelWidth = width, levelHeight = height, levelDepth = depth; 311f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter GLuint face; 312f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 313f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* Pretend we are bound to initialize the gl_texture_image structs */ 314f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter texObj->Target = target; 315f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 316f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* Set up all the texture object's gl_texture_images */ 317f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter for (level = 0; level < levels; level++) { 318f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter for (face = 0; face < numFaces; face++) { 3198bb666cee30ec8e38f6a22c1d17216deda272bbcChris Forbes struct gl_texture_image *texImage; 3206e09df24b5cd7da0f49622db15ca70f5b2a3594bBrian Paul const GLenum faceTarget = _mesa_cube_face_target(target, face); 3218bb666cee30ec8e38f6a22c1d17216deda272bbcChris Forbes 3228bb666cee30ec8e38f6a22c1d17216deda272bbcChris Forbes texImage = _mesa_get_tex_image(ctx, texObj, faceTarget, level); 323f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 324f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (!texImage) { 325f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter _mesa_error(ctx, GL_OUT_OF_MEMORY, "glTexStorage"); 326f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return GL_FALSE; 327f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 328f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 329f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter _mesa_init_teximage_fields(ctx, texImage, 330f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter levelWidth, levelHeight, levelDepth, 331f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 0, internalFormat, texFormat); 332f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 333f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 3348369675a55ab300a84b3a82632042a33883ca255Brian Paul _mesa_next_mipmap_level_size(target, 0, 3358369675a55ab300a84b3a82632042a33883ca255Brian Paul levelWidth, levelHeight, levelDepth, 336f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter &levelWidth, &levelHeight, &levelDepth); 337f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 338f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 339f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* "unbind" */ 340f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter texObj->Target = 0; 341f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 342f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return GL_TRUE; 343f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter} 344f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 345f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter#define RETURN_IF_SUPPORTED(t) do { \ 346f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (newTarget == GL_ ## t) \ 347f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return true; \ 348f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter} while (0) 349f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 350f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter/** 351f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * Check for compatible target 352f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * If an error is found, record it with _mesa_error() 353f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * \return false if any error, true otherwise. 354f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 355f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchterstatic bool 356f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchtertarget_valid(struct gl_context *ctx, GLenum origTarget, GLenum newTarget) 357f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter{ 358f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* 359f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * From ARB_texture_view spec: 360f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------------------------------------- 361f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | Original target | Valid new targets | 362f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------------------------------------- 363f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | TEXTURE_1D | TEXTURE_1D, TEXTURE_1D_ARRAY | 364f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | ------------------------------------------------------------------------------------------------------- | 365f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | TEXTURE_2D | TEXTURE_2D, TEXTURE_2D_ARRAY | 366f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | ------------------------------------------------------------------------------------------------------- | 367f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | TEXTURE_3D | TEXTURE_3D | 368f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | ------------------------------------------------------------------------------------------------------- | 369f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | TEXTURE_CUBE_MAP | TEXTURE_CUBE_MAP, TEXTURE_2D, TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP_ARRAY | 370f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | ------------------------------------------------------------------------------------------------------- | 371f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | TEXTURE_RECTANGLE | TEXTURE_RECTANGLE | 372f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | ------------------------------------------------------------------------------------------------------- | 373f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | TEXTURE_BUFFER | <none> | 374f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | ------------------------------------------------------------------------------------------------------- | 375f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | TEXTURE_1D_ARRAY | TEXTURE_1D_ARRAY, TEXTURE_1D | 376f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | ------------------------------------------------------------------------------------------------------- | 377f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | TEXTURE_2D_ARRAY | TEXTURE_2D_ARRAY, TEXTURE_2D, TEXTURE_CUBE_MAP, TEXTURE_CUBE_MAP_ARRAY | 378f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | ------------------------------------------------------------------------------------------------------- | 379f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | TEXTURE_CUBE_MAP_ARRAY | TEXTURE_CUBE_MAP_ARRAY, TEXTURE_2D_ARRAY, TEXTURE_2D, TEXTURE_CUBE_MAP | 380f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | ------------------------------------------------------------------------------------------------------- | 381f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | TEXTURE_2D_MULTISAMPLE | TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY | 382f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | ------------------------------------------------------------------------------------------------------- | 383f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter | TEXTURE_2D_MULTISAMPLE_ARRAY | TEXTURE_2D_MULTISAMPLE, TEXTURE_2D_MULTISAMPLE_ARRAY | 384f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter --------------------------------------------------------------------------------------------------------- 385f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 386f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 387f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter switch (origTarget) { 388f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_1D: 389f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_1D_ARRAY: 390f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter RETURN_IF_SUPPORTED(TEXTURE_1D); 391f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter RETURN_IF_SUPPORTED(TEXTURE_1D_ARRAY); 392f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter break; 393f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_2D: 394f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter RETURN_IF_SUPPORTED(TEXTURE_2D); 395f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter RETURN_IF_SUPPORTED(TEXTURE_2D_ARRAY); 396f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter break; 397f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_3D: 398f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter RETURN_IF_SUPPORTED(TEXTURE_3D); 399f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter break; 400f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_RECTANGLE: 401f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter RETURN_IF_SUPPORTED(TEXTURE_RECTANGLE); 402f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter break; 403f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_CUBE_MAP: 404f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_2D_ARRAY: 405f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_CUBE_MAP_ARRAY: 406f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter RETURN_IF_SUPPORTED(TEXTURE_2D); 407f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter RETURN_IF_SUPPORTED(TEXTURE_2D_ARRAY); 408f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter RETURN_IF_SUPPORTED(TEXTURE_CUBE_MAP); 409f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter RETURN_IF_SUPPORTED(TEXTURE_CUBE_MAP_ARRAY); 410f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter break; 411f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_2D_MULTISAMPLE: 412f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: 413f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter RETURN_IF_SUPPORTED(TEXTURE_2D_MULTISAMPLE); 414f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter RETURN_IF_SUPPORTED(TEXTURE_2D_MULTISAMPLE_ARRAY); 415f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter break; 416f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 417f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter _mesa_error(ctx, GL_INVALID_OPERATION, 418f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter "glTextureView(illegal target=%s)", 4192f11e92cef51c88a09bc778e2ceca4ab50cf0017Kenneth Graunke _mesa_enum_to_string(newTarget)); 420f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return false; 421f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter} 422f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter#undef RETURN_IF_SUPPORTED 423f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 424f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter/** 425f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * Check for compatible format 426f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * If an error is found, record it with _mesa_error() 427f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * \return false if any error, true otherwise. 428f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 4293ddd1cf7d128018639de7e4c8bc17896233ebdb7Brian Paulbool 4303ddd1cf7d128018639de7e4c8bc17896233ebdb7Brian Paul_mesa_texture_view_compatible_format(const struct gl_context *ctx, 43141b6460e08bf878ec3372937f63bef2a7b63c484Jason Ekstrand GLenum origInternalFormat, 43241b6460e08bf878ec3372937f63bef2a7b63c484Jason Ekstrand GLenum newInternalFormat) 433f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter{ 434f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter unsigned int origViewClass, newViewClass; 435f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 436f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* The two textures' internal formats must be compatible according to 437f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * Table 3.X.2 (Compatible internal formats for TextureView) 438f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * if the internal format exists in that table the view class must match. 439f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * The internal formats must be identical if not in that table, 440f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * or an INVALID_OPERATION error is generated. 441f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 44241b6460e08bf878ec3372937f63bef2a7b63c484Jason Ekstrand if (origInternalFormat == newInternalFormat) 4433ddd1cf7d128018639de7e4c8bc17896233ebdb7Brian Paul return true; 444f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 44504e2e0b24a72dc4f66a0d56cee8b5d50233374a7Antia Puentes origViewClass = _mesa_texture_view_lookup_view_class(ctx, origInternalFormat); 44604e2e0b24a72dc4f66a0d56cee8b5d50233374a7Antia Puentes newViewClass = _mesa_texture_view_lookup_view_class(ctx, newInternalFormat); 447f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if ((origViewClass == newViewClass) && origViewClass != false) 4483ddd1cf7d128018639de7e4c8bc17896233ebdb7Brian Paul return true; 449f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 4503ddd1cf7d128018639de7e4c8bc17896233ebdb7Brian Paul return false; 451f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter} 4528369675a55ab300a84b3a82632042a33883ca255Brian Paul 4531db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter/** 4541db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter * Helper function for TexStorage and teximagemultisample to set immutable 4551db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter * texture state needed by ARB_texture_view. 4561db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter */ 4571db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchtervoid 4581db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter_mesa_set_texture_view_state(struct gl_context *ctx, 4591db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter struct gl_texture_object *texObj, 4601db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter GLenum target, GLuint levels) 4611db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter{ 4621db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter struct gl_texture_image *texImage; 4631db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter 4641db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter /* Get a reference to what will become this View's base level */ 465f262ed6e3dd9d447355ea2490e84c0a6b0fd1ddbBrian Paul texImage = _mesa_select_tex_image(texObj, target, 0); 4661db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter 4678369675a55ab300a84b3a82632042a33883ca255Brian Paul /* When an immutable texture is created via glTexStorage or 4688369675a55ab300a84b3a82632042a33883ca255Brian Paul * glTexImageMultisample, 4691db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter * TEXTURE_IMMUTABLE_FORMAT becomes TRUE. 4701db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter * TEXTURE_IMMUTABLE_LEVELS and TEXTURE_VIEW_NUM_LEVELS become levels. 4711db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter * If the texture target is TEXTURE_1D_ARRAY then 4721db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter * TEXTURE_VIEW_NUM_LAYERS becomes height. 4731db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter * If the texture target is TEXTURE_2D_ARRAY, TEXTURE_CUBE_MAP_ARRAY, 4748369675a55ab300a84b3a82632042a33883ca255Brian Paul * or TEXTURE_2D_MULTISAMPLE_ARRAY then TEXTURE_VIEW_NUM_LAYERS becomes 4758369675a55ab300a84b3a82632042a33883ca255Brian Paul * depth. 4761db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter * If the texture target is TEXTURE_CUBE_MAP, then 4771db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter * TEXTURE_VIEW_NUM_LAYERS becomes 6. 4781db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter * For any other texture target, TEXTURE_VIEW_NUM_LAYERS becomes 1. 4798369675a55ab300a84b3a82632042a33883ca255Brian Paul * 4801db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter * ARB_texture_multisample: Multisample textures do 4811db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter * not have multiple image levels. 4821db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter */ 4831db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter 4841db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter texObj->Immutable = GL_TRUE; 4851db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter texObj->ImmutableLevels = levels; 4861db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter texObj->MinLevel = 0; 4871db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter texObj->NumLevels = levels; 4881db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter texObj->MinLayer = 0; 4891db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter texObj->NumLayers = 1; 4901db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter switch (target) { 4911db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter case GL_TEXTURE_1D_ARRAY: 4921db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter texObj->NumLayers = texImage->Height; 4931db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter break; 4941db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter 4951db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter case GL_TEXTURE_2D_MULTISAMPLE: 4961db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter texObj->NumLevels = 1; 4971db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter texObj->ImmutableLevels = 1; 4981db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter break; 4991db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter 5001db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: 5011db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter texObj->NumLevels = 1; 5021db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter texObj->ImmutableLevels = 1; 5031db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter /* fall through to set NumLayers */ 5041db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter 5051db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter case GL_TEXTURE_2D_ARRAY: 5061db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter case GL_TEXTURE_CUBE_MAP_ARRAY: 5071db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter texObj->NumLayers = texImage->Depth; 5081db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter break; 5091db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter 5101db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter case GL_TEXTURE_CUBE_MAP: 5111db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter texObj->NumLayers = 6; 5121db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter break; 5131db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter } 5141db4cb841b489684f9141184f17a9244cdfa8c7eCourtney Goeltzenleuchter} 515f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 516d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter/** 517d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * glTextureView (ARB_texture_view) 518d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * If an error is found, record it with _mesa_error() 519d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter * \return none. 520d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter */ 521d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchtervoid GLAPIENTRY 522d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter_mesa_TextureView(GLuint texture, GLenum target, GLuint origtexture, 523d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter GLenum internalformat, 524d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter GLuint minlevel, GLuint numlevels, 525d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter GLuint minlayer, GLuint numlayers) 526d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter{ 527f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter struct gl_texture_object *texObj; 528f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter struct gl_texture_object *origTexObj; 529f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter struct gl_texture_image *origTexImage; 530f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter GLuint newViewMinLevel, newViewMinLayer; 531f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter GLuint newViewNumLevels, newViewNumLayers; 532f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter GLsizei width, height, depth; 53371fe9437169cfdafda8814aa814bb85429fb6cfcMark Mueller mesa_format texFormat; 534f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter GLboolean sizeOK, dimensionsOK; 535f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter GLenum faceTarget; 536f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 537d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter GET_CURRENT_CONTEXT(ctx); 538d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter 539d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter if (MESA_VERBOSE & (VERBOSE_API | VERBOSE_TEXTURE)) 540f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter _mesa_debug(ctx, "glTextureView %d %s %d %s %d %d %d %d\n", 5412f11e92cef51c88a09bc778e2ceca4ab50cf0017Kenneth Graunke texture, _mesa_enum_to_string(target), origtexture, 5422f11e92cef51c88a09bc778e2ceca4ab50cf0017Kenneth Graunke _mesa_enum_to_string(internalformat), 543d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter minlevel, numlevels, minlayer, numlayers); 544d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter 545f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (origtexture == 0) { 5468369675a55ab300a84b3a82632042a33883ca255Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTextureView(origtexture = %u)", 5478369675a55ab300a84b3a82632042a33883ca255Brian Paul origtexture); 548f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; 549f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 550f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 551f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* Need original texture information to validate arguments */ 552f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter origTexObj = _mesa_lookup_texture(ctx, origtexture); 553f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 5548369675a55ab300a84b3a82632042a33883ca255Brian Paul /* If <origtexture> is not the name of a texture, INVALID_VALUE 5558369675a55ab300a84b3a82632042a33883ca255Brian Paul * is generated. 5568369675a55ab300a84b3a82632042a33883ca255Brian Paul */ 557f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (!origTexObj) { 5588369675a55ab300a84b3a82632042a33883ca255Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTextureView(origtexture = %u)", 5598369675a55ab300a84b3a82632042a33883ca255Brian Paul origtexture); 560f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; 561f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 562f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 563f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* If <origtexture>'s TEXTURE_IMMUTABLE_FORMAT value is not TRUE, 564f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * INVALID_OPERATION is generated. 565f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 566f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (!origTexObj->Immutable) { 5678369675a55ab300a84b3a82632042a33883ca255Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 5688369675a55ab300a84b3a82632042a33883ca255Brian Paul "glTextureView(origtexture not immutable)"); 569f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; 570f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 571f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 572f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* If <texture> is 0, INVALID_VALUE is generated. */ 573f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (texture == 0) { 574f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter _mesa_error(ctx, GL_INVALID_VALUE, "glTextureView(texture = 0)"); 575f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; 576f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 577f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 578f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* If <texture> is not a valid name returned by GenTextures, 579f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * the error INVALID_OPERATION is generated. 580f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 581f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter texObj = _mesa_lookup_texture(ctx, texture); 582f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (texObj == NULL) { 5838369675a55ab300a84b3a82632042a33883ca255Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 5848369675a55ab300a84b3a82632042a33883ca255Brian Paul "glTextureView(texture = %u non-gen name)", texture); 585f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; 586f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 587f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 588f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* If <texture> has already been bound and given a target, then 589f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * the error INVALID_OPERATION is generated. 590f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 591f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (texObj->Target) { 5928369675a55ab300a84b3a82632042a33883ca255Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 5938369675a55ab300a84b3a82632042a33883ca255Brian Paul "glTextureView(texture = %u already bound)", texture); 594f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; 595f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 596f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 597f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* Check for compatible target */ 598f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (!target_valid(ctx, origTexObj->Target, target)) { 599f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; /* error was recorded */ 600f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 601f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 6028369675a55ab300a84b3a82632042a33883ca255Brian Paul /* minlevel and minlayer are relative to the view of origtexture. 603f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * If minlevel or minlayer is greater than level or layer, respectively, 6048369675a55ab300a84b3a82632042a33883ca255Brian Paul * return INVALID_VALUE. 605f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 606f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter newViewMinLevel = origTexObj->MinLevel + minlevel; 607f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter newViewMinLayer = origTexObj->MinLayer + minlayer; 608f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (newViewMinLevel >= (origTexObj->MinLevel + origTexObj->NumLevels)) { 609f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter _mesa_error(ctx, GL_INVALID_VALUE, 6108369675a55ab300a84b3a82632042a33883ca255Brian Paul "glTextureView(new minlevel (%d) > orig minlevel (%d)" 6118369675a55ab300a84b3a82632042a33883ca255Brian Paul " + orig numlevels (%d))", 612f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter newViewMinLevel, origTexObj->MinLevel, origTexObj->NumLevels); 613f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; 614f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 615f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 616f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (newViewMinLayer >= (origTexObj->MinLayer + origTexObj->NumLayers)) { 617f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter _mesa_error(ctx, GL_INVALID_VALUE, 6188369675a55ab300a84b3a82632042a33883ca255Brian Paul "glTextureView(new minlayer (%d) > orig minlayer (%d)" 6198369675a55ab300a84b3a82632042a33883ca255Brian Paul " + orig numlayers (%d))", 620f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter newViewMinLayer, origTexObj->MinLayer, origTexObj->NumLayers); 621f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; 622f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 623f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 62441b6460e08bf878ec3372937f63bef2a7b63c484Jason Ekstrand if (!_mesa_texture_view_compatible_format(ctx, 6258369675a55ab300a84b3a82632042a33883ca255Brian Paul origTexObj->Image[0][0]->InternalFormat, 6268369675a55ab300a84b3a82632042a33883ca255Brian Paul internalformat)) { 62741b6460e08bf878ec3372937f63bef2a7b63c484Jason Ekstrand _mesa_error(ctx, GL_INVALID_OPERATION, 6288369675a55ab300a84b3a82632042a33883ca255Brian Paul "glTextureView(internalformat %s not compatible with origtexture %s)", 6292f11e92cef51c88a09bc778e2ceca4ab50cf0017Kenneth Graunke _mesa_enum_to_string(internalformat), 6302f11e92cef51c88a09bc778e2ceca4ab50cf0017Kenneth Graunke _mesa_enum_to_string(origTexObj->Image[0][0]->InternalFormat)); 63141b6460e08bf878ec3372937f63bef2a7b63c484Jason Ekstrand return; 632f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 633f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 634f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter texFormat = _mesa_choose_texture_format(ctx, texObj, target, 0, 635f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter internalformat, GL_NONE, GL_NONE); 636f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter assert(texFormat != MESA_FORMAT_NONE); 637f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (texFormat == MESA_FORMAT_NONE) return; 638f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 639f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter newViewNumLevels = MIN2(numlevels, origTexObj->NumLevels - minlevel); 640f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter newViewNumLayers = MIN2(numlayers, origTexObj->NumLayers - minlayer); 641f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 6426e09df24b5cd7da0f49622db15ca70f5b2a3594bBrian Paul faceTarget = _mesa_cube_face_target(origTexObj->Target, minlayer); 643f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 644f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* Get a reference to what will become this View's base level */ 645f262ed6e3dd9d447355ea2490e84c0a6b0fd1ddbBrian Paul origTexImage = _mesa_select_tex_image(origTexObj, faceTarget, minlevel); 646f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter width = origTexImage->Width; 647f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter height = origTexImage->Height; 648f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter depth = origTexImage->Depth; 649f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 650f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* Adjust width, height, depth to be appropriate for new target */ 651f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter switch (target) { 652f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_1D: 6530c38006b5510f7580a0add1339e41cde653cd25cIlia Mirkin height = 1; 6540c38006b5510f7580a0add1339e41cde653cd25cIlia Mirkin break; 6550c38006b5510f7580a0add1339e41cde653cd25cIlia Mirkin 656f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_3D: 657f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter break; 658f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 659f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_1D_ARRAY: 660f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter height = (GLsizei) newViewNumLayers; 661f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter break; 662f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 663f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_2D: 664f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_2D_MULTISAMPLE: 665f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_RECTANGLE: 66630823f997b96e3568bc94827253e3a2b08e86598Dave Airlie depth = 1; 66730823f997b96e3568bc94827253e3a2b08e86598Dave Airlie break; 668f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_CUBE_MAP: 66930823f997b96e3568bc94827253e3a2b08e86598Dave Airlie /* If the new texture's target is TEXTURE_CUBE_MAP, the clamped 67030823f997b96e3568bc94827253e3a2b08e86598Dave Airlie * <numlayers> must be equal to 6. 67130823f997b96e3568bc94827253e3a2b08e86598Dave Airlie */ 67230823f997b96e3568bc94827253e3a2b08e86598Dave Airlie if (newViewNumLayers != 6) { 67330823f997b96e3568bc94827253e3a2b08e86598Dave Airlie _mesa_error(ctx, GL_INVALID_VALUE, 67430823f997b96e3568bc94827253e3a2b08e86598Dave Airlie "glTextureView(clamped numlayers %d != 6)", 67530823f997b96e3568bc94827253e3a2b08e86598Dave Airlie newViewNumLayers); 67630823f997b96e3568bc94827253e3a2b08e86598Dave Airlie return; 67730823f997b96e3568bc94827253e3a2b08e86598Dave Airlie } 678f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter depth = 1; 679f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter break; 680f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 681f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_2D_ARRAY: 682f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_2D_MULTISAMPLE_ARRAY: 683f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter depth = newViewNumLayers; 684f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter break; 68530823f997b96e3568bc94827253e3a2b08e86598Dave Airlie case GL_TEXTURE_CUBE_MAP_ARRAY: 68630823f997b96e3568bc94827253e3a2b08e86598Dave Airlie /* If the new texture's target is TEXTURE_CUBE_MAP_ARRAY, 68730823f997b96e3568bc94827253e3a2b08e86598Dave Airlie * then <numlayers> counts layer-faces rather than layers, 68830823f997b96e3568bc94827253e3a2b08e86598Dave Airlie * and the clamped <numlayers> must be a multiple of 6. 68930823f997b96e3568bc94827253e3a2b08e86598Dave Airlie * Otherwise, the error INVALID_VALUE is generated. 69030823f997b96e3568bc94827253e3a2b08e86598Dave Airlie */ 69130823f997b96e3568bc94827253e3a2b08e86598Dave Airlie if ((newViewNumLayers % 6) != 0) { 69230823f997b96e3568bc94827253e3a2b08e86598Dave Airlie _mesa_error(ctx, GL_INVALID_VALUE, 69330823f997b96e3568bc94827253e3a2b08e86598Dave Airlie "glTextureView(clamped numlayers %d is not" 69430823f997b96e3568bc94827253e3a2b08e86598Dave Airlie " a multiple of 6)", 69530823f997b96e3568bc94827253e3a2b08e86598Dave Airlie newViewNumLayers); 69630823f997b96e3568bc94827253e3a2b08e86598Dave Airlie return; 69730823f997b96e3568bc94827253e3a2b08e86598Dave Airlie } 69830823f997b96e3568bc94827253e3a2b08e86598Dave Airlie depth = newViewNumLayers; 69930823f997b96e3568bc94827253e3a2b08e86598Dave Airlie break; 700f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 701f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 702f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* If the dimensions of the original texture are larger than the maximum 703f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * supported dimensions of the new target, the error INVALID_OPERATION is 704f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * generated. For example, if the original texture has a TEXTURE_2D_ARRAY 705f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * target and its width is greater than MAX_CUBE_MAP_TEXTURE_SIZE, an error 706f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * will be generated if TextureView is called to create a TEXTURE_CUBE_MAP 707f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * view. 708f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 709f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter dimensionsOK = _mesa_legal_texture_dimensions(ctx, target, 0, 710f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter width, height, depth, 0); 711f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (!dimensionsOK) { 7128369675a55ab300a84b3a82632042a33883ca255Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 7138369675a55ab300a84b3a82632042a33883ca255Brian Paul "glTextureView(invalid width or height or depth)"); 714f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; 715f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 716f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 7170ac9f25032a2e1bca52552972da4b55276fc1ae6Brian Paul sizeOK = ctx->Driver.TestProxyTexImage(ctx, target, 1, 0, texFormat, 7180ac9f25032a2e1bca52552972da4b55276fc1ae6Brian Paul origTexImage->NumSamples, 7190ac9f25032a2e1bca52552972da4b55276fc1ae6Brian Paul width, height, depth); 720f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (!sizeOK) { 7218369675a55ab300a84b3a82632042a33883ca255Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 7228369675a55ab300a84b3a82632042a33883ca255Brian Paul "glTextureView(invalid texture size)"); 723f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; 724f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 725f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 726f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* If <target> is TEXTURE_1D, TEXTURE_2D, TEXTURE_3D, TEXTURE_RECTANGLE, 727f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * or TEXTURE_2D_MULTISAMPLE and <numlayers> does not equal 1, the error 728f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * INVALID_VALUE is generated. 729f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 730f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter switch (target) { 731f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_1D: 732f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_2D: 733f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_3D: 734f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_RECTANGLE: 735f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_2D_MULTISAMPLE: 736f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (numlayers != 1) { 7378369675a55ab300a84b3a82632042a33883ca255Brian Paul _mesa_error(ctx, GL_INVALID_VALUE, "glTextureView(numlayers %d != 1)", 7388369675a55ab300a84b3a82632042a33883ca255Brian Paul numlayers); 739f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; 740f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 741f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter break; 742f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_CUBE_MAP: 743f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter break; 744f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter case GL_TEXTURE_CUBE_MAP_ARRAY: 745f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter break; 746f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 747f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 748f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* If the new texture's target is TEXTURE_CUBE_MAP or 749f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * TEXTURE_CUBE_MAP_ARRAY, the width and height of the original texture's 750f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * levels must be equal otherwise the error INVALID_OPERATION is generated. 751f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 752f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if ((target == GL_TEXTURE_CUBE_MAP || target == GL_TEXTURE_CUBE_MAP_ARRAY) && 753f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter (origTexImage->Width != origTexImage->Height)) { 7548369675a55ab300a84b3a82632042a33883ca255Brian Paul _mesa_error(ctx, GL_INVALID_OPERATION, 7558369675a55ab300a84b3a82632042a33883ca255Brian Paul "glTextureView(origtexture width (%d) != height (%d))", 756f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter origTexImage->Width, origTexImage->Height); 757f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; 758f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 759f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 760f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* When the original texture's target is TEXTURE_CUBE_MAP, the layer 761f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * parameters are interpreted in the same order as if it were a 762f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * TEXTURE_CUBE_MAP_ARRAY with 6 layer-faces. 763f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 764f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 765f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* If the internal format does not exactly match the internal format of the 766f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * original texture, the contents of the memory are reinterpreted in the 767f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * same manner as for image bindings described in 768f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * section 3.9.20 (Texture Image Loads and Stores). 769f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 770f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 771f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter /* TEXTURE_BASE_LEVEL and TEXTURE_MAX_LEVEL are interpreted 772f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter * relative to the view and not relative to the original data store. 773f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter */ 774f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 775f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter if (!initialize_texture_fields(ctx, target, texObj, newViewNumLevels, 776f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter width, height, depth, 777f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter internalformat, texFormat)) { 778f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; /* Already recorded error */ 779f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 780f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter 781f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter texObj->MinLevel = newViewMinLevel; 782f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter texObj->MinLayer = newViewMinLayer; 783f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter texObj->NumLevels = newViewNumLevels; 784f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter texObj->NumLayers = newViewNumLayers; 785f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter texObj->Immutable = GL_TRUE; 786f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter texObj->ImmutableLevels = origTexObj->ImmutableLevels; 787f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter texObj->Target = target; 7887d7dd1871174905dfdd3ca874a09d9d7837ac743Brian Paul texObj->TargetIndex = _mesa_tex_target_to_index(ctx, target); 7897d7dd1871174905dfdd3ca874a09d9d7837ac743Brian Paul assert(texObj->TargetIndex < NUM_TEXTURE_TARGETS); 790d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter 7918369675a55ab300a84b3a82632042a33883ca255Brian Paul if (ctx->Driver.TextureView != NULL && 7928369675a55ab300a84b3a82632042a33883ca255Brian Paul !ctx->Driver.TextureView(ctx, texObj, origTexObj)) { 793f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter return; /* driver recorded error */ 794f07ca598394a9b5cea849ff7fc68444aba94ede9Courtney Goeltzenleuchter } 795d77d2af20a978972d74dcaa6c1099be02578f247Courtney Goeltzenleuchter} 796