Add a quad_stage::begin() method to do per-primitive preparations (like setting up samplers).

This commit is contained in:
Brian
2007-08-08 11:37:00 -06:00
parent 8daa738cf9
commit f00179f9b4
3 changed files with 48 additions and 13 deletions

View File

@@ -1008,8 +1008,11 @@ setup_point(struct draw_stage *stage, struct prim_header *prim)
static void setup_begin( struct draw_stage *stage ) static void setup_begin( struct draw_stage *stage )
{ {
struct setup_stage *setup = setup_stage(stage); struct setup_stage *setup = setup_stage(stage);
struct softpipe_context *sp = setup->softpipe;
setup->quad.nr_attrs = setup->softpipe->nr_frag_attrs; setup->quad.nr_attrs = setup->softpipe->nr_frag_attrs;
sp->quad.first->begin(sp->quad.first);
} }

View File

@@ -41,6 +41,8 @@ struct quad_stage {
struct quad_stage *next; struct quad_stage *next;
void (*begin)(struct quad_stage *qs);
/** the stage action */ /** the stage action */
void (*run)(struct quad_stage *qs, struct quad_header *quad); void (*run)(struct quad_stage *qs, struct quad_header *quad);
}; };

View File

@@ -50,6 +50,23 @@
#define ALIGNED_ATTRIBS 0 #define ALIGNED_ATTRIBS 0
#endif #endif
struct quad_shade_stage
{
struct quad_stage stage;
struct tgsi_sampler samplers[PIPE_MAX_SAMPLERS];
};
/** cast wrapper */
static INLINE struct quad_shade_stage *
quad_shade_stage(struct quad_stage *qs)
{
return (struct quad_shade_stage *) qs;
}
struct exec_machine { struct exec_machine {
const struct setup_coefficient *coef; /**< will point to quad->coef */ const struct setup_coefficient *coef; /**< will point to quad->coef */
@@ -136,6 +153,7 @@ static INLINE void pinterp( struct exec_machine *exec,
static void static void
shade_quad( struct quad_stage *qs, struct quad_header *quad ) shade_quad( struct quad_stage *qs, struct quad_header *quad )
{ {
struct quad_shade_stage *qss = quad_shade_stage(qs);
struct softpipe_context *softpipe = qs->softpipe; struct softpipe_context *softpipe = qs->softpipe;
struct exec_machine exec; struct exec_machine exec;
const GLfloat fx = quad->x0; const GLfloat fx = quad->x0;
@@ -196,7 +214,6 @@ shade_quad( struct quad_stage *qs, struct quad_header *quad )
struct tgsi_exec_machine machine; struct tgsi_exec_machine machine;
struct tgsi_exec_vector outputs[FRAG_ATTRIB_MAX + 1]; struct tgsi_exec_vector outputs[FRAG_ATTRIB_MAX + 1];
struct tgsi_exec_vector *aoutputs; struct tgsi_exec_vector *aoutputs;
struct tgsi_sampler samplers[8];
GLuint i; GLuint i;
#if !ALIGNED_ATTRIBS #if !ALIGNED_ATTRIBS
@@ -208,18 +225,11 @@ shade_quad( struct quad_stage *qs, struct quad_header *quad )
memset(&machine, 0, sizeof(machine)); memset(&machine, 0, sizeof(machine));
#endif #endif
#if 11 /* temp sampler setup */
samplers[0].state = &softpipe->sampler[0];
samplers[0].texture = softpipe->texture[0];
samplers[0].get_sample = sp_get_sample;
samplers[0].pipe = &softpipe->pipe;
#endif
/* init machine state */ /* init machine state */
tgsi_exec_machine_init( tgsi_exec_machine_init(
&machine, &machine,
softpipe->fs.tokens, softpipe->fs.tokens,
8, samplers); PIPE_MAX_SAMPLERS, qss->samplers);
/* Consts does not require 16 byte alignment. */ /* Consts does not require 16 byte alignment. */
machine.Consts = softpipe->fs.constants->constant; machine.Consts = softpipe->fs.constants->constant;
@@ -299,13 +309,33 @@ shade_quad( struct quad_stage *qs, struct quad_header *quad )
} }
/**
* Per-primitive (or per-begin?) setup
*/
static void shade_begin(struct quad_stage *qs)
{
struct quad_shade_stage *qss = quad_shade_stage(qs);
struct softpipe_context *softpipe = qs->softpipe;
GLuint i;
for (i = 0; i < PIPE_MAX_SAMPLERS; i++) {
qss->samplers[i].state = &softpipe->sampler[i];
qss->samplers[i].texture = softpipe->texture[i];
qss->samplers[i].get_sample = sp_get_sample;
qss->samplers[i].pipe = &softpipe->pipe;
}
if (qs->next->begin)
qs->next->begin(qs->next);
}
struct quad_stage *sp_quad_shade_stage( struct softpipe_context *softpipe ) struct quad_stage *sp_quad_shade_stage( struct softpipe_context *softpipe )
{ {
struct quad_stage *stage = CALLOC_STRUCT(quad_stage); struct quad_shade_stage *stage = CALLOC_STRUCT(quad_shade_stage);
stage->softpipe = softpipe; stage->stage.softpipe = softpipe;
stage->run = shade_quad; stage->stage.begin = shade_begin;
stage->stage.run = shade_quad;
return stage; return &stage->stage;
} }