aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichel Dänzer <[email protected]>2007-10-03 20:33:23 +0200
committerMichel Dänzer <[email protected]>2007-10-03 20:33:23 +0200
commit344464bf2e4e151968cfb101c2477e440508b1f0 (patch)
tree18bddd332b0b1af67246c985e976ee937d2ae600
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.
-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 b3f1c4d23ea..79b2176c59c 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 49ff3b32ff4..e99537f16c2 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 b4fc01bfc5c..ac9d7009cc0 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 610e7ad6899..daccc8fe238 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 ccf29b5683d..4f429e81397 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 f394c587dc8..a8c25c48683 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 88d9bd97168..5547c849ac9 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 1902c8d7d61..23a7bf473e5 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 a00f296d15f..807cd8cb052 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 a714f3f5b01..ae89055e82c 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;