summaryrefslogtreecommitdiff
path: root/src/mesa
diff options
context:
space:
mode:
authorMichel Dänzer <michel@tungstengraphics.com>2007-10-03 20:33:23 +0200
committerMichel Dänzer <michel@tungstengraphics.com>2007-10-03 20:33:23 +0200
commit344464bf2e4e151968cfb101c2477e440508b1f0 (patch)
tree18bddd332b0b1af67246c985e976ee937d2ae600 /src/mesa
parentce765a7fb77e12ff083a9068ec232a15bcf41f66 (diff)
Track fragment and vertex shader code generation via pipe shader state objects.
Unfortunately, the generated fragment shader code is effectively unusable until it handles quad->mask.
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/pipe/draw/draw_private.h3
-rw-r--r--src/mesa/pipe/draw/draw_vertex_shader.c16
-rw-r--r--src/mesa/pipe/p_state.h5
-rw-r--r--src/mesa/pipe/softpipe/sp_context.c6
-rw-r--r--src/mesa/pipe/softpipe/sp_context.h2
-rwxr-xr-xsrc/mesa/pipe/softpipe/sp_quad_fs.c3
-rw-r--r--src/mesa/pipe/softpipe/sp_state_fs.c20
-rw-r--r--src/mesa/state_tracker/st_cb_program.c7
-rw-r--r--src/mesa/state_tracker/st_program.c10
-rw-r--r--src/mesa/state_tracker/st_program.h4
10 files changed, 45 insertions, 31 deletions
diff --git a/src/mesa/pipe/draw/draw_private.h b/src/mesa/pipe/draw/draw_private.h
index b3f1c4d23e..79b2176c59 100644
--- a/src/mesa/pipe/draw/draw_private.h
+++ b/src/mesa/pipe/draw/draw_private.h
@@ -124,9 +124,6 @@ struct draw_stage
*/
struct draw_vertex_shader {
const struct pipe_shader_state *state;
-#if defined(__i386__) || defined(__386__)
- struct x86_function sse2_program;
-#endif
};
/**
diff --git a/src/mesa/pipe/draw/draw_vertex_shader.c b/src/mesa/pipe/draw/draw_vertex_shader.c
index 49ff3b32ff..e99537f16c 100644
--- a/src/mesa/pipe/draw/draw_vertex_shader.c
+++ b/src/mesa/pipe/draw/draw_vertex_shader.c
@@ -214,12 +214,13 @@ draw_create_vertex_shader(struct draw_context *draw,
vs->state = shader;
#if defined(__i386__) || defined(__386__)
- x86_init_func(&vs->sse2_program);
-
if (draw->use_sse) {
- tgsi_emit_sse2(shader->tokens, &vs->sse2_program);
- ((struct pipe_shader_state*)(vs->state))->executable =
- x86_get_func(&vs->sse2_program);
+ x86_init_func( &shader->sse2_program );
+
+ tgsi_emit_sse2( shader->tokens, &shader->sse2_program );
+
+ ((struct pipe_shader_state *)shader)->executable = (void *)
+ x86_get_func( &shader->sse2_program );
}
#endif
@@ -243,9 +244,12 @@ void draw_delete_vertex_shader(struct draw_context *draw,
void *vcso)
{
struct draw_vertex_shader *vs = (struct draw_vertex_shader*)(vcso);
+
#if defined(__i386__) || defined(__386__)
- x86_release_func(&vs->sse2_program);
+ x86_release_func(&vs->state->sse2_program);
#endif
+
+ free(vs->state);
free(vcso);
}
diff --git a/src/mesa/pipe/p_state.h b/src/mesa/pipe/p_state.h
index b4fc01bfc5..ac9d7009cc 100644
--- a/src/mesa/pipe/p_state.h
+++ b/src/mesa/pipe/p_state.h
@@ -40,6 +40,8 @@
#include "p_compiler.h"
+#include "x86/rtasm/x86sse.h"
+
/**
* Implementation limits
*/
@@ -143,6 +145,9 @@ struct pipe_constant_buffer {
struct pipe_shader_state {
const struct tgsi_token *tokens;
+#if defined(__i386__) || defined(__386__)
+ struct x86_function sse2_program;
+#endif
void *executable;
/** These fields somewhat constitute the shader "signature" */
diff --git a/src/mesa/pipe/softpipe/sp_context.c b/src/mesa/pipe/softpipe/sp_context.c
index 610e7ad689..daccc8fe23 100644
--- a/src/mesa/pipe/softpipe/sp_context.c
+++ b/src/mesa/pipe/softpipe/sp_context.c
@@ -249,6 +249,12 @@ struct pipe_context *softpipe_create( struct pipe_winsys *pipe_winsys,
{
struct softpipe_context *softpipe = CALLOC_STRUCT(softpipe_context);
+#if defined(__i386__) || defined(__386__)
+ softpipe->use_sse = getenv("GALLIUM_SSE") != NULL;
+#else
+ softpipe->use_sse = false;
+#endif
+
softpipe->pipe.winsys = pipe_winsys;
softpipe->pipe.destroy = softpipe_destroy;
diff --git a/src/mesa/pipe/softpipe/sp_context.h b/src/mesa/pipe/softpipe/sp_context.h
index ccf29b5683..4f429e8139 100644
--- a/src/mesa/pipe/softpipe/sp_context.h
+++ b/src/mesa/pipe/softpipe/sp_context.h
@@ -154,6 +154,8 @@ struct softpipe_context {
struct draw_stage *vbuf;
struct pipe_surface *cbuf; /**< current color buffer (one of cbufs) */
+
+ int use_sse : 1;
};
diff --git a/src/mesa/pipe/softpipe/sp_quad_fs.c b/src/mesa/pipe/softpipe/sp_quad_fs.c
index f394c587dc..a8c25c4868 100755
--- a/src/mesa/pipe/softpipe/sp_quad_fs.c
+++ b/src/mesa/pipe/softpipe/sp_quad_fs.c
@@ -103,7 +103,8 @@ shade_quad(
machine->Inputs[0].xyzw[1].f[3] = fy + 1.0f;
/* run shader */
- if( softpipe->fs->executable != NULL ) {
+ /* XXX: Generated code effectively unusable until it handles quad->mask */
+ if( !quad->mask && softpipe->fs->executable != NULL ) {
codegen_function func = (codegen_function) softpipe->fs->executable;
func(
machine->Inputs,
diff --git a/src/mesa/pipe/softpipe/sp_state_fs.c b/src/mesa/pipe/softpipe/sp_state_fs.c
index 88d9bd9716..5547c849ac 100644
--- a/src/mesa/pipe/softpipe/sp_state_fs.c
+++ b/src/mesa/pipe/softpipe/sp_state_fs.c
@@ -31,17 +31,31 @@
#include "pipe/p_defines.h"
#include "pipe/p_winsys.h"
#include "pipe/draw/draw_context.h"
+#include "pipe/tgsi/exec/tgsi_core.h"
void * softpipe_create_fs_state(struct pipe_context *pipe,
const struct pipe_shader_state *templ)
{
+ struct softpipe_context *softpipe = softpipe_context(pipe);
+
/* Decide whether we'll be codegenerating this shader and if so do
* that now.
*/
struct pipe_shader_state *state = malloc(sizeof(struct pipe_shader_state));
memcpy(state, templ, sizeof(struct pipe_shader_state));
+
+#if defined(__i386__) || defined(__386__)
+ if (softpipe->use_sse) {
+ x86_init_func( &state->sse2_program );
+
+ tgsi_emit_sse2_fs( state->tokens, &state->sse2_program );
+
+ state->executable = (void *)x86_get_func( &state->sse2_program );
+ }
+#endif
+
return state;
}
@@ -57,6 +71,12 @@ void softpipe_bind_fs_state(struct pipe_context *pipe, void *fs)
void softpipe_delete_fs_state(struct pipe_context *pipe,
void *shader)
{
+#if defined(__i386__) || defined(__386__)
+ struct pipe_shader_state *state = shader;
+
+ x86_release_func( &state->sse2_program );
+#endif
+
free(shader);
}
diff --git a/src/mesa/state_tracker/st_cb_program.c b/src/mesa/state_tracker/st_cb_program.c
index 1902c8d7d6..23a7bf473e 100644
--- a/src/mesa/state_tracker/st_cb_program.c
+++ b/src/mesa/state_tracker/st_cb_program.c
@@ -108,10 +108,6 @@ static struct gl_program *st_new_program( GLcontext *ctx,
prog->serialNo = 1;
-#if defined(__i386__) || defined(__386__)
- x86_init_func( &prog->sse2_program );
-#endif
-
return _mesa_init_fragment_program( ctx,
&prog->Base,
target,
@@ -140,9 +136,6 @@ static void st_delete_program( GLcontext *ctx,
{
struct st_fragment_program *stfp
= (struct st_fragment_program *) prog;
-#if defined(__i386__) || defined(__386__)
- x86_release_func( &stfp->sse2_program );
-#endif
st_remove_fragment_program(st, stfp);
}
break;
diff --git a/src/mesa/state_tracker/st_program.c b/src/mesa/state_tracker/st_program.c
index a00f296d15..807cd8cb05 100644
--- a/src/mesa/state_tracker/st_program.c
+++ b/src/mesa/state_tracker/st_program.c
@@ -390,16 +390,6 @@ st_translate_fragment_program(struct st_context *st,
if (TGSI_DEBUG)
tgsi_dump( tokensOut, 0/*TGSI_DUMP_VERBOSE*/ );
-#if defined(__i386__) || defined(__386__)
- if (draw_use_sse(st->draw)) {
- if (stfp->sse2_program.csr == stfp->sse2_program.store)
- tgsi_emit_sse2_fs( tokensOut, &stfp->sse2_program );
-
- if (!cso->state.executable)
- ((struct cso_fragment_shader*)cso)->state.executable = (void *) x86_get_func( &stfp->sse2_program );
- }
-#endif
-
return cso;
}
diff --git a/src/mesa/state_tracker/st_program.h b/src/mesa/state_tracker/st_program.h
index a714f3f5b0..ae89055e82 100644
--- a/src/mesa/state_tracker/st_program.h
+++ b/src/mesa/state_tracker/st_program.h
@@ -61,10 +61,6 @@ struct st_fragment_program
/** The program in TGSI format */
struct tgsi_token tokens[ST_MAX_SHADER_TOKENS];
-#if defined(__i386__) || defined(__386__)
- struct x86_function sse2_program;
-#endif
-
/** Pointer to the corresponding cached shader */
const struct cso_fragment_shader *fs;