trace: Improve shader wrapping
authorJakob Bornecrantz <jakob@vmware.com>
Sat, 16 May 2009 02:13:15 +0000 (03:13 +0100)
committerJakob Bornecrantz <jakob@vmware.com>
Mon, 18 May 2009 19:54:09 +0000 (20:54 +0100)
src/gallium/drivers/trace/tr_context.c
src/gallium/drivers/trace/tr_state.c
src/gallium/drivers/trace/tr_state.h

index a4166285628388708fb6568cdbb40094c965761e..2ad5ca4998727e30ef386e3deb78fda246dc0d7f 100644 (file)
@@ -582,7 +582,7 @@ trace_context_create_fs_state(struct pipe_context *_pipe,
 
    trace_dump_call_end();
 
-   result = trace_shader_create(tr_ctx, state, result);
+   result = trace_shader_create(tr_ctx, state, result, TRACE_SHADER_FRAGMENT);
 
    return result;
 }
@@ -654,7 +654,7 @@ trace_context_create_vs_state(struct pipe_context *_pipe,
 
    trace_dump_call_end();
 
-   result = trace_shader_create(tr_ctx, state, result);
+   result = trace_shader_create(tr_ctx, state, result, TRACE_SHADER_VERTEX);
 
    return result;
 }
index c9ce63a0edc1e7895d65558a9360cdabc9e283c6..d8c11640bf346efaa925ea1837cd6aecda89c8a5 100644 (file)
 #include "util/u_memory.h"
 #include "util/u_simple_list.h"
 
+#include "tgsi/tgsi_parse.h"
+
 struct trace_shader * trace_shader_create(struct trace_context *tr_ctx,
                                           const struct pipe_shader_state *state,
-                                          void *result)
+                                          void *result,
+                                          enum trace_shader_type type)
 {
    struct trace_shader *tr_shdr = CALLOC_STRUCT(trace_shader);
 
    tr_shdr->state = result;
+   tr_shdr->type = type;
+   tr_shdr->tokens = tgsi_dup_tokens(state->tokens);
 
    /* works on context as well */
    trace_screen_add_to_list(tr_ctx, shaders, tr_shdr);
@@ -46,5 +51,16 @@ void trace_shader_destroy(struct trace_context *tr_ctx,
 {
    trace_screen_remove_from_list(tr_ctx, shaders, tr_shdr);
 
+   if (tr_shdr->replaced) {
+      if (tr_shdr->type == TRACE_SHADER_FRAGMENT)
+         tr_ctx->pipe->delete_fs_state(tr_ctx->pipe, tr_shdr->replaced);
+      else if (tr_shdr->type == TRACE_SHADER_VERTEX)
+         tr_ctx->pipe->delete_vs_state(tr_ctx->pipe, tr_shdr->replaced);
+      else
+         assert(0);
+   }
+
+   FREE(tr_shdr->replaced_tokens);
+   FREE(tr_shdr->tokens);
    FREE(tr_shdr);
 }
index bca615c50e08804a33edcf48c4e8194239947f87..1c16042ee5a901498be46a3057762f0f0b3e0f99 100644 (file)
 
 struct tgsi_token;
 
+enum trace_shader_type {
+   TRACE_SHADER_FRAGMENT = 0,
+   TRACE_SHADER_VERTEX   = 1,
+   TRACE_SHADER_GEOMETRY = 2,
+};
+
 struct trace_shader
 {
    struct tr_list list;
 
+   enum trace_shader_type type;
+
    void *state;
    void *replaced;
 
@@ -51,7 +59,8 @@ trace_shader(void *state)
 
 struct trace_shader * trace_shader_create(struct trace_context *tr_ctx,
                                           const struct pipe_shader_state *state,
-                                          void *result);
+                                          void *result,
+                                          enum trace_shader_type type);
 
 void trace_shader_destroy(struct trace_context *tr_ctx,
                           struct trace_shader *tr_shdr);