This moves the piglit_framework_fbo code from piglit-framework.c to piglit-framework-fbo.c.
Currently the piglit_framework_fbo code is only implemented for GLX. The next commit adds an implementation atop Waffle. The increase in code size and #ifdef complexity warrants moving it to its own file. Signed-off-by: Chad Versace <[email protected]> --- tests/util/CMakeLists.txt | 1 + tests/util/piglit-framework-fbo.c | 183 +++++++++++++++++++++++++++++++++++++ tests/util/piglit-framework-fbo.h | 29 ++++++ tests/util/piglit-framework.c | 130 +------------------------- 4 files changed, 216 insertions(+), 127 deletions(-) create mode 100644 tests/util/piglit-framework-fbo.c create mode 100644 tests/util/piglit-framework-fbo.h diff --git a/tests/util/CMakeLists.txt b/tests/util/CMakeLists.txt index c7fe8cb..cd8f518 100644 --- a/tests/util/CMakeLists.txt +++ b/tests/util/CMakeLists.txt @@ -17,6 +17,7 @@ set(UTIL_SOURCES piglit-util-enum.c shader-load.c piglit-framework.c + piglit-framework-fbo.c rgb9e5.c ) diff --git a/tests/util/piglit-framework-fbo.c b/tests/util/piglit-framework-fbo.c new file mode 100644 index 0000000..eaf3de6 --- /dev/null +++ b/tests/util/piglit-framework-fbo.c @@ -0,0 +1,183 @@ +/* + * Copyright © 2009 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. + */ + +#if defined(USE_OPENGL_ES1) +# define PIGLIT_FRAMEWORK_FBO_DISABLED +#elif defined(USE_GLX) +# define PIGLIT_FRAMEWORK_FBO_USE_GLX +#else +# define PIGLIT_FRAMEWORK_FBO_DISABLED +#endif + +#include <assert.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +#include "piglit-util.h" +#include "piglit-framework.h" +#include "piglit-framework-fbo.h" + +#ifdef PIGLIT_FRAMEWORK_FBO_USE_GLX +#include "piglit-glx-util.h" +#endif + +bool piglit_use_fbo = false; + +#ifdef PIGLIT_FRAMEWORK_FBO_USE_GLX +Display *piglit_glx_dpy; +Window piglit_glx_window; +XVisualInfo *piglit_glx_visinfo; +GLXContext piglit_glx_context; +#endif + +#ifdef PIGLIT_FRAMEWORK_FBO_USE_GLX +static void +piglit_framework_fbo_glx_init(void) +{ + piglit_glx_dpy = piglit_get_glx_display(); + + /* Unfortunately in GLX we need a drawable to bind our context + * to. Make an unmapped window. + */ + piglit_glx_visinfo = piglit_get_glx_visual(piglit_glx_dpy); + + piglit_glx_context = piglit_get_glx_context(piglit_glx_dpy, + piglit_glx_visinfo); + + piglit_glx_window = piglit_get_glx_window_unmapped(piglit_glx_dpy, + piglit_glx_visinfo); + + glXMakeCurrent(piglit_glx_dpy, piglit_glx_window, piglit_glx_context); +} + +static void +piglit_framework_fbo_glx_destroy(void) +{ + glXMakeCurrent(piglit_glx_dpy, None, None); + glXDestroyContext(piglit_glx_dpy, piglit_glx_context); + XFree(piglit_glx_visinfo); + XCloseDisplay(piglit_glx_dpy); +} +#endif + +static bool +piglit_framework_fbo_init_gl(void) +{ +#ifdef PIGLIT_FRAMEWORK_FBO_DISABLED + return false; +#else + GLuint tex, depth = 0; + GLenum status; + +#ifdef USE_OPENGL + glewInit(); + + if (piglit_get_gl_version() < 20) + return false; +#endif + + glGenFramebuffers(1, &piglit_winsys_fbo); + glBindFramebuffer(GL_FRAMEBUFFER, piglit_winsys_fbo); + + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, + piglit_width, piglit_height, 0, + GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glFramebufferTexture2D(GL_FRAMEBUFFER, + GL_COLOR_ATTACHMENT0, + GL_TEXTURE_2D, + tex, + 0); + + if (piglit_window_mode & (GLUT_DEPTH | GLUT_STENCIL)) { + GLenum depth_stencil; + +#ifdef USE_OPENGL + depth_stencil = GL_DEPTH_STENCIL; +#else + depth_stencil = GL_DEPTH_STENCIL_OES; +#endif + + glGenTextures(1, &depth); + glBindTexture(GL_TEXTURE_2D, depth); + glTexImage2D(GL_TEXTURE_2D, 0, depth_stencil, + piglit_width, piglit_height, 0, + GL_RGBA, GL_UNSIGNED_BYTE, NULL); + glFramebufferTexture2D(GL_FRAMEBUFFER, + GL_DEPTH_ATTACHMENT, + GL_TEXTURE_2D, + depth, + 0); + glFramebufferTexture2D(GL_FRAMEBUFFER, + GL_STENCIL_ATTACHMENT, + GL_TEXTURE_2D, + depth, + 0); + } + + glBindTexture(GL_TEXTURE_2D, 0); + + status = glCheckFramebufferStatus(GL_FRAMEBUFFER); + if (status != GL_FRAMEBUFFER_COMPLETE) { + fprintf(stderr, + "-fbo resulted in incomplete FBO, falling back\n"); + glBindFramebuffer(GL_FRAMEBUFFER, 0); + + glDeleteTextures(1, &depth); + glDeleteTextures(1, &tex); + + piglit_framework_fbo_destroy(); + + return false; + } + + return true; +#endif +} + +void +piglit_framework_fbo_destroy(void) +{ +#ifdef USE_OPENGL + glDeleteFramebuffers(1, &piglit_winsys_fbo); +#endif + + piglit_winsys_fbo = 0; + +#if defined(PIGLIT_FRAMEWORK_FBO_USE_GLX) + piglit_framework_fbo_glx_destroy(); +#endif +} + +bool +piglit_framework_fbo_init(void) +{ +#if defined(PIGLIT_FRAMEWORK_FBO_USE_GLX) + piglit_framework_fbo_glx_init(); +#endif + + return piglit_framework_fbo_init_gl(); +} diff --git a/tests/util/piglit-framework-fbo.h b/tests/util/piglit-framework-fbo.h new file mode 100644 index 0000000..af55472 --- /dev/null +++ b/tests/util/piglit-framework-fbo.h @@ -0,0 +1,29 @@ +/* + * Copyright © 2012 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. + */ + +#include "piglit-util.h" + +extern bool piglit_use_fbo; + +bool piglit_framework_fbo_init(void); +void piglit_framework_fbo_destroy(void); diff --git a/tests/util/piglit-framework.c b/tests/util/piglit-framework.c index dac04b7..e8eea38 100644 --- a/tests/util/piglit-framework.c +++ b/tests/util/piglit-framework.c @@ -34,21 +34,17 @@ #include "piglit-util.h" #include "piglit-framework.h" +#include "piglit-framework-fbo.h" + #ifdef USE_GLX #include "piglit-glx-util.h" #endif int piglit_automatic = 0; -bool piglit_use_fbo = false; unsigned piglit_winsys_fbo = 0; + static int piglit_window; static enum piglit_result result; -#ifdef USE_GLX -Display *piglit_glx_dpy; -Window piglit_glx_window; -XVisualInfo *piglit_glx_visinfo; -GLXContext piglit_glx_context; -#endif static void display(void) @@ -112,126 +108,6 @@ piglit_framework_glut_init(int argc, char *argv[]) #endif } -#ifdef USE_GLX -static void -piglit_framework_fbo_glx_init() -{ - piglit_glx_dpy = piglit_get_glx_display(); - - /* Unfortunately in GLX we need a drawable to bind our context - * to. Make an unmapped window. - */ - piglit_glx_visinfo = piglit_get_glx_visual(piglit_glx_dpy); - - piglit_glx_context = piglit_get_glx_context(piglit_glx_dpy, - piglit_glx_visinfo); - - piglit_glx_window = piglit_get_glx_window_unmapped(piglit_glx_dpy, - piglit_glx_visinfo); - - glXMakeCurrent(piglit_glx_dpy, piglit_glx_window, piglit_glx_context); -} -#endif - -static void -piglit_framework_fbo_glx_destroy() -{ -#ifdef USE_GLX - glXMakeCurrent(piglit_glx_dpy, None, None); - glXDestroyContext(piglit_glx_dpy, piglit_glx_context); - XFree(piglit_glx_visinfo); - XCloseDisplay(piglit_glx_dpy); -#endif -} - -static void -piglit_framework_fbo_destroy() -{ -#ifdef USE_OPENGL - glDeleteFramebuffers(1, &piglit_winsys_fbo); -#endif - piglit_winsys_fbo = 0; - piglit_framework_fbo_glx_destroy(); -} - -static bool -piglit_framework_fbo_init() -{ -#ifdef USE_GLX - GLuint tex, depth = 0; - GLenum status; - - piglit_framework_fbo_glx_init(); - -#ifdef USE_OPENGL - glewInit(); - - if (piglit_get_gl_version() < 20) - return false; -#endif - - glGenFramebuffers(1, &piglit_winsys_fbo); - glBindFramebuffer(GL_FRAMEBUFFER, piglit_winsys_fbo); - - glGenTextures(1, &tex); - glBindTexture(GL_TEXTURE_2D, tex); - glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, - piglit_width, piglit_height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, NULL); - glFramebufferTexture2D(GL_FRAMEBUFFER, - GL_COLOR_ATTACHMENT0, - GL_TEXTURE_2D, - tex, - 0); - - if (piglit_window_mode & (GLUT_DEPTH | GLUT_STENCIL)) { - GLenum depth_stencil; - -#ifdef USE_OPENGL - depth_stencil = GL_DEPTH_STENCIL; -#else - depth_stencil = GL_DEPTH_STENCIL_OES; -#endif - - glGenTextures(1, &depth); - glBindTexture(GL_TEXTURE_2D, depth); - glTexImage2D(GL_TEXTURE_2D, 0, depth_stencil, - piglit_width, piglit_height, 0, - GL_RGBA, GL_UNSIGNED_BYTE, NULL); - glFramebufferTexture2D(GL_FRAMEBUFFER, - GL_DEPTH_ATTACHMENT, - GL_TEXTURE_2D, - depth, - 0); - glFramebufferTexture2D(GL_FRAMEBUFFER, - GL_STENCIL_ATTACHMENT, - GL_TEXTURE_2D, - depth, - 0); - } - - glBindTexture(GL_TEXTURE_2D, 0); - - status = glCheckFramebufferStatus(GL_FRAMEBUFFER); - if (status != GL_FRAMEBUFFER_COMPLETE) { - fprintf(stderr, - "-fbo resulted in incomplete FBO, falling back\n"); - glBindFramebuffer(GL_FRAMEBUFFER, 0); - - glDeleteTextures(1, &depth); - glDeleteTextures(1, &tex); - - piglit_framework_fbo_destroy(); - - return false; - } - - return true; -#else /* USE_GLX */ - return false; -#endif /* USE_GLX */ -} - static void delete_arg(char *argv[], int argc, int arg) { -- 1.7.10.1 _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
