point-sprite.c 4.22 KB
Newer Older
Ben Holmes's avatar
Ben Holmes committed
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
/*
 * Copyright © 2009 Intel Corporation
 *
 * 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
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * 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 NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS 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.
 */

/**
 * This test draws a point sprite with a checkerboard texture and tests whether
 * the correct colors were drawn using piglit_probe_pixel_rgb.
 *
 * \author Ben Holmes
 */

#include "piglit-util.h"
32 33
#include "piglit-framework.h"

34 35 36
#define BOX_SIZE 64
#define TEST_COLS 6
#define TEST_ROWS 2
37

38
int piglit_window_mode = GLUT_DOUBLE | GLUT_RGB;
39 40
int piglit_width = 1 + ((BOX_SIZE + 1) * TEST_COLS);
int piglit_height = 1 + ((BOX_SIZE + 1) * TEST_ROWS);
Ben Holmes's avatar
Ben Holmes committed
41 42 43

static float maxSize = 0.0f;
static GLuint tex;
44 45
static const GLfloat black[4] = {0.0, 0.0, 0.0, 1.0};
static const GLfloat white[4] = {1.0, 1.0, 1.0, 1.0};
46 47 48

void
piglit_init(int argc, char **argv)
Ben Holmes's avatar
Ben Holmes committed
49
{
50 51
	GLfloat realMaxSize;

52 53 54
	(void) argc;
	(void) argv;

Ben Holmes's avatar
Ben Holmes committed
55 56
	piglit_require_extension("GL_ARB_point_sprite");

57
	piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);
Ben Holmes's avatar
Ben Holmes committed
58 59 60 61

	glEnable(GL_TEXTURE_2D);
	glEnable(GL_POINT_SPRITE_ARB);

62 63
	glGetFloatv(GL_POINT_SIZE_MAX, &realMaxSize);
	maxSize = (realMaxSize > BOX_SIZE) ? BOX_SIZE : realMaxSize;
Ben Holmes's avatar
Ben Holmes committed
64 65 66 67

	glClearColor(0.2, 0.2, 0.2, 1.0);
	glColor3f(1.0, 1.0, 1.0);

68 69
	tex = piglit_checkerboard_texture(0, 0, 2, 2, 1, 1, black, white);
	glTexEnvi(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE);
70 71 72 73

	if (!piglit_automatic)
		printf("Maximum point size is %f, using %f\n", 
		       realMaxSize, maxSize);
Ben Holmes's avatar
Ben Holmes committed
74 75
}

76 77
enum piglit_result
piglit_display(void)
Ben Holmes's avatar
Ben Holmes committed
78
{
79
	static const GLenum origins[2] = { GL_UPPER_LEFT, GL_LOWER_LEFT	};
Paul Berry's avatar
Paul Berry committed
80
	const unsigned num_rows = (piglit_get_gl_version() >= 20) ? 2 : 1;
81 82 83
	GLboolean pass = GL_TRUE;
	unsigned i;
	unsigned j;
Ben Holmes's avatar
Ben Holmes committed
84 85 86 87

	glClear(GL_COLOR_BUFFER_BIT);
	glBindTexture(GL_TEXTURE_2D, tex);

88 89 90 91 92 93 94 95 96 97
	for (i = 0; i < num_rows; i++) {
		const float y = 1 + (BOX_SIZE / 2) + (i * (BOX_SIZE + 1));
		const float *const upper_left = (origins[i] == GL_UPPER_LEFT)
			? black : white;
		const float *const lower_left = (origins[i] == GL_UPPER_LEFT)
			? white : black;

		/* OpenGL version must be at least 2.0 to support modifying
		 * GL_POINT_SPRITE_COORD_ORIGIN.
		 */
Paul Berry's avatar
Paul Berry committed
98
		if (piglit_get_gl_version() >= 20)
99 100 101 102 103 104 105 106 107 108 109 110 111 112
			glPointParameteri(GL_POINT_SPRITE_COORD_ORIGIN,
					  origins[i]);

		for (j = 0; j < TEST_COLS; j++) {
			const float x = 1 + (BOX_SIZE / 2) 
				+ (j * (BOX_SIZE + 1));
			const float size = maxSize / (float) (1 << j);

			/* If the point size is too small, there won't be
			 * enough pixels drawn for the tests (below).
			 */
			if (size < 2.0)
				continue;

113
			glPointSize(size - 0.2);
114
			glBegin(GL_POINTS);
115
			glTexCoord2f(1.5, 1.5);
116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139
			glVertex2f(x, y);
			glEnd();

			if (!piglit_probe_pixel_rgb(x - (size / 4),
						    y + (size / 4),
						    upper_left)
			    || !piglit_probe_pixel_rgb(x - (size / 4),
						       y - (size / 4),
						       lower_left)
			    || !piglit_probe_pixel_rgb(x + (size / 4),
						       y + (size / 4),
						       lower_left)
			    || !piglit_probe_pixel_rgb(x + (size / 4),
						       y - (size / 4),
						       upper_left)) {
				if (!piglit_automatic)
					printf("  size = %.3f, "
					       "origin = %s left\n",
					       size,
					       (origins[i] == GL_UPPER_LEFT)
					       ? "upper" : "lower");
				pass = GL_FALSE;
			}
		}
Ben Holmes's avatar
Ben Holmes committed
140 141 142
	}

	glutSwapBuffers();
143

144
	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
Ben Holmes's avatar
Ben Holmes committed
145
}