enum piglit_result piglit_display(void) { bool pass = true; glClear(GL_COLOR_BUFFER_BIT); for (int i = 0; true; ++i) { glUniform1i(render_pass_loc, i); if (i%2) piglit_draw_rect(0, -1, 1, 2); else piglit_draw_rect(-1, -1, 1, 2); if (i >= 5) break; glTextureBarrier(); } unsigned color = 1; color *= 2; color += 2; color ^= 1023; color <<= 2; const unsigned expected_left[] = { color, 0, 0, 1 }; color %= 32; const unsigned expected_right[] = { color, 0, 0, 1 }; pass = piglit_probe_rect_rgba_uint(0, 0, width / 2, height, expected_left) && pass; pass = piglit_probe_rect_rgba_uint(width / 2, 0, width / 2, height, expected_right) && pass; pass = piglit_check_gl_error(GL_NO_ERROR) && pass; return pass ? PIGLIT_PASS : PIGLIT_FAIL; }
static bool run_test_fragment(void) { const char *fs_source = "#version 140\n" "#extension GL_ARB_shader_atomic_counters : enable\n" "\n" "out ivec4 fcolor;\n" "uniform int index;\n" "layout(binding = 0, offset = 4) uniform atomic_uint x[3];\n" "\n" "void main() {\n" " fcolor.x = int(atomicCounterIncrement(x[1 + index]));\n" " fcolor.y = int(atomicCounterIncrement(x[0 + index]));\n" " fcolor.z = int(atomicCounterIncrement(x[1 + index]));\n" " fcolor.w = int(atomicCounterIncrement(x[0 + index]));\n" "}\n"; const char *vs_source = "#version 140\n" "#extension GL_ARB_shader_atomic_counters : enable\n" "\n" "in vec4 position;\n" "\n" "void main() {\n" " gl_Position = position;\n" "}\n"; const uint32_t start[] = { 1, 2, 4, 8 }; const unsigned int expected[] = { 8, 4, 9, 5 }; GLuint prog = glCreateProgram(); bool ret = atomic_counters_compile(prog, GL_FRAGMENT_SHADER, fs_source) && atomic_counters_compile(prog, GL_VERTEX_SHADER, vs_source) && set_uniform_int(prog, "index", 1) && atomic_counters_draw_point(prog, sizeof(start), start) && piglit_probe_rect_rgba_uint(0, 0, 1, 1, expected); glDeleteProgram(prog); return ret; }
static enum piglit_result test_format(const struct format_info *info) { const GLenum type = get_datatype(info); GLenum status; uint32_t expected_color[4]; printf("%s:\n", info->name); /* Create texture */ glTexImage2D(GL_TEXTURE_2D, 0, info->internal_format, 1, 1, 0, info->base_format, type, NULL); glFramebufferTexture2D(GL_FRAMEBUFFER_EXT, GL_COLOR_ATTACHMENT0_EXT, GL_TEXTURE_2D, tex, 0); status = glCheckFramebufferStatus(GL_FRAMEBUFFER_EXT); if (status != GL_FRAMEBUFFER_COMPLETE_EXT) { printf(" framebuffer incomplete.\n"); return PIGLIT_SKIP; } piglit_draw_rect(-1, -1, 2, 2); memcpy(expected_color, color, sizeof(color)); switch (info->base_format) { case GL_RGBA_INTEGER: case GL_BGRA_INTEGER: break; case GL_RGB_INTEGER: expected_color[3] = 1; break; case GL_LUMINANCE_INTEGER_EXT: expected_color[1] = expected_color[0]; expected_color[2] = expected_color[0]; expected_color[3] = 1; break; case GL_LUMINANCE_ALPHA_INTEGER_EXT: expected_color[1] = expected_color[0]; expected_color[2] = expected_color[0]; break; case GL_RED_INTEGER: if (strstr(info->name, "INTENSITY")) { expected_color[1] = expected_color[0]; expected_color[2] = expected_color[0]; expected_color[3] = expected_color[0]; } else { expected_color[1] = 0; expected_color[2] = 0; expected_color[3] = 1; } break; case GL_RG_INTEGER: expected_color[2] = 0; expected_color[3] = 1; break; case GL_ALPHA_INTEGER_EXT: expected_color[0] = 0; expected_color[1] = 0; expected_color[2] = 0; break; default: abort(); } if (piglit_probe_rect_rgba_uint(0, 0, 1, 1, expected_color)) return PIGLIT_PASS; else { printf(" Input color: %d %d %d %d\n", color[0], color[1], color[2], color[3]); return PIGLIT_FAIL; } }