1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
|
/*
* Copyright (c) 2012 VMware, Inc.
*
* Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"),
* to deal in the Software without restriction, including without limitation
* on the rights to use, copy, modify, merge, publish, distribute, sub
* license, and/or sell copies of the Software, and to permit persons to whom
* the Software is furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice (including the next
* paragraph) shall be included in all copies or substantial portions of the
* Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NON-INFRINGEMENT. IN NO EVENT SHALL THE AUTHORS AND/OR THEIR
* SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
* WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
* DEALINGS IN THE SOFTWARE.
*/
/**
* Tests 3D texture with depth=1 (to make sure it's not errantly treated
* as a 2D texture.
*
* Brian Paul
* 28 Aug 2012
*/
#include "piglit-util-gl-common.h"
PIGLIT_GL_TEST_CONFIG_BEGIN
config.window_width = 64;
config.window_height = 64;
config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_ALPHA;
PIGLIT_GL_TEST_CONFIG_END
#define TEX_SIZE 8
static const float green[4] = {0.0, 1.0, 0.0, 1.0};
enum piglit_result
piglit_display(void)
{
/* texcoords with R=-1.0 to sample the border color */
static const GLfloat texcoords[4][3] =
{ { 0.0, 0.0, -1.0 },
{ 1.0, 0.0, -1.0 },
{ 1.0, 1.0, -1.0 },
{ 0.0, 1.0, -1.0 } };
GLfloat verts[4][2];
bool pass;
piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
glClear(GL_COLOR_BUFFER_BIT);
verts[0][0] = 0.0; verts[0][1] = 0.0;
verts[1][0] = piglit_width; verts[1][1] = 0.0;
verts[2][0] = piglit_width; verts[2][1] = piglit_height;
verts[3][0] = 0.0; verts[3][1] = piglit_height;
glVertexPointer(2, GL_FLOAT, 0, verts);
glTexCoordPointer(3, GL_FLOAT, 0, texcoords);
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glDrawArrays(GL_TRIANGLE_FAN, 0, 4);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
/* Should have drawn solid green since we're sampling the
* texture border color for all fragments drawn. If red is
* seen, it's probably because the 3D texture (with depth=1)
* is being treated as a 2D texture.
*
* BTW, another way the difference between 2D/3D textures
* could be detected would be with R-coordinate derivatives
* and LOD selection.
*/
pass = piglit_probe_rect_rgba(0, 0,
piglit_width - 1, piglit_height - 1,
green);
piglit_present_results();
return pass ? PIGLIT_PASS : PIGLIT_FAIL;
}
void
piglit_init(int argc, char **argv)
{
GLubyte pixels[TEX_SIZE][TEX_SIZE][4];
GLuint tex;
int i, j;
/* solid red texture */
for (i = 0; i < TEX_SIZE; i++) {
for (j = 0; j < TEX_SIZE; j++) {
pixels[i][j][0] = 255;
pixels[i][j][1] = 0;
pixels[i][j][2] = 0;
pixels[i][j][3] = 255;
}
}
glGenTextures(1, &tex);
glBindTexture(GL_TEXTURE_3D, tex);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_3D, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_BORDER);
glTexParameterfv(GL_TEXTURE_3D, GL_TEXTURE_BORDER_COLOR, green);
glTexImage3D(GL_TEXTURE_3D, 0, GL_RGBA, TEX_SIZE, TEX_SIZE, 1,
0, GL_RGBA, GL_UNSIGNED_BYTE, pixels);
glEnable(GL_TEXTURE_3D);
}
|