Initial piglit test for image from texture extension. This patch-set currently
tests KHR_gl_texture_2D_image functionality. I plan to incrementally
add tests for cubemaps and 3D textures at some point. The test basically
makes sure that we create correct multiple EGL targets from a source texture.

Comments are suggestions welcome!

Signed-off-by: Abdiel Janulgue <abdiel.janul...@linux.intel.com>
---
 tests/spec/CMakeLists.txt                          |    1 +
 .../spec/khr_gl_texture_image/CMakeLists.gles2.txt |   17 ++
 tests/spec/khr_gl_texture_image/CMakeLists.txt     |    1 +
 .../khr_gl_texture_image/khr_gl_texture_image.c    |  205 ++++++++++++++++++++
 4 files changed, 224 insertions(+)
 create mode 100644 tests/spec/khr_gl_texture_image/CMakeLists.gles2.txt
 create mode 100644 tests/spec/khr_gl_texture_image/CMakeLists.txt
 create mode 100644 tests/spec/khr_gl_texture_image/khr_gl_texture_image.c

diff --git a/tests/spec/CMakeLists.txt b/tests/spec/CMakeLists.txt
index 46a91bd..0168d00 100644
--- a/tests/spec/CMakeLists.txt
+++ b/tests/spec/CMakeLists.txt
@@ -62,3 +62,4 @@ add_subdirectory (arb_draw_buffers)
 add_subdirectory (oes_draw_texture)
 add_subdirectory (arb_blend_func_extended)
 add_subdirectory (ext_unpack_subimage)
+add_subdirectory (khr_gl_texture_image)
diff --git a/tests/spec/khr_gl_texture_image/CMakeLists.gles2.txt 
b/tests/spec/khr_gl_texture_image/CMakeLists.gles2.txt
new file mode 100644
index 0000000..d1887a1
--- /dev/null
+++ b/tests/spec/khr_gl_texture_image/CMakeLists.gles2.txt
@@ -0,0 +1,17 @@
+#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_texture_image_gles2
+       khr_gl_texture_image.c
+       )
+
+# vim: ft=cmake:
diff --git a/tests/spec/khr_gl_texture_image/CMakeLists.txt 
b/tests/spec/khr_gl_texture_image/CMakeLists.txt
new file mode 100644
index 0000000..144a306
--- /dev/null
+++ b/tests/spec/khr_gl_texture_image/CMakeLists.txt
@@ -0,0 +1 @@
+piglit_include_target_api()
diff --git a/tests/spec/khr_gl_texture_image/khr_gl_texture_image.c 
b/tests/spec/khr_gl_texture_image/khr_gl_texture_image.c
new file mode 100644
index 0000000..9250a81
--- /dev/null
+++ b/tests/spec/khr_gl_texture_image/khr_gl_texture_image.c
@@ -0,0 +1,205 @@
+
+#define EGL_EGLEXT_PROTOTYPES 1
+#define GL_GLEXT_PROTOTYPES 1
+
+#include "piglit-util-gl-common.h"
+#include "piglit-util-egl.h"
+
+#include <EGL/eglext.h>
+
+#define WIDTH  512
+#define HEIGHT 512
+
+PIGLIT_GL_TEST_CONFIG_BEGIN
+
+       config.supports_gl_es_version = 20;
+
+       config.window_width = WIDTH;
+       config.window_height = HEIGHT;
+       config.window_visual = PIGLIT_GL_VISUAL_RGB | PIGLIT_GL_VISUAL_DOUBLE;
+
+PIGLIT_GL_TEST_CONFIG_END
+
+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[] =
+       "uniform sampler2D tex;\n"
+       "varying vec2 tex_coord;\n"
+       "void main () {\n"
+       "gl_FragColor = texture2D(tex, tex_coord);\n"
+       "}\n";
+
+static GLuint
+make_shader(GLenum type,
+           const char *source)
+{
+       GLuint shader;
+       GLint length = strlen (source);
+       GLint status;
+
+       shader = glCreateShader(type);
+       glShaderSource(shader, 1, &source, &length);
+       glCompileShader(shader);
+       glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
+
+       if (!status)
+               fprintf(stderr, "Shader compilation failed\n");
+
+       return shader;
+}
+
+static void
+make_program(const char *vertex_source,
+            const char *fragment_source)
+{
+       GLuint program, shader;
+       GLuint uniform;
+       GLint status;
+       GLchar glerr[256] = "";
+       int len;
+
+       program = glCreateProgram();
+       shader = make_shader(GL_VERTEX_SHADER, vertex_source);
+       glAttachShader(program, shader);
+       shader = make_shader(GL_FRAGMENT_SHADER, fragment_source);
+       glAttachShader(program, shader);
+
+       glBindAttribLocation(program, PIGLIT_ATTRIB_POS, "pos_attrib");
+       glBindAttribLocation(program, PIGLIT_ATTRIB_TEX, "tex_attrib");
+
+       glLinkProgram(program);
+
+       glGetProgramiv(program, GL_LINK_STATUS, &status);
+       if (!status) {
+           glGetProgramInfoLog(program, 255, &len, glerr);
+           fprintf(stderr, "Program linking failed, len: %d, error: %s\n",
+                   len, glerr);
+       }
+       
+       uniform = glGetUniformLocation(program, "tex");
+       glUseProgram(program);
+       glUniform1i(uniform, 0);
+}
+
+GLuint 
+create_egl_image_target(GLuint texture, GLuint level)
+{
+    GLuint target_texture;
+    EGLint attribs[] = {
+       EGL_GL_TEXTURE_LEVEL_KHR, level,
+       EGL_IMAGE_PRESERVED_KHR, EGL_TRUE,
+       EGL_NONE };
+
+    EGLDisplay dpy = eglGetCurrentDisplay();
+    EGLContext ctx = eglGetCurrentContext();
+    EGLImageKHR image = eglCreateImageKHR(dpy, ctx, EGL_GL_TEXTURE_2D_KHR,
+                                         (EGLClientBuffer)(uintptr_t)texture,
+                                         attribs);
+    if (image == EGL_NO_IMAGE_KHR) {
+       printf("Warning EGL_NO_IMAGE_KHR  0x%x\n",
+              eglGetError());
+    }
+    
+    glGenTextures(1, &target_texture);
+    glBindTexture(GL_TEXTURE_2D, target_texture);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, 
+                   GL_LINEAR);
+    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, 
+                   GL_LINEAR);
+    glEGLImageTargetTexture2DOES(GL_TEXTURE_2D, image);
+
+    return target_texture;
+}
+
+int miplevel_rendered_correctly(int level)
+{
+    static float blue[]    = {0.0,  0.0,  1.0};
+    /* approximate 5th mip level minification  */
+    static float interp[]  = {0.23, 0.19, 0.94};
+    /* smallest mip level interpolates to a single gray pixel */
+    static float gray[]    = {0.5,  0.5,  0.5};
+    
+    switch(level) {
+    case 6:
+       return piglit_probe_pixel_rgb(WIDTH  - (WIDTH  * 0.25), 
+                                     HEIGHT - (HEIGHT * 0.25), gray);
+    case 5:
+       return piglit_probe_pixel_rgb(WIDTH  - (WIDTH  * 0.35), 
+                                     HEIGHT - (HEIGHT * 0.60), interp);
+    case 3:
+       return piglit_probe_pixel_rgb(WIDTH  - (WIDTH  * 0.95), 
+                                     HEIGHT - (HEIGHT * 0.60), blue);
+    }
+    
+    return 0;
+}
+
+enum piglit_result
+piglit_display(void)
+{
+    EGLDisplay dpy = eglGetCurrentDisplay();
+    EGLSurface draw = eglGetCurrentSurface(EGL_DRAW);
+    GLboolean pass = GL_TRUE;
+    GLuint texture;
+    
+    glClearColor(0,0, 0, 0);
+    glClear(GL_COLOR_BUFFER_BIT);
+    
+    /* Set up a source texture object with mipmap generation */
+    texture = piglit_rgbw_texture(GL_RGBA, 120, 120, GL_FALSE, GL_FALSE, 0);
+    glGenerateMipmap(GL_TEXTURE_2D);
+   
+    glActiveTexture(GL_TEXTURE0);
+    glBindTexture(GL_TEXTURE_2D, texture);
+    
+    make_program(vertex_shader, fragment_shader);
+    piglit_draw_rect_tex(-1, 0, 1.0, 1.0,  0, 0, 1, 1);
+
+    if (!piglit_check_gl_error(GL_NO_ERROR))
+           pass = GL_FALSE;
+
+    /* Generate EGLImage target textures for some levels */
+    glBindTexture(GL_TEXTURE_2D, create_egl_image_target(texture, 3));
+    piglit_draw_rect_tex(-1, -1, 1.0, 1.0,  0, 0, 1, 1);
+    
+    glBindTexture(GL_TEXTURE_2D, create_egl_image_target(texture, 5));
+    piglit_draw_rect_tex(0, -1, 1.0, 1.0,  0, 0, 1, 1);
+
+    glBindTexture(GL_TEXTURE_2D, create_egl_image_target(texture, 6));
+    piglit_draw_rect_tex(0, 0, 1.0, 1.0,  0, 0, 1, 1);
+
+    if (!piglit_check_gl_error(GL_NO_ERROR))
+           pass = GL_FALSE;
+
+    eglSwapBuffers(dpy, draw); 
+           
+    /* Check for correctness */
+    if (miplevel_rendered_correctly(6) &&
+       miplevel_rendered_correctly(5) &&
+       miplevel_rendered_correctly(3))
+       pass &= GL_TRUE;
+
+    return pass ? PIGLIT_PASS : PIGLIT_FAIL;
+}
+
+void
+piglit_init(int argc, char **argv)
+{
+    const char *s;
+
+    EGLDisplay dpy = eglGetCurrentDisplay();
+    s = (const char *) eglQueryString(dpy, EGL_EXTENSIONS);
+    if (!piglit_is_extension_in_string(s, "EGL_KHR_gl_texture_2D_image")) {
+       piglit_report_result(PIGLIT_SKIP);
+       exit(1);
+    }
+}
-- 
1.7.9.5

_______________________________________________
Piglit mailing list
Piglit@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to