]> git.cworth.org Git - apitrace/commitdiff
gltrace: Emit fake glViewport/glScissor calls the first time a context is bound.
authorJosé Fonseca <jfonseca@vmware.com>
Wed, 12 Jun 2013 22:13:09 +0000 (23:13 +0100)
committerJosé Fonseca <jfonseca@vmware.com>
Wed, 12 Jun 2013 22:14:22 +0000 (23:14 +0100)
This addresses issue #59.

wrappers/gltrace.hpp
wrappers/gltrace_state.cpp

index 04c64b6afc0623ad690cbeb80ced17d3687de53f..dd8058cef4c42248075a9a1b3c74bbfdd7bc3940 100644 (file)
@@ -97,6 +97,9 @@ public:
     bool user_arrays_nv;
     unsigned retain_count;
 
+    // Whether it has been bound before
+    bool bound;
+
     // TODO: This will fail for buffers shared by multiple contexts.
     std::map <GLuint, Buffer> buffers;
 
@@ -105,7 +108,8 @@ public:
         user_arrays(false),
         user_arrays_arb(false),
         user_arrays_nv(false),
-        retain_count(0)
+        retain_count(0),
+        bound(false)
     { }
 
     inline bool
index 60eada60d49e4014def29e518526ba79a9cfe994..a8476b04c1bb247b9fb1131eb2c81852f7723896 100644 (file)
@@ -34,8 +34,9 @@
 #include <tr1/memory>
 #endif
 
-#include <gltrace.hpp>
 #include <os_thread.hpp>
+#include <glproc.hpp>
+#include <gltrace.hpp>
 
 namespace gltrace {
 
@@ -142,6 +143,29 @@ void setContext(uintptr_t context_id)
     context_map_mutex.unlock();
 
     ts->current_context = ctx;
+
+    if (!ctx->bound) {
+        ctx->bound = true;
+
+        /*
+         * The default viewport and scissor state is set when a context is
+         * first made current, with values matching the bound drawable.  Many
+         * applications never thouch the default state ever again.
+         *
+         * Since we currently don't trace window sizes, and rely on viewport
+         * calls to deduct, emit fake calls here so that viewport/scissor state
+         * can be deducated.
+         *
+         * FIXME: don't call the real functions here -- just emit the fake
+         * calls.
+         */
+        GLint viewport[4] = {0, 0, 0, 0};
+        GLint scissor_box[4] = {0, 0, 0, 0};
+        _glGetIntegerv(GL_VIEWPORT, viewport);
+        _glGetIntegerv(GL_SCISSOR_BOX, scissor_box);
+        glViewport(viewport[0], viewport[1], viewport[2], viewport[3]);
+        glScissor(scissor_box[0], scissor_box[1], scissor_box[2], scissor_box[3]);
+    }
 }
 
 void clearContext(void)