/* Page 76 */ static bool test_beginquery() { bool pass; glBeginQuery(GL_SAMPLES_PASSED, 300); pass = piglit_check_gl_error(GL_INVALID_OPERATION); glEndQuery(GL_SAMPLES_PASSED); piglit_reset_gl_error(); return pass; }
enum piglit_result piglit_display(void) { GLuint tex; static const float red[] = { 1, 0, 0, 1 }; static const float green[] = { 0, 1, 0, 1 }; static const float blue[] = { 0, 0, 1, 1 }; static const float cyan[] = { 0, 1, 1, 1 }; pass = GL_TRUE; extension_supported = piglit_is_extension_supported("GL_EXT_unpack_subimage"); if (!piglit_automatic) { if (extension_supported) printf("GL_EXT_unpack_subimage is supported\n"); else printf("GL_EXT_unpack_subimage is not supported\n"); } piglit_reset_gl_error(); if (!piglit_automatic) printf("Trying GL_UNPACK_ROW_LENGTH\n"); glPixelStorei(GL_UNPACK_ROW_LENGTH, 2); check_error(); piglit_reset_gl_error(); if (!piglit_automatic) printf("Trying GL_UNPACK_SKIP_PIXELS\n"); glPixelStorei(GL_UNPACK_SKIP_PIXELS, 1); check_error(); piglit_reset_gl_error(); if (!piglit_automatic) printf("Trying GL_UNPACK_SKIP_ROWS\n"); glPixelStorei(GL_UNPACK_SKIP_ROWS, 4); check_error(); glClear(GL_COLOR_BUFFER_BIT); /* Try creating a texture with the unpacking parameters we've set */ glGenTextures(1, &tex); glBindTexture(GL_TEXTURE_2D, tex); glTexImage2D(GL_TEXTURE_2D, 0, /* level */ GL_RGBA, /* internalFormat */ 1, /* width */ 2, /* height */ 0, /* border */ GL_RGBA, /* format */ GL_UNSIGNED_BYTE, /* type */ tex_data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); make_program(vertex_shader, fragment_shader); piglit_draw_rect_tex(-1, -1, 2, 2, 0, 0, 1, 1); if (extension_supported) { pass &= piglit_probe_pixel_rgba(piglit_width / 2, piglit_height / 4, blue); pass &= piglit_probe_pixel_rgba(piglit_width / 2, piglit_height * 3 / 4, cyan); } else { pass &= piglit_probe_pixel_rgba(piglit_width / 2, piglit_height / 4, red); pass &= piglit_probe_pixel_rgba(piglit_width / 2, piglit_height * 3 / 4, green); } return pass ? PIGLIT_PASS : PIGLIT_FAIL; }
void piglit_init(int argc, char **argv) { unsigned glsl_version; GLuint vs_prog_3_out; GLuint vs_prog_1_out; GLuint fs_prog_3_in; GLuint fs_prog_1_in; GLuint vs_fs_prog_separate_inactive; char *vs_source; char *fs_source; GLint max_varying; bool pass = true; piglit_require_vertex_shader(); piglit_require_fragment_shader(); piglit_require_GLSL_version(130); /* Support layout index on output color */ piglit_require_extension("GL_ARB_separate_shader_objects"); piglit_require_extension("GL_ARB_explicit_attrib_location"); piglit_require_extension("GL_ARB_blend_func_extended"); glsl_version = pick_a_glsl_version(); glGetIntegerv(GL_MAX_VARYING_COMPONENTS, &max_varying); max_varying = (max_varying / 4u) - 1u; /* * Program compilation and link */ printf("Compile vs_prog_3_out\n"); vs_prog_3_out = format_and_link_program(GL_VERTEX_SHADER, vs_code_3_out_template, glsl_version); printf("Compile vs_prog_1_out\n"); vs_prog_1_out = format_and_link_program(GL_VERTEX_SHADER, vs_code_1_out_template, glsl_version); printf("Compile fs_prog_3_in\n"); fs_prog_3_in = format_and_link_program(GL_FRAGMENT_SHADER, fs_code_3_in_template, glsl_version); printf("Compile fs_prog_1_in\n"); fs_prog_1_in = format_and_link_program(GL_FRAGMENT_SHADER, fs_code_1_in_template, glsl_version); (void)!asprintf(&vs_source, vs_code_inactive_template, glsl_version, max_varying); (void)!asprintf(&fs_source, fs_code_inactive_template, glsl_version, max_varying); pass &= piglit_check_gl_error(0); printf("Compile vs_fs_prog_separate_inactive\n"); vs_fs_prog_separate_inactive = piglit_build_simple_program_unlinked(vs_source, fs_source); /* Manual linking so we can pack 2 separate-aware shaders into a single program */ glProgramParameteri(vs_fs_prog_separate_inactive, GL_PROGRAM_SEPARABLE, GL_TRUE); glLinkProgram(vs_fs_prog_separate_inactive); if (!piglit_link_check_status(vs_fs_prog_separate_inactive)) { piglit_report_subtest_result(PIGLIT_SKIP, "Unactive varying optimization in multi-shade separated program"); vs_fs_prog_separate_inactive = 0; // Skip program piglit_reset_gl_error(); // Clear pending error } free(vs_source); free(fs_source); /* * Pipeline creation */ glGenProgramPipelines(1, &pipeline_3_out_1_in); glGenProgramPipelines(1, &pipeline_1_out_3_in); glBindProgramPipeline(pipeline_3_out_1_in); glUseProgramStages(pipeline_3_out_1_in, GL_VERTEX_SHADER_BIT, vs_prog_3_out); glUseProgramStages(pipeline_3_out_1_in, GL_FRAGMENT_SHADER_BIT, fs_prog_1_in); glBindProgramPipeline(pipeline_1_out_3_in); glUseProgramStages(pipeline_1_out_3_in, GL_VERTEX_SHADER_BIT, vs_prog_1_out); glUseProgramStages(pipeline_1_out_3_in, GL_FRAGMENT_SHADER_BIT, fs_prog_3_in); if (vs_fs_prog_separate_inactive) { glGenProgramPipelines(1, &pipeline_inactive); glBindProgramPipeline(pipeline_inactive); glUseProgramStages(pipeline_inactive, GL_VERTEX_SHADER_BIT | GL_FRAGMENT_SHADER_BIT, vs_fs_prog_separate_inactive); } else { pipeline_inactive = 0; // Skip the test } if (!piglit_check_gl_error(0) || !pass) piglit_report_result(PIGLIT_FAIL); }