Copy piglit-framework.c to piglit-framework-fbo.c. The following commits will refactor each so that all the piglit_framework_fbo code is contained in piglit-framework-fbo.c. This copy is done before the refactor so that git merges go smoothly.
The piglit_framework_fbo code needs to be relocated to its own file because following commits will add an implementation atop Waffle. Currently, the piglit_framework_fbo code is only implemented for GLX. The increase in code size and #ifdef complexity warrants moving it to its own file. CC: Pauli Nieminen <[email protected]> Signed-off-by: Chad Versace <[email protected]> --- tests/util/piglit-framework-fbo.c | 310 +++++++++++++++++++++++++++++++++++++ 1 file changed, 310 insertions(+) create mode 100644 tests/util/piglit-framework-fbo.c diff --git a/tests/util/piglit-framework-fbo.c b/tests/util/piglit-framework-fbo.c new file mode 100644 index 0000000..dac04b7 --- /dev/null +++ b/tests/util/piglit-framework-fbo.c @@ -0,0 +1,310 @@ +/* + * 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. + */ + +/** + * Simple test case framework. + * + * \author Ian Romanick <[email protected]> + */ +#include <assert.h> +#include <string.h> +#include <stdio.h> +#include <stdlib.h> +#include <math.h> + +#include "piglit-util.h" +#include "piglit-framework.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) +{ + result = piglit_display(); + + if (piglit_automatic) { + glutDestroyWindow(piglit_window); +#ifdef FREEGLUT + /* Tell GLUT to clean up and exit, so that we can + * reasonably valgrind our testcases for memory + * leaks by the GL. + */ + glutSetOption(GLUT_ACTION_ON_WINDOW_CLOSE, + GLUT_ACTION_GLUTMAINLOOP_RETURNS); + glutLeaveMainLoop(); +#else + piglit_report_result(result); +#endif + } +} + +static void +reshape(int w, int h) +{ + piglit_width = w; + piglit_height = h; + + glViewport(0, 0, w, h); +} + +/* Swapbuffers the results to the window in non-auto mode. */ +void +piglit_present_results() +{ + if (!piglit_automatic && !piglit_use_fbo) + glutSwapBuffers(); +} + +static void +piglit_framework_glut_init(int argc, char *argv[]) +{ + piglit_glutInit(argc, argv); + + glutInitWindowPosition(0, 0); + glutInitWindowSize(piglit_width, piglit_height); + glutInitDisplayMode(piglit_window_mode); + piglit_window = glutCreateWindow(argv[0]); + +#ifdef USE_GLX + if (piglit_automatic) + piglit_glx_set_no_input(); +#endif + + glutDisplayFunc(display); + glutReshapeFunc(reshape); + glutKeyboardFunc(piglit_escape_exit_key); + +#ifdef USE_OPENGL + glewInit(); +#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) +{ + int i; + + for (i = arg + 1; i < argc; i++) { + argv[i - 1] = argv[i]; + } +} + +int main(int argc, char *argv[]) +{ + int j; + + /* Find/remove "-auto" and "-fbo" from the argument vector. + */ + for (j = 1; j < argc; j++) { + if (!strcmp(argv[j], "-auto")) { + piglit_automatic = 1; + delete_arg(argv, argc--, j--); + } else if (!strcmp(argv[j], "-fbo")) { + piglit_use_fbo = true; + delete_arg(argv, argc--, j--); + } else if (!strcmp(argv[j], "-rlimit")) { + char *ptr; + unsigned long lim; + int i; + + j++; + if (j >= argc) { + fprintf(stderr, + "-rlimit requires an argument\n"); + piglit_report_result(PIGLIT_FAIL); + } + + lim = strtoul(argv[j], &ptr, 0); + if (ptr == argv[j]) { + fprintf(stderr, + "-rlimit requires an argument\n"); + piglit_report_result(PIGLIT_FAIL); + } + + piglit_set_rlimit(lim); + + /* Remove 2 arguments (hence the 'i - 2') from the + * command line. + */ + for (i = j + 1; i < argc; i++) { + argv[i - 2] = argv[i]; + } + argc -= 2; + j -= 2; + } + } + + if (piglit_use_fbo) { + if (!piglit_framework_fbo_init()) + piglit_use_fbo = false; + } + + if (!piglit_use_fbo) + piglit_framework_glut_init(argc, argv); + + piglit_init(argc, argv); + + if (piglit_use_fbo) { + result = piglit_display(); + piglit_framework_fbo_destroy(); + } else { + glutMainLoop(); + } + + piglit_report_result(result); + /* UNREACHED */ + return 0; +} -- 1.7.10.1 _______________________________________________ Piglit mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/piglit
