Exemplo n.º 1
0
void enable_shadow_stencil() {
	assert(have_EXT_stencil_wrap());
	if (have_EXT_stencil_two_side()) {
		glEnable(GL_STENCIL_TEST_TWO_SIDE_EXT);

		glActiveStencilFaceEXT(GL_BACK);
		glStencilFunc(GL_ALWAYS, 1, ~0U);
		glStencilOp(GL_KEEP, GL_KEEP, GL_INCR_WRAP);

		glActiveStencilFaceEXT(GL_FRONT);
		glStencilFunc(GL_ALWAYS, 1, ~0U);
		glStencilOp(GL_KEEP, GL_KEEP, GL_DECR_WRAP);
 	} else if (have_ATI_separate_stencil()) {
		glStencilFuncSeparateATI( GL_ALWAYS, GL_ALWAYS, 1, ~0U );
		glStencilOpSeparateATI( GL_BACK, GL_KEEP, GL_KEEP, GL_INCR_WRAP );
		glStencilOpSeparateATI( GL_FRONT, GL_KEEP, GL_KEEP, GL_DECR_WRAP );
	} else {
		assert(0);
	}

}
Exemplo n.º 2
0
enum piglit_result
piglit_display(void)
{
	GLboolean pass = GL_TRUE;
	GLint max_stencil;
	GLint stencil_bits;
	unsigned i;
	float expected[4] = {0.5, 0.5, 0.5, 0.5};
	int w = piglit_width / (6 * 2 + 1);
	int h = w;
	int start_y = (piglit_height - h) / 2;

	piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE);

	glGetIntegerv(GL_STENCIL_BITS, & stencil_bits);
	max_stencil = (1U << stencil_bits) - 1;
	printf("Stencil bits = %u, maximum stencil value = 0x%08x\n",
		stencil_bits, max_stencil);

	glClearStencil(1);
	glClearColor(0.2, 0.2, 0.8, 0);
	glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT
		 | GL_STENCIL_BUFFER_BIT);

	/* This is the "reference" square. */
	glDisable(GL_STENCIL_TEST);
	glColor3f(0.5, 0.5, 0.5);
	piglit_draw_rect(w * 1, start_y, w, h);

	glEnable(GL_STENCIL_TEST);

	/* Draw the first two squares using incr for the affected face
	 */

	/* 2nd square */
	if (use20syntax) {
		glStencilFuncSeparate(GL_FRONT, GL_ALWAYS, 0, ~0);
		glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 0, ~0);
		glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_INCR);
		glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_DECR);
	}
	else {
		glStencilFuncSeparateATI(GL_ALWAYS, GL_ALWAYS, 0, ~0);
		glStencilOpSeparateATI(GL_FRONT, GL_KEEP, GL_KEEP, GL_INCR);
		glStencilOpSeparateATI(GL_BACK, GL_KEEP, GL_KEEP, GL_DECR);
	}

	glColor3f(0.9, 0.9, 0.9);
	for (i = 0 ; i < (max_stencil + 5) ; i++) {
		/* this should be front facing */
		piglit_draw_rect(w * 3, start_y, w, h);
	}

	/* stencil vals should be equal to max_stencil */
	glStencilFunc(GL_EQUAL, max_stencil, ~0);
	glColor3f(0.5, 0.5, 0.5);
	piglit_draw_rect(w * 3, start_y, w, h);

	/* 3rd square */
	if (use20syntax) {
		glStencilFuncSeparate(GL_FRONT, GL_ALWAYS, 0, ~0);
		glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 0, ~0);
		glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_DECR);
		glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_INCR);
	}
	else {
		glStencilFuncSeparateATI(GL_ALWAYS, GL_ALWAYS, 0, ~0);
		glStencilOpSeparateATI(GL_FRONT, GL_KEEP, GL_KEEP, GL_DECR);
		glStencilOpSeparateATI(GL_BACK, GL_KEEP, GL_KEEP, GL_INCR);
	}

	glColor3f(0.9, 0.9, 0.9);
	for (i = 0 ; i < (max_stencil + 5) ; i++) {
		/* this should be back facing */
		piglit_draw_rect(w * 5, start_y + h, w, -h);
	}

	/* stencil vals should be equal to max_stencil */
	glStencilFunc(GL_EQUAL, max_stencil, ~0);
	glColor3f(0.5, 0.5, 0.5);
	piglit_draw_rect(w * 5, start_y, w, h);

	/* 4th square */
	if (use20syntax) {
		glStencilFuncSeparate(GL_FRONT, GL_NEVER, 0, ~0);
		glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 0, ~0);
		glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_DECR);
		glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_INCR);
	}
	else {
		glStencilFuncSeparateATI(GL_NEVER, GL_ALWAYS, 0, ~0);
		glStencilOpSeparateATI(GL_FRONT, GL_KEEP, GL_KEEP, GL_DECR);
		glStencilOpSeparateATI(GL_BACK, GL_KEEP, GL_KEEP, GL_INCR);
	}

	glColor3f(0.9, 0.9, 0.9);
	for (i = 0 ; i < (max_stencil + 5) ; i++) {
		/* this should be back facing */
		piglit_draw_rect(w * 7, start_y + h, w, -h);
		/* this should be front facing */
		piglit_draw_rect(w * 7, start_y, w, h);
	}

	/* stencil vals should be equal to max_stencil */
	glStencilFunc(GL_EQUAL, max_stencil, ~0);
	glColor3f(0.5, 0.5, 0.5);
	piglit_draw_rect(w * 7, start_y, w, h);

	/* 5th square */
	if (use20syntax) {
		glStencilFuncSeparate(GL_FRONT, GL_ALWAYS, 0, ~0);
		glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 0, ~0);
		glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_INCR);
		glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_DECR);
	}
	else {
		glStencilFuncSeparateATI(GL_ALWAYS, GL_ALWAYS, 0, ~0);
		glStencilOpSeparateATI(GL_FRONT, GL_KEEP, GL_KEEP, GL_INCR);
		glStencilOpSeparateATI(GL_BACK, GL_KEEP, GL_KEEP, GL_DECR);
	}

	glColor3f(0.9, 0.9, 0.9);
	for (i = 0 ; i < (max_stencil + 5) ; i++) {
		/* this should be back facing */
		piglit_draw_rect(w * 9, start_y + h, w, -h);
		/* this should be front facing */
		piglit_draw_rect(w * 9, start_y, w, h);
	}

	glStencilFunc(GL_EQUAL, 1, ~0);
	glColor3f(0.5, 0.5, 0.5);
	piglit_draw_rect(w * 9, start_y, w, h);

	/* 6th square */
	if (piglit_is_extension_supported("GL_EXT_stencil_wrap")) {
		if (use20syntax) {
			glStencilFuncSeparate(GL_FRONT, GL_ALWAYS, 0, ~0);
			glStencilFuncSeparate(GL_BACK, GL_ALWAYS, 0, ~0);
			glStencilOpSeparate(GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP);
			glStencilOpSeparate(GL_BACK, GL_KEEP, GL_KEEP, GL_INCR_WRAP);
		}
		else {
			glStencilFuncSeparateATI(GL_ALWAYS, GL_ALWAYS, 0, ~0);
			glStencilOpSeparateATI(GL_FRONT, GL_KEEP, GL_KEEP, GL_KEEP);
			glStencilOpSeparateATI(GL_BACK, GL_KEEP, GL_KEEP, GL_INCR_WRAP);
		}

		glColor3f(0.9, 0.9, 0.9);
		for (i = 0 ; i < (max_stencil + 5) ; i++) {
			/* this should be back facing */
			piglit_draw_rect(w * 11, start_y + h, w, -h);
			/* this should be front facing */
			piglit_draw_rect(w * 11, start_y, w, h);
		}

		glStencilFunc(GL_EQUAL, 260 - 255, ~0);
		glColor3f(0.5, 0.5, 0.5);
		piglit_draw_rect(w * 11, start_y, w, h);
	}

	pass = piglit_probe_pixel_rgb(w * 1.5, piglit_height / 2, expected);
	pass = piglit_probe_pixel_rgb(w * 3.5, piglit_height / 2, expected);
	pass = piglit_probe_pixel_rgb(w * 5.5, piglit_height / 2, expected);
	pass = piglit_probe_pixel_rgb(w * 7.5, piglit_height / 2, expected);
	pass = piglit_probe_pixel_rgb(w * 9.5, piglit_height / 2, expected);
	pass = piglit_probe_pixel_rgb(w * 11.5, piglit_height / 2, expected);

	glutSwapBuffers();

	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
}