]> git.tdb.fi Git - gldbg.git/blobdiff - source/glwrap.c
Query implementation limits on process startup
[gldbg.git] / source / glwrap.c
index c70b308384b339888dc4ab4527fc7a86df4fa4dc..ee679577011931b7264fda5e011fecda59077d35 100644 (file)
@@ -1,10 +1,3 @@
-/* $Id$
-
-This file is part of gldbg
-Copyright © 2009-2010  Mikko Rasa, Mikkosoft Productions
-Distributed under the GPL
-*/
-
 #include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
@@ -12,13 +5,18 @@ Distributed under the GPL
 #include <dlfcn.h>
 #include <fcntl.h>
 #include <signal.h>
+#include "arraysize.h"
 #include "breakpoint.h"
 #include "functions.h"
+#include "opengl.h"
 #include "packet.h"
 
+#define UNUSED __attribute__((unused))
+
 static unsigned char breakpoints[N_FUNCS] = { };
 static char break_any = 0;
 static char hold = 0;
+static char no_break = 0;
 
 static const char *get_lib_names(void)
 {
@@ -146,11 +144,55 @@ static void receive_gldBreak(GlPacket *pkt)
                break_any = flags_set;
 }
 
-static void receive_gldHold(GlPacket *pkt __attribute__((unused)))
+static void receive_gldHold(GlPacket *pkt UNUSED)
 {
        hold = 1;
 }
 
+static void receive_gldQueryViewport(GlPacket *pkt UNUSED)
+{
+       int viewport[4];
+
+       no_break = 1;
+       glGetIntegerv(GL_VIEWPORT, viewport);
+       no_break = 0;
+}
+
+static void receive_gldReadPixels(GlPacket *pkt)
+{
+       GLint x, y;
+       GLsizei width, height;
+       GLenum format, type;
+       char *data;
+
+       packet_read_int(pkt, &x);
+       packet_read_int(pkt, &y);
+       packet_read_int(pkt, &width);
+       packet_read_int(pkt, &height);
+       packet_read_int(pkt, (int *)&format);
+       packet_read_int(pkt, (int *)&type);
+
+       data = (char *)malloc(width*height*typesize(type)*formatsize(format));
+       no_break = 1;
+       glReadPixels(x, y, width, height, format, type, data);
+       no_break = 0;
+       free(data);
+}
+
+static void receive_gldQueryLimits(GlPacket *pkt UNUSED)
+{
+       int value;
+
+       no_break = 1;
+       value = 0;
+       glGetIntegerv(GL_MAX_TEXTURE_UNITS, &value);
+       value = 0;
+       glGetIntegerv(GL_MAX_VERTEX_ATTRIBS, &value);
+       value = 0;
+       glGetIntegerv(GL_MAX_UNIFORM_BUFFER_BINDINGS, &value);
+       no_break = 0;
+}
+
 static void receive(void)
 {
        GlPacket *pkt;
@@ -164,6 +206,9 @@ static void receive(void)
                {
                case FUNC_GLDBREAK: receive_gldBreak(pkt); break;
                case FUNC_GLDHOLD: receive_gldHold(pkt); break;
+               case FUNC_GLDQUERYVIEWPORT: receive_gldQueryViewport(pkt); break;
+               case FUNC_GLDREADPIXELS: receive_gldReadPixels(pkt); break;
+               case FUNC_GLDQUERYLIMITS: receive_gldQueryLimits(pkt); break;
                default:;
                }
        }
@@ -171,15 +216,25 @@ static void receive(void)
 
 void tracepoint(unsigned short func, int flag)
 {
+       int breakpoint;
+
+       if(no_break)
+               return;
+
        receive();
 
-       if((breakpoints[func]|break_any)&flag)
+       breakpoint = (breakpoints[func]|break_any)&flag;
+       if(breakpoint || hold)
        {
                GlPacket *pkt;
 
-               pkt = packet_begin(FUNC_GLDBREAK);
-               packet_write_short(pkt, func);
-               packet_send(pkt, get_out_fd());
+               if(breakpoint)
+               {
+                       pkt = packet_begin(FUNC_GLDBREAK);
+                       packet_write_short(pkt, func);
+                       packet_write_char(pkt, flag);
+                       packet_send(pkt, get_out_fd());
+               }
 
                break_any = 0;