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;
}
예제 #2
0
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;
}
예제 #3
0
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;
	}
}