python: Allow to use trace pipe driver with python.
authorJosé Fonseca <jrfonseca@tungstengraphics.com>
Thu, 14 Aug 2008 09:58:23 +0000 (10:58 +0100)
committerJosé Fonseca <jrfonseca@tungstengraphics.com>
Thu, 14 Aug 2008 10:01:43 +0000 (11:01 +0100)
src/gallium/state_trackers/python/SConscript
src/gallium/state_trackers/python/st_device.c
src/gallium/state_trackers/python/st_device.h

index 973d96d55a1c0354e17113757d41258424919330..1581182aec2f8788a0c6ef912e087cecfe36e14d 100644 (file)
@@ -30,5 +30,5 @@ if 'python' in env['statetrackers']:
         source = [
             'st_hardpipe_winsys.c',
         ],
-        LIBS = [pyst, softpipe] + auxiliaries + env['LIBS'],
+        LIBS = [pyst, softpipe, trace] + auxiliaries + env['LIBS'],
     )
index c82261e4e7532c099d2937641b1888d82462ae9a..a1889539dce0b5536bacda049f55ee3439beb525 100644 (file)
@@ -33,6 +33,9 @@
 #include "pipe/p_inlines.h"
 #include "cso_cache/cso_context.h"
 #include "util/u_simple_shaders.h"
+#include "trace/tr_screen.h"
+#include "trace/tr_context.h"
+
 #include "st_device.h"
 #include "st_winsys.h"
 
@@ -71,9 +74,17 @@ st_device_create_from_st_winsys(const struct st_winsys *st_ws)
    st_dev->refcount = 1;
    st_dev->st_ws = st_ws;
    
-   st_dev->screen = st_ws->screen_create();
-   if(!st_dev->screen)
+   st_dev->real_screen = st_ws->screen_create();
+   if(!st_dev->real_screen) {
+      st_device_destroy(st_dev);
+      return NULL;
+   }
+
+   st_dev->screen = trace_screen_create(st_dev->real_screen);
+   if(!st_dev->screen) {
       st_device_destroy(st_dev);
+      return NULL;
+   }
    
    return st_dev;
 }
@@ -130,13 +141,23 @@ st_context_create(struct st_device *st_dev)
    st_ctx->st_dev = st_dev;
    ++st_dev->refcount;
    
-   st_ctx->pipe = st_dev->st_ws->context_create(st_dev->screen);
-   if(!st_ctx->pipe)
+   st_ctx->real_pipe = st_dev->st_ws->context_create(st_dev->real_screen);
+   if(!st_ctx->real_pipe) {
       st_context_destroy(st_ctx);
+      return NULL;
+   }
    
+   st_ctx->pipe = trace_context_create(st_dev->screen, st_ctx->real_pipe);
+   if(!st_ctx->pipe) {
+      st_context_destroy(st_ctx);
+      return NULL;
+   }
+
    st_ctx->cso = cso_create_context(st_ctx->pipe);
-   if(!st_ctx->cso)
+   if(!st_ctx->cso) {
       st_context_destroy(st_ctx);
+      return NULL;
+   }
    
    /* disabled blending/masking */
    {
@@ -291,8 +312,10 @@ st_buffer_create(struct st_device *st_dev,
    st_buf->st_dev = st_dev;
    
    st_buf->buffer = winsys->buffer_create(winsys, alignment, usage, size);
-   if(!st_buf->buffer)
+   if(!st_buf->buffer) {
       st_buffer_destroy(st_buf);
+      return NULL;
+   }
    
    return st_buf;
 }
index 644c263b53d0f1aaed89ac5b6f9bb3e4e60c3002..7cfe6de9f6a733ab9bc8c065e0ef3478fc5b1cd1 100644 (file)
@@ -48,6 +48,7 @@ struct st_buffer {
 struct st_context {
    struct st_device *st_dev;
    
+   struct pipe_context *real_pipe;
    struct pipe_context *pipe;
    
    struct cso_context *cso;
@@ -68,7 +69,8 @@ struct st_context {
 
 struct st_device {
    const struct st_winsys *st_ws; 
-   
+
+   struct pipe_screen *real_screen;
    struct pipe_screen *screen;
    
    /* FIXME: we also need to refcount for textures and surfaces... */