summaryrefslogtreecommitdiff
path: root/src/gallium/drivers/trace/tr_state.c
diff options
context:
space:
mode:
authorJakob Bornecrantz <jakob@vmware.com>2009-05-16 03:13:15 +0100
committerJakob Bornecrantz <jakob@vmware.com>2009-05-18 20:54:09 +0100
commitbd59dd69ba0f11f96e627c663c67cc15d1083776 (patch)
tree3bfcfee6d14e9e58bde8930b56d024890f188598 /src/gallium/drivers/trace/tr_state.c
parent7d11a392d780ef7f0374f8da87e3ba416d880cf2 (diff)
trace: Improve shader wrapping
Diffstat (limited to 'src/gallium/drivers/trace/tr_state.c')
-rw-r--r--src/gallium/drivers/trace/tr_state.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/src/gallium/drivers/trace/tr_state.c b/src/gallium/drivers/trace/tr_state.c
index c9ce63a0ed..d8c11640bf 100644
--- a/src/gallium/drivers/trace/tr_state.c
+++ b/src/gallium/drivers/trace/tr_state.c
@@ -27,13 +27,18 @@
#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);
}