[Piglit] [PATCH 2/2] Test for KHR_gl_renderbuffer_image

Christopher James Halse Rogers christopher.halse.rogers at canonical.com
Mon Dec 16 00:09:34 PST 2013


On Wed, 2013-11-27 at 13:58 +0200, Ander Conselvan de Oliveira wrote:
> From: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>
> 
> Test creating an EGL image from a renderbuffer with a few different
> formats.
> 
> Signed-off-by: Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>
> ---
>  tests/all.tests                                    |    3 +
>  tests/spec/CMakeLists.txt                          |    1 +
>  .../khr_gl_renderbuffer_image/CMakeLists.gles2.txt |   18 ++
>  .../spec/khr_gl_renderbuffer_image/CMakeLists.txt  |    1 +
>  .../khr_gl_renderbuffer_image.c                    |  194 ++++++++++++++++++++
>  5 files changed, 217 insertions(+)
>  create mode 100644 tests/spec/khr_gl_renderbuffer_image/CMakeLists.gles2.txt
>  create mode 100644 tests/spec/khr_gl_renderbuffer_image/CMakeLists.txt
>  create mode 100644 tests/spec/khr_gl_renderbuffer_image/khr_gl_renderbuffer_image.c
> 
> diff --git a/tests/all.tests b/tests/all.tests
> index 5b0c9e8..30c4a28 100644
> --- a/tests/all.tests
> +++ b/tests/all.tests
> @@ -3268,6 +3268,9 @@ egl_khr_gl_image = Group()
>  spec['EGL_KHR_gl_image'] = egl_khr_gl_image
>  egl_khr_gl_image['EGL_KHR_gl_texture_2D_image'] = plain_test('khr_gl_texture_image_gles2 -2d')
>  egl_khr_gl_image['EGL_KHR_gl_texture_cubemap_image'] = plain_test('khr_gl_texture_image_gles2 -cubemap')
> +egl_khr_gl_image['EGL_KHR_gl_renderbuffer_image_rgba8'] = plain_test('khr_gl_renderbuffer_image_gles2 -rgba8')
> +egl_khr_gl_image['EGL_KHR_gl_renderbuffer_image_rgba4'] = plain_test('khr_gl_renderbuffer_image_gles2 -rgba4')
> +egl_khr_gl_image['EGL_KHR_gl_renderbuffer_image_rgb8'] = plain_test('khr_gl_renderbuffer_image_gles2 -rgb8')
>  
>  gles30 = Group()
>  spec['!OpenGL ES 3.0'] = gles30
> diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt
> index 2874314..3aee008 100644
> --- a/tests/spec/CMakeLists.txt
> +++ b/tests/spec/CMakeLists.txt
> @@ -89,3 +89,4 @@ add_subdirectory (arb_blend_func_extended)
>  add_subdirectory (ext_unpack_subimage)
>  add_subdirectory (arb_vertex_array_object)
>  add_subdirectory (khr_gl_texture_image)
> +add_subdirectory (khr_gl_renderbuffer_image)
> diff --git a/tests/spec/khr_gl_renderbuffer_image/CMakeLists.gles2.txt b/tests/spec/khr_gl_renderbuffer_image/CMakeLists.gles2.txt
> new file mode 100644
> index 0000000..3909871
> --- /dev/null
> +++ b/tests/spec/khr_gl_renderbuffer_image/CMakeLists.gles2.txt
> @@ -0,0 +1,18 @@
> +#add_definitions(-DSOURCE_DIR="${piglit_SOURCE_DIR}/")
> +
> +include_directories(
> +       ${OPENGL_INCLUDE_PATH}
> +       )
> +
> +link_libraries(
> +       ${OPENGL_gles2_LIBRARY}
> +       ${OPENGL_egl_LIBRARY}
> +       piglitutil_gles2
> +       )
> +
> +piglit_add_executable(khr_gl_renderbuffer_image_gles2
> +       khr_gl_renderbuffer_image.c
> +       )
> +
> +# vim: ft=cmake:
> +
> diff --git a/tests/spec/khr_gl_renderbuffer_image/CMakeLists.txt b/tests/spec/khr_gl_renderbuffer_image/CMakeLists.txt
> new file mode 100644
> index 0000000..144a306
> --- /dev/null
> +++ b/tests/spec/khr_gl_renderbuffer_image/CMakeLists.txt
> @@ -0,0 +1 @@
> +piglit_include_target_api()
> diff --git a/tests/spec/khr_gl_renderbuffer_image/khr_gl_renderbuffer_image.c b/tests/spec/khr_gl_renderbuffer_image/khr_gl_renderbuffer_image.c
> new file mode 100644
> index 0000000..9256c9d
> --- /dev/null
> +++ b/tests/spec/khr_gl_renderbuffer_image/khr_gl_renderbuffer_image.c
> @@ -0,0 +1,194 @@
> +/*
> + * Copyright © 2012-2013 Intel Corporation
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a
> + * copy of this software and associated documentation files (the "Software"),
> + * to deal in the Software without restriction, including without limitation
> + * the rights to use, copy, modify, merge, publish, distribute, sublicense,
> + * and/or sell copies of the Software, and to permit persons to whom the
> + * Software is furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice (including the next
> + * paragraph) shall be included in all copies or substantial portions of the
> + * Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
> + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
> + * IN THE SOFTWARE.
> + *
> + * Authors:
> + *    Ander Conselvan de Oliveira <ander.conselvan.de.oliveira at intel.com>
> + *
> + */
> +
> +#define EGL_EGLEXT_PROTOTYPES 1

This is also defined in piglit-util-egl.h; you should either drop the
define here or fix piglit-util-egl.h to conditionally define it.

> +#define GL_GLEXT_PROTOTYPES 1
> +#include "piglit-util-gl-common.h"
> +#include "piglit-util-egl.h"
> +
> +#include <EGL/eglext.h>
> +
> +PIGLIT_GL_TEST_CONFIG_BEGIN
> +
> +	config.supports_gl_es_version = 20;
> +
> +	config.window_width = 256;
> +	config.window_height = 256;
> +	config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
> +
> +PIGLIT_GL_TEST_CONFIG_END
> +
> +static GLfloat green[4] = {
> +	0.0, 1.0, 0.0, 1.0
> +};
> +
> +static GLenum test_format = GL_RGBA8;
> +
> +static const char
> +vertex_shader[] =
> +	"attribute vec4 pos_attrib;\n"
> +	"attribute vec2 tex_attrib;\n"
> +	"varying vec2 tex_coord;\n"
> +	"void main () {\n"
> +	"gl_Position = pos_attrib;\n"
> +	"tex_coord = tex_attrib;\n"
> +	"}\n";
> +
> +static const char
> +fragment_shader[] =
> +	"precision mediump float;\n"
> +	"uniform sampler2D tex;\n"
> +	"varying vec2 tex_coord;\n"
> +	"void main () {\n"
> +	"gl_FragColor = texture2D(tex, tex_coord);\n"
> +	"}\n";
> +
> +static void
> +make_program(const char *vertex_source,
> +	     const char *fragment_source)
> +{
> +	GLuint program, shader;
> +	GLuint uniform;
> +
> +	program = glCreateProgram();
> +	shader = piglit_compile_shader_text(GL_VERTEX_SHADER, vertex_source);
> +	glAttachShader(program, shader);
> +	shader = piglit_compile_shader_text(GL_FRAGMENT_SHADER, fragment_source);
> +	glAttachShader(program, shader);
> +
> +	glBindAttribLocation(program, PIGLIT_ATTRIB_POS, "pos_attrib");
> +	glBindAttribLocation(program, PIGLIT_ATTRIB_TEX, "tex_attrib");
> +
> +	glLinkProgram(program);
> +	if (!piglit_link_check_status(program))
> +		piglit_report_result(PIGLIT_FAIL);
> +
> +	uniform = glGetUniformLocation(program, "tex");
> +	glUseProgram(program);
> +	glUniform1i(uniform, 0);
> +}
> +
> +static GLuint
> +create_egl_image_target(GLuint renderbuffer)
> +{
> +	GLuint target_texture;
> +
> +	EGLDisplay dpy = eglGetCurrentDisplay();
> +	EGLContext ctx = eglGetCurrentContext();
> +	EGLImageKHR image;
> +
> +	image = eglCreateImageKHR(dpy, ctx, EGL_GL_RENDERBUFFER_KHR,
> +				  (EGLClientBuffer) (uintptr_t) renderbuffer,
> +				  NULL);

Hasn't this just caused the renderbuffer's content to become undefined
(you haven't set EGL_IMAGE_PRESERVED_KHR)? It appears to pass on i965,
but as I read the spec this is purely accidental.

> +	if (image == EGL_NO_IMAGE_KHR)
> +		return 0;
> +
> +	glGenTextures(1, &target_texture);
> +	glBindTexture(GL_TEXTURE_2D, target_texture);
> +	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
> +			GL_NEAREST);
> +	glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
> +			GL_NEAREST);
> +	glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
> +
> +	return target_texture;
> +}
> +
> +enum piglit_result
> +piglit_display(void)
> +{
> +	bool pass = true;
> +
> +	GLenum status;
> +	GLuint fb, rb;
> +	GLuint tex;
> +
> +	/* Clear the window to red */
> +	glClearColor(1.0, 0.0, 0.0, 1.0);
> +	glClear(GL_COLOR_BUFFER_BIT);
> +
> +	glGenFramebuffers(1, &fb);
> +	glGenRenderbuffers(1, &rb);
> +
> +	glBindFramebuffer(GL_FRAMEBUFFER, fb);
> +	glBindRenderbuffer(GL_RENDERBUFFER, rb);
> +	glRenderbufferStorage(GL_RENDERBUFFER, test_format,
> +			      piglit_width, piglit_height);
> +
> +	glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0,
> +				  GL_RENDERBUFFER, rb);
> +
> +	status = glCheckFramebufferStatus(GL_FRAMEBUFFER);
> +	if (status != GL_FRAMEBUFFER_COMPLETE)
> +		pass = false;
> +
> +	/* Clear the renderbuffer to green */
> +	glClearColor(0.0, 1.0, 0.0, 1.0);
> +	glClear(GL_COLOR_BUFFER_BIT);
> +
> +	glBindFramebuffer(GL_FRAMEBUFFER, 0);
> +
> +	glActiveTexture(GL_TEXTURE0);
> +	make_program(vertex_shader, fragment_shader);
> +	if (!piglit_check_gl_error(GL_NO_ERROR))
> +		pass = false;
> +
> +	tex = create_egl_image_target(rb);
> +	if (tex == 0) {
> +		pass = false;
> +	} else {
> +		glBindTexture(GL_TEXTURE_2D, tex);
> +		piglit_draw_rect_tex(-1, -1, 2, 2, 0, 0, 1, 1);
> +	}
> +
> +	if (!piglit_check_gl_error(GL_NO_ERROR))
> +		pass = false;
> +	piglit_present_results();
> +
> +	glBindFramebuffer(GL_FRAMEBUFFER, 0);
> +	pass = pass && piglit_probe_rect_rgba(0, 0, piglit_width, piglit_height, green);
> +
> +	return pass ? PIGLIT_PASS : PIGLIT_FAIL;
> +}
> +
> +void
> +piglit_init(int argc, char **argv)
> +{
> +	EGLDisplay dpy = eglGetCurrentDisplay();
> +	int i;
> +
> +	if (!piglit_is_egl_extension_supported(dpy, "EGL_KHR_gl_renderbuffer_image"))
> +		piglit_report_result(PIGLIT_SKIP);
> +
> +	for (i = 1; i < argc; i++)
> +		if (strcmp(argv[i], "-rgba4") == 0)
> +			test_format = GL_RGBA4;
> +		else if (strcmp(argv[i], "-rbga8") == 0)
> +			test_format = GL_RGBA8;
> +		else if (strcmp(argv[i], "-rbg8") == 0)
> +			test_format = GL_RGB8;
> +}





More information about the Piglit mailing list