1 /*
2  * Copyright © 2011 Intel Corporation
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining a
5  * copy of this software and associated documentation files (the "Software"),
6  * to deal in the Software without restriction, including without limitation
7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8  * and/or sell copies of the Software, and to permit persons to whom the
9  * Software is furnished to do so, subject to the following conditions:
10  *
11  * The above copyright notice and this permission notice (including the next
12  * paragraph) shall be included in all copies or substantial portions of the
13  * Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21  * IN THE SOFTWARE.
22  */
23 
24 #include "piglit-util-gl.h"
25 
26 /**
27  * @file clear.c
28  *
29  * Tests that conditional rendering appropriately affects glClear().
30  *
31  * From the NV_conditional_render spec:
32  *
33  *     "If the result (SAMPLES_PASSED) of the query is zero, all
34  *      rendering commands between BeginConditionalRenderNV and the
35  *      corresponding EndConditionalRenderNV are discarded.  In this
36  *      case, Begin, End, all vertex array commands performing an
37  *      implicit Begin and End, DrawPixels (section 3.6), Bitmap
38  *      (section 3.7), Clear (section 4.2.3), Accum (section 4.2.4),
39  *      CopyPixels (section 4.3.3), EvalMesh1, and EvalMesh2 (section
40  *      5.1) have no effect."
41  */
42 
43 PIGLIT_GL_TEST_CONFIG_BEGIN
44 
45 	config.supports_gl_compat_version = 10;
46 	config.window_visual = PIGLIT_GL_VISUAL_DOUBLE | PIGLIT_GL_VISUAL_RGBA;
47 	config.khr_no_error_support = PIGLIT_NO_ERRORS;
48 
49 PIGLIT_GL_TEST_CONFIG_END
50 
51 enum piglit_result
piglit_display(void)52 piglit_display(void)
53 {
54 	bool pass = true;
55 	float green[4] = {0.0, 1.0, 0.0, 0.0};
56 	GLuint q;
57 
58 	glClearColor(0.5, 0.5, 0.5, 0.5);
59 	glClear(GL_COLOR_BUFFER_BIT);
60 
61 	glGenQueries(1, &q);
62 
63 	/* Generate query pass: draw top half of screen. */
64 	glColor4f(0.0, 1.0, 0.0, 0.0);
65 	glBeginQuery(GL_SAMPLES_PASSED, q);
66 	piglit_draw_rect(-1, 0, 2, 1);
67 	glEndQuery(GL_SAMPLES_PASSED);
68 
69 	/* Conditional render that should draw bottom half of screen. */
70 	glBeginConditionalRenderNV(q, GL_QUERY_WAIT_NV);
71 	glClearColor(0.0, 1.0, 0.0, 0.0);
72 	glClear(GL_COLOR_BUFFER_BIT);
73 	glEndConditionalRenderNV();
74 
75 	/* Generate query fail */
76 	glBeginQuery(GL_SAMPLES_PASSED, q);
77 	glEndQuery(GL_SAMPLES_PASSED);
78 
79 	/* Conditional render that should not draw full screen. */
80 	glBeginConditionalRenderNV(q, GL_QUERY_WAIT_NV);
81 	glClearColor(1.0, 0.0, 0.0, 0.0);
82 	glClear(GL_COLOR_BUFFER_BIT);
83 	glEndConditionalRenderNV();
84 
85 	pass = piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height,
86 				      green);
87 
88 	piglit_present_results();
89 
90 	glDeleteQueries(1, &q);
91 
92 	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
93 }
94 
95 void
piglit_init(int argc,char ** argv)96 piglit_init(int argc, char **argv)
97 {
98 	piglit_require_gl_version(20);
99 
100 	piglit_require_extension("GL_NV_conditional_render");
101 }
102