2 * (C) Copyright IBM Corporation 2004
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * on the rights to use, copy, modify, merge, publish, distribute, sub
9 * license, and/or sell copies of the Software, and to permit persons to whom
10 * the Software is furnished to do so, subject to the following conditions:
12 * The above copyright notice and this permission notice (including the next
13 * paragraph) shall be included in all copies or substantial portions of the
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
19 * VA LINUX SYSTEM, IBM AND/OR THEIR SUPPLIERS BE LIABLE FOR ANY CLAIM,
20 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
21 * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
22 * USE OR OTHER DEALINGS IN THE SOFTWARE.
26 * \file stencil_wrap.c
28 * Simple test of GL_EXT_stencil_wrap functionality. Four squares are drawn
29 * with different stencil modes, but all should be rendered with the same
32 * \author Ian Romanick <idr@us.ibm.com>
35 #include "piglit-util-gl.h"
37 PIGLIT_GL_TEST_CONFIG_BEGIN
39 config
.supports_gl_compat_version
= 10;
41 config
.window_width
= 550;
42 config
.window_height
= 200;
43 config
.window_visual
= PIGLIT_GL_VISUAL_RGB
| PIGLIT_GL_VISUAL_DOUBLE
| PIGLIT_GL_VISUAL_DEPTH
| PIGLIT_GL_VISUAL_STENCIL
;
45 PIGLIT_GL_TEST_CONFIG_END
53 GLboolean pass
= GL_TRUE
;
54 float expected
[4] = {0.5, 0.5, 0.5, 0.5};
55 int w
= piglit_width
/ (5 * 2 + 1);
57 int start_y
= (piglit_height
- h
) / 2;
59 piglit_ortho_projection(piglit_width
, piglit_height
, GL_FALSE
);
61 glGetIntegerv(GL_STENCIL_BITS
, & stencil_bits
);
62 max_stencil
= (1U << stencil_bits
) - 1;
63 printf("Stencil bits = %u, maximum stencil value = 0x%08x\n",
64 stencil_bits
, max_stencil
);
67 glClearColor(0.2, 0.2, 0.8, 0);
68 glClear(GL_COLOR_BUFFER_BIT
| GL_DEPTH_BUFFER_BIT
|
69 GL_STENCIL_BUFFER_BIT
);
71 /* This is the "reference" square.
74 glDisable(GL_STENCIL_TEST
);
75 glColor3f(0.5, 0.5, 0.5);
76 piglit_draw_rect(w
* 1, start_y
, w
, h
);
78 glEnable(GL_STENCIL_TEST
);
80 /* Draw the first two squares using the two non-wrap (i.e., saturate)
84 glStencilFunc(GL_ALWAYS
, 0, ~0);
85 glStencilOp(GL_KEEP
, GL_KEEP
, GL_INCR
);
87 glColor3f(0.9, 0.9, 0.9);
89 for (i
= 0 ; i
< (max_stencil
+ 5) ; i
++) {
90 piglit_draw_rect(w
* 3, start_y
, w
, h
);
93 glStencilFunc(GL_EQUAL
, max_stencil
, ~0);
94 glColor3f(0.5, 0.5, 0.5);
95 piglit_draw_rect(w
* 3, start_y
, w
, h
);
97 glStencilFunc(GL_ALWAYS
, 0, ~0);
98 glStencilOp(GL_KEEP
, GL_KEEP
, GL_DECR
);
100 glColor3f(0.9, 0.9, 0.9);
102 for (i
= 0 ; i
< (max_stencil
+ 5) ; i
++) {
103 piglit_draw_rect(w
* 5, start_y
, w
, h
);
106 glStencilFunc(GL_EQUAL
, 0, ~0);
107 glColor3f(0.5, 0.5, 0.5);
108 piglit_draw_rect(w
* 5, start_y
, w
, h
);
110 /* Draw the last two squares using the two wrap modes.
113 glStencilFunc(GL_ALWAYS
, 0, ~0);
114 glStencilOp(GL_KEEP
, GL_KEEP
, GL_INCR_WRAP
);
116 glColor3f(0.9, 0.9, 0.9);
118 for (i
= 0 ; i
< (max_stencil
+ 5) ; i
++) {
119 piglit_draw_rect(w
* 7, start_y
, w
, h
);
122 glStencilFunc(GL_EQUAL
, 4, ~0);
123 glColor3f(0.5, 0.5, 0.5);
124 piglit_draw_rect(w
* 7, start_y
, w
, h
);
126 glStencilFunc(GL_ALWAYS
, 0, ~0);
127 glStencilOp(GL_KEEP
, GL_KEEP
, GL_DECR_WRAP
);
129 glColor3f(0.9, 0.9, 0.9);
131 for (i
= 0 ; i
< 5 ; i
++) {
132 piglit_draw_rect(w
* 9, start_y
, w
, h
);
135 glStencilFunc(GL_EQUAL
, (max_stencil
- 4), ~0);
136 glColor3f(0.5, 0.5, 0.5);
137 piglit_draw_rect(w
* 9, start_y
, w
, h
);
139 pass
= piglit_probe_pixel_rgb(w
* 1.5, piglit_height
/ 2, expected
) && pass
;
140 pass
= piglit_probe_pixel_rgb(w
* 3.5, piglit_height
/ 2, expected
) && pass
;
141 pass
= piglit_probe_pixel_rgb(w
* 5.5, piglit_height
/ 2, expected
) && pass
;
142 pass
= piglit_probe_pixel_rgb(w
* 7.5, piglit_height
/ 2, expected
) && pass
;
143 pass
= piglit_probe_pixel_rgb(w
* 9.5, piglit_height
/ 2, expected
) && pass
;
145 piglit_present_results();
147 return pass
? PIGLIT_PASS
: PIGLIT_FAIL
;
151 piglit_init(int argc
, char **argv
)
153 if (!piglit_is_extension_supported("GL_EXT_stencil_wrap") && piglit_get_gl_version() < 14) {
154 printf("Sorry, this program requires either "
155 "GL_EXT_stencil_wrap or OpenGL 1.4.\n");
156 piglit_report_result(PIGLIT_SKIP
);
159 printf("\nAll 5 squares should be the same color.\n");