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

Reply via email to