Use sse only if GALLIUM_SSE is defined

This commit is contained in:
Zack Rusin 2007-09-28 07:33:54 -04:00
parent 6dcfddb8e2
commit 57b5d36057
5 changed files with 26 additions and 8 deletions

View file

@ -41,6 +41,12 @@ struct draw_context *draw_create( void )
{
struct draw_context *draw = CALLOC_STRUCT( draw_context );
#if defined(__i386__) || defined(__386__)
draw->use_sse = getenv("GALLIUM_SSE") != NULL;
#else
draw->use_sse = false;
#endif
/* create pipeline stages */
draw->pipeline.unfilled = draw_unfilled_stage( draw );
draw->pipeline.twoside = draw_twoside_stage( draw );
@ -244,4 +250,9 @@ void draw_free_tmps( struct draw_stage *stage )
}
}
boolean draw_use_sse(struct draw_context *draw)
{
return draw->use_sse;
}

View file

@ -99,6 +99,7 @@ void draw_bind_vertex_shader(struct draw_context *draw,
void draw_delete_vertex_shader(struct draw_context *draw,
void *vcso);
boolean draw_use_sse(struct draw_context *draw);
void
draw_set_vertex_buffer(struct draw_context *draw,

View file

@ -220,6 +220,8 @@ struct draw_context
struct prim_header queue[PRIM_QUEUE_LENGTH];
unsigned queue_nr;
} pq;
int use_sse : 1;
};

View file

@ -220,10 +220,11 @@ draw_create_vertex_shader(struct draw_context *draw,
#if defined(__i386__) || defined(__386__)
x86_init_func(&vs->sse2_program);
tgsi_emit_sse2(shader->tokens, &vs->sse2_program);
((struct pipe_shader_state*)(vs->state))->executable =
x86_get_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);
}
#endif
return vs;

View file

@ -36,6 +36,7 @@
#include "pipe/p_context.h"
#include "pipe/p_defines.h"
#include "pipe/draw/draw_context.h"
#include "pipe/tgsi/mesa/mesa_to_tgsi.h"
#include "pipe/tgsi/exec/tgsi_core.h"
@ -391,11 +392,13 @@ st_translate_fragment_program(struct st_context *st,
tgsi_dump( tokensOut, 0/*TGSI_DUMP_VERBOSE*/ );
#if defined(__i386__) || defined(__386__)
if (stfp->sse2_program.csr == stfp->sse2_program.store)
tgsi_emit_sse2_fs( tokensOut, &stfp->sse2_program );
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 );
if (!cso->state.executable)
((struct cso_fragment_shader*)cso)->state.executable = (void *) x86_get_func( &stfp->sse2_program );
}
#endif
return cso;