static GLboolean run_test(const TestCase &test) { describe(test); GLboolean pass; GLuint tex; GLuint fbo; GLenum status; glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); #if CHECKERBOARD const float color1[4] = {1.0f, 0.0f, 0.0f, 1.0f}; const float color2[4] = {0.0f, 1.0f, 0.0f, 1.0f}; tex = piglit_checkerboard_texture(0, 0, test.srcW, test.srcH, 1, 1, color1, color2); #else tex = piglit_rgbw_texture(GL_RGBA, test.srcW, test.srcH, GL_FALSE, GL_TRUE, GL_UNSIGNED_NORMALIZED); #endif glBindTexture(GL_TEXTURE_2D, tex); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, tex, 0); assert(glGetError() == 0); status = glCheckFramebufferStatus(GL_FRAMEBUFFER); if (status != GL_FRAMEBUFFER_COMPLETE) { pass = GL_TRUE; } else { glViewport(0, 0, piglit_width, piglit_height); piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE); glBindFramebuffer(GL_READ_FRAMEBUFFER, fbo); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, piglit_winsys_fbo); blit(test); pass = verify(test, fbo, 0, 3); if (!piglit_automatic) { piglit_present_results(); if (!pass) { //getchar(); } } } glBindFramebuffer(GL_FRAMEBUFFER, piglit_winsys_fbo); glDeleteFramebuffers(1, &fbo); glDeleteTextures(1, &tex); return pass; }
enum piglit_result piglit_display(void) { float black[4] = {0.0, 0.0, 0.0, 0.0}; float white[4] = {1.0, 1.0, 1.0, 0.0}; float red[4] = {1.0, 0.0, 0.0, 0.0}; float green[4] = {0.0, 1.0, 0.0, 0.0}; float blue[4] = {0.0, 0.0, 1.0, 0.0}; GLboolean pass = GL_TRUE; GLuint tex; tex = piglit_checkerboard_texture(0, /* name */ 0, /* level */ 2, 2, /* width/height */ 1, 1, /* checkerboard size */ black, white); glEnable(GL_TEXTURE_2D); glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE); glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, red); piglit_draw_rect_tex(-1, -1, 1, 1, -2, -2, 0, 0); glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, green); piglit_draw_rect_tex( 0, -1, 1, 1, -2, -2, 0, 0); glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, blue); piglit_draw_rect_tex(-1, 0, 1, 1, -2, -2, 0, 0); glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, white); piglit_draw_rect_tex( 0, 0, 1, 1, -2, -2, 0, 0); pass = piglit_probe_pixel_rgb(piglit_width * 1 / 4, piglit_height * 1 / 4, red) && pass; pass = piglit_probe_pixel_rgb(piglit_width * 3 / 4, piglit_height * 1 / 4, green) && pass; pass = piglit_probe_pixel_rgb(piglit_width * 1 / 4, piglit_height * 3 / 4, blue) && pass; pass = piglit_probe_pixel_rgb(piglit_width * 3 / 4, piglit_height * 3 / 4, white) && pass; glDeleteTextures(1, &tex); glutSwapBuffers(); return pass ? PIGLIT_PASS : PIGLIT_FAIL; }
void piglit_init(int argc, char **argv) { piglit_require_gl_version(20); prog = glCreateProgram(); glLinkProgram(prog); if (!piglit_link_check_status(prog)) piglit_report_result(PIGLIT_FAIL); glUseProgram(prog); if (!piglit_check_gl_error(GL_NO_ERROR)) piglit_report_result(PIGLIT_FAIL); glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glEnable(GL_TEXTURE_2D); piglit_checkerboard_texture(tex, 0, 16, 16, 2, 2, black, white); piglit_ortho_projection(piglit_width, piglit_height, GL_FALSE); }