]> git.cworth.org Git - apitrace/commitdiff
Merge branch 'master' into noglut
authorJosé Fonseca <jose.r.fonseca@gmail.com>
Sat, 9 Apr 2011 15:06:05 +0000 (16:06 +0100)
committerJosé Fonseca <jose.r.fonseca@gmail.com>
Sat, 9 Apr 2011 15:06:05 +0000 (16:06 +0100)
Conflicts:
CMakeLists.txt

CMakeLists.txt
glretrace.py
glws.hpp [new file with mode: 0644]
glws_glx.cpp [new file with mode: 0644]

index 868bc9033fd2b45a95a2a8eef229033cdf1fc9bd..506325e0a8956ffb5d1388252f3ae0b6986ab900 100644 (file)
@@ -28,8 +28,6 @@ else (NOT WIN32)
     find_package (DirectX)
 endif (NOT WIN32)
 
-find_package (GLUT)
-
 if (WIN32)
     # MSVC & MinGW only define & use APIENTRY
     add_definitions (-DGLAPIENTRY=__stdcall)
@@ -193,8 +191,10 @@ endif ()
 
 if (WIN32)
     set (os os_win32.cpp)
+    set (glws glws_wgl.cpp)
 else (WIN32)
     set (os os_posix.cpp)
+    set (glws glws_glx.cpp)
 endif (WIN32)
 
 add_library (trace trace_model.cpp trace_parser.cpp ${os})
@@ -202,46 +202,42 @@ add_library (trace trace_model.cpp trace_parser.cpp ${os})
 add_executable (dump dump.cpp)
 target_link_libraries (dump trace)
 
-if (GLUT_INCLUDE_DIR)
-    add_custom_command (
-        OUTPUT glretrace.cpp
-        COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/glretrace.cpp
-        DEPENDS glretrace.py retrace.py codegen.py glapi.py glenum.py stdapi.py
-    )
+add_custom_command (
+    OUTPUT glretrace.cpp
+    COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glretrace.py > ${CMAKE_CURRENT_BINARY_DIR}/glretrace.cpp
+    DEPENDS glretrace.py retrace.py codegen.py glapi.py glenum.py stdapi.py
+)
 
-    add_custom_command (
-        OUTPUT glstate.cpp
-        COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glstate.py > ${CMAKE_CURRENT_BINARY_DIR}/glstate.cpp
-        DEPENDS glstate.py glenum.py stdapi.py
-    )
+add_custom_command (
+    OUTPUT glstate.cpp
+    COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/glstate.py > ${CMAKE_CURRENT_BINARY_DIR}/glstate.cpp
+    DEPENDS glstate.py glenum.py stdapi.py
+)
 
-    include_directories (
-        ${CMAKE_CURRENT_BINARY_DIR}
-        ${OPENGL_INCLUDE_PATH}
-        ${GLUT_INCLUDE_DIR}
-    )
+include_directories (
+    ${CMAKE_CURRENT_BINARY_DIR}
+    ${OPENGL_INCLUDE_PATH}
+)
 
-    add_executable (glretrace
-        glretrace.cpp
-        glstate.cpp
-        image.cpp 
-        ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp
-    )
+add_executable (glretrace
+    glretrace.cpp
+    glstate.cpp
+    ${glws}
+    image.cpp 
+    ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp
+)
 
-    set_property (
-        TARGET glretrace
-        APPEND
-        PROPERTY COMPILE_DEFINITIONS "RETRACE"
-    )
+set_property (
+    TARGET glretrace
+    APPEND
+    PROPERTY COMPILE_DEFINITIONS "RETRACE"
+)
 
-    target_link_libraries (glretrace
-        trace
-        ${OPENGL_gl_LIBRARY}
-        ${OPENGL_glu_LIBRARY}
-        ${GLUT_glut_LIBRARY}
-    )
-    
-endif (GLUT_INCLUDE_DIR)
+target_link_libraries (glretrace
+    trace
+    ${OPENGL_gl_LIBRARY}
+    ${OPENGL_glu_LIBRARY}
+)
 
 if (QT4_FOUND AND QJSON_FOUND)
     add_subdirectory(gui)
index 31058a2f2e0ce883287f9a53131234eac5407516..450ce7dd19d215648daddaf860321013455f8989 100644 (file)
@@ -169,8 +169,7 @@ if __name__ == '__main__':
 
 #include "glproc.hpp"
 #include "glstate.hpp"
-
-#include <GL/glut.h>
+#include "glws.hpp"
 
 static bool double_buffer = false;
 static bool insideGlBeginEnd = false;
@@ -239,9 +238,10 @@ checkGlError(void) {
     print r'''
 
 static Trace::Parser parser;
-
-static void display_noop(void) {
-}
+static glws::WindowSystem *__ws = NULL;
+static glws::Visual *__visual = NULL;
+static glws::Drawable *__drawable = NULL;
+static glws::Context *__context = NULL;
 
 #include "image.hpp"
 
@@ -288,7 +288,14 @@ static void frame_complete(void) {
             delete ref;
         }
     }
+    
+    if (__reshape_window) {
+        // XXX: doesn't quite work
+        __drawable->resize(__window_width, __window_height);
+        __reshape_window = false;
+    }
 
+    __ws->processEvents();
 }
 
 static void display(void) {
@@ -313,21 +320,14 @@ static void display(void) {
                 };
                 frame_complete();
                 if (double_buffer)
-                    glutSwapBuffers();
+                    __drawable->swapBuffers();
                 else
                     glFlush();
-
-                // Return now to allow GLUT to resize the window.
-                delete call;
-                return;
             } else if (name == "glXMakeCurrent" ||
                        name == "wglMakeCurrent") {
                 glFlush();
                 if (!double_buffer) {
                     frame_complete();
-                    // Return now to allow GLUT to resize window.
-                    delete call;
-                    return;
                 }
             } else {
                 continue;
@@ -360,22 +360,12 @@ static void display(void) {
     }
 
     if (__wait) {
-        glutDisplayFunc(&display_noop);
-        glutIdleFunc(NULL);
+        while (__ws->processEvents()) {}
     } else {
         exit(0);
     }
 }
 
-static void idle(void) {
-    if (__reshape_window) {
-        // XXX: doesn't quite work
-        glutReshapeWindow(__window_width, __window_height);
-        __reshape_window = false;
-    }
-    glutPostRedisplay();
-}
-
 static void usage(void) {
     std::cout << 
         "Usage: glretrace [OPTION] TRACE\n"
@@ -429,19 +419,17 @@ int main(int argc, char **argv)
         }
     }
 
-    glutInit(&argc, argv);
-    glutInitWindowPosition(0, 0);
-    glutInitWindowSize(__window_width, __window_height);
-    glutInitDisplayMode(GLUT_DEPTH | GLUT_RGB | (double_buffer ? GLUT_DOUBLE : GLUT_SINGLE));
-    glutCreateWindow(argv[0]);
-
-    glutDisplayFunc(&display);
-    glutIdleFunc(&idle);
+    __ws = glws::createNativeWindowSystem();
+    __visual = __ws->createVisual(double_buffer);
+    __drawable = __ws->createDrawable(__visual);
+    __drawable->resize(__window_width, __window_height);
+    __context = __ws->createContext(__visual);
+    __ws->makeCurrent(__drawable, __context);
 
     for ( ; i < argc; ++i) {
         if (parser.open(argv[i])) {
             __startTime = OS::GetTime();
-            glutMainLoop();
+            display();
             parser.close();
         }
     }
diff --git a/glws.hpp b/glws.hpp
new file mode 100644 (file)
index 0000000..8f4a845
--- /dev/null
+++ b/glws.hpp
@@ -0,0 +1,123 @@
+/**************************************************************************
+ *
+ * Copyright 2011 Jose Fonseca
+ * All Rights Reserved.
+ *
+ * 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 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.
+ *
+ **************************************************************************/
+
+/*
+ * Abstraction for GL window system specific APIs (GLX, WGL).
+ */
+
+#ifndef _GLWS_HPP_
+#define _GLWS_HPP_
+
+
+namespace glws {
+
+
+class Visual
+{
+public:
+    unsigned long redMask;
+    unsigned long greenMask;
+    unsigned long blueMask;
+    unsigned long alphaMask;
+    bool doubleBuffer;
+
+    virtual ~Visual() {}
+};
+
+
+class Drawable
+{
+public:
+    const Visual *visual;
+    unsigned width;
+    unsigned height;
+
+    Drawable(const Visual *vis) :
+        visual(vis)
+    {}
+
+    virtual ~Drawable() {}
+    
+    virtual void
+    resize(unsigned w, unsigned h) {
+        width = w;
+        height = h;
+    }
+
+    virtual void swapBuffers(void) = 0;
+};
+
+
+class Context
+{
+public:
+    const Visual *visual;
+    
+    Context(const Visual *vis) :
+        visual(vis)
+    {}
+
+    virtual ~Context() {}
+};
+
+
+class WindowSystem
+{
+public:
+    Drawable *currentDrawable;
+    Context *currentContext;
+
+
+    inline WindowSystem() :
+        currentDrawable(NULL),
+        currentContext(NULL)
+    {}
+
+    virtual ~WindowSystem() {}
+
+    virtual Visual *
+    createVisual(bool doubleBuffer=false) = 0;
+    
+    virtual Drawable *
+    createDrawable(const Visual *visual) = 0;
+
+    virtual Context *
+    createContext(const Visual *visual) = 0;
+    
+    virtual bool
+    makeCurrent(Drawable *drawable, Context *context) = 0;
+
+    virtual bool
+    processEvents(void) = 0;
+};
+
+
+WindowSystem *createNativeWindowSystem(void);
+
+
+} /* namespace glws */
+
+
+#endif /* _GLWS_HPP_ */
diff --git a/glws_glx.cpp b/glws_glx.cpp
new file mode 100644 (file)
index 0000000..be0a82b
--- /dev/null
@@ -0,0 +1,232 @@
+/**************************************************************************
+ *
+ * Copyright 2011 Jose Fonseca
+ * All Rights Reserved.
+ *
+ * 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 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 "glimports.hpp"
+#include "glws.hpp"
+
+
+namespace glws {
+
+
+class XlibVisual : public Visual
+{
+public:
+    XVisualInfo *visinfo;
+
+    XlibVisual(XVisualInfo *vi) :
+        visinfo(vi)
+    {}
+
+    ~XlibVisual() {
+        XFree(visinfo);
+    }
+};
+
+
+class XlibDrawable : public Drawable
+{
+public:
+    Display *display;
+    Window window;
+
+    XlibDrawable(const Visual *vis, Display *dpy, Window win) :
+        Drawable(vis),
+        display(dpy), 
+        window(win)
+    {}
+
+    ~XlibDrawable() {
+        XDestroyWindow(display, window);
+    }
+    
+    void
+    resize(unsigned w, unsigned h) {
+        Drawable::resize(w, h);
+        XResizeWindow(display, window, w, h);
+    }
+
+    void swapBuffers(void) {
+        glXSwapBuffers(display, window);
+    }
+};
+
+
+class XlibContext : public Context
+{
+public:
+    Display *display;
+    GLXContext context;
+    
+    XlibContext(const Visual *vis, Display *dpy, GLXContext ctx) :
+        Context(vis),
+        display(dpy), 
+        context(ctx)
+    {}
+
+    ~XlibContext() {
+        glXDestroyContext(display, context);
+    }
+};
+
+
+class XlibWindowSystem : public WindowSystem
+{
+private:
+    Display *display;
+    int screen;
+
+public:
+    Drawable *currentDrawable;
+    Context *currentContext;
+
+    XlibWindowSystem() {
+       display = XOpenDisplay(NULL);
+       screen = DefaultScreen(display);
+    }
+
+    ~XlibWindowSystem() {
+        XCloseDisplay(display);
+    }
+
+    Visual *
+    createVisual(bool doubleBuffer) {
+        int single_attribs[] = {
+            GLX_RGBA,
+            GLX_RED_SIZE, 1,
+            GLX_GREEN_SIZE, 1,
+            GLX_BLUE_SIZE, 1,
+            GLX_DEPTH_SIZE, 1,
+            None
+        };
+
+        int double_attribs[] = {
+            GLX_RGBA,
+            GLX_RED_SIZE, 1,
+            GLX_GREEN_SIZE, 1,
+            GLX_BLUE_SIZE, 1,
+            GLX_DOUBLEBUFFER,
+            GLX_DEPTH_SIZE, 1,
+            None
+        };
+
+        XVisualInfo *visinfo;
+        
+        visinfo = glXChooseVisual(display, screen, doubleBuffer ? double_attribs : single_attribs);
+
+        return new XlibVisual(visinfo);
+    }
+    
+    Drawable *
+    createDrawable(const Visual *visual)
+    {
+        XVisualInfo *visinfo = dynamic_cast<const XlibVisual *>(visual)->visinfo;
+
+        Window root = RootWindow(display, screen);
+
+        /* window attributes */
+        XSetWindowAttributes attr;
+        attr.background_pixel = 0;
+        attr.border_pixel = 0;
+        attr.colormap = XCreateColormap(display, root, visinfo->visual, AllocNone);
+        attr.event_mask = StructureNotifyMask | ExposureMask | KeyPressMask;
+        
+        unsigned long mask;
+        mask = CWBackPixel | CWBorderPixel | CWColormap | CWEventMask;
+
+        int x = 0, y = 0, width = 256, height = 256;
+
+        Window window = XCreateWindow(
+            display, root, 
+            x, y, width, height,
+            0, 
+            visinfo->depth, 
+            InputOutput,
+            visinfo->visual, 
+            mask, 
+            &attr);
+
+        XSizeHints sizehints;
+        sizehints.x = x;
+        sizehints.y = y;
+        sizehints.width  = width;
+        sizehints.height = height;
+        sizehints.flags = USSize | USPosition;
+        XSetNormalHints(display, window, &sizehints);
+        
+        const char *name = "glretrace";
+        XSetStandardProperties(
+            display, window, name, name,
+            None, (char **)NULL, 0, &sizehints);
+
+        XMapWindow(display, window);
+        
+        return new XlibDrawable(visual, display, window);
+    }
+
+    Context *
+    createContext(const Visual *visual)
+    {
+        XVisualInfo *visinfo = dynamic_cast<const XlibVisual *>(visual)->visinfo;
+        GLXContext context = glXCreateContext(display, visinfo, NULL, True);
+        return new XlibContext(visual, display, context);
+    }
+
+    bool
+    makeCurrent(Drawable *drawable, Context *context)
+    {
+        Window win = drawable ? dynamic_cast<XlibDrawable *>(drawable)->window : NULL;
+        GLXContext ctx = context ? dynamic_cast<XlibContext *>(context)->context : NULL;
+
+        bool ret = glXMakeCurrent(display, win, ctx);
+
+        if (drawable && context && ret) {
+            currentDrawable = drawable;
+            currentContext = context;
+        } else {
+            currentDrawable = NULL;
+            currentContext = NULL;
+        }
+
+        return ret;
+    }
+
+    bool
+    processEvents(void) {
+      while (XPending(display) > 0) {
+         XEvent event;
+         XNextEvent(display, &event);
+         // TODO
+      }
+      return true;
+    }
+};
+
+
+WindowSystem *createNativeWindowSystem(void) {
+    return new XlibWindowSystem();
+}
+
+
+} /* namespace glretrace */