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