Use vertex_info struct for softpipe - lots of clean-up.

This commit is contained in:
Brian
2007-08-23 19:28:59 -06:00
parent d4883ee24c
commit 440e794b05
3 changed files with 53 additions and 64 deletions
+6 -18
View File
@@ -35,8 +35,11 @@
#include "pipe/p_context.h"
#include "pipe/p_defines.h"
#include "pipe/draw/draw_vertex.h"
#include "sp_quad.h"
struct softpipe_surface;
struct softpipe_winsys;
struct draw_context;
@@ -96,14 +99,6 @@ struct softpipe_context {
struct pipe_vertex_element vertex_element[PIPE_ATTRIB_MAX];
unsigned dirty;
/* Setup derived state. TODO: this should be passed in the program
* tokens as parameters to DECL instructions.
*
* For now we just set colors to CONST on flatshade, textures to
* perspective always and everything else to linear.
*/
enum interp_mode interp[PIPE_ATTRIB_MAX];
/*
* Mapped vertex buffers
*/
@@ -112,17 +107,10 @@ struct softpipe_context {
/** Mapped constant buffers */
void *mapped_constants[PIPE_SHADER_TYPES];
/* FS + setup derived state:
*/
/** Map fragment program attribute to quad/coef array slot */
unsigned fp_attr_to_slot[PIPE_ATTRIB_MAX];
/** Map vertex format attribute to a vertex attribute slot */
unsigned vf_attr_to_slot[PIPE_ATTRIB_MAX];
unsigned nr_attrs;
/** Vertex format */
struct vertex_info vertex_info;
unsigned attr_mask;
unsigned nr_frag_attrs; /**< number of active fragment attribs */
unsigned attr_mask; /**< bitfield of VF_ATTRIB_ indexes/bits */
boolean need_z; /**< produce quad/fragment Z values? */
boolean need_w; /**< produce quad/fragment W values? */
+2 -2
View File
@@ -459,7 +459,7 @@ static void tri_persp_coeff( struct setup_stage *setup,
*/
static void setup_tri_coefficients( struct setup_stage *setup )
{
const enum interp_mode *interp = setup->softpipe->interp;
const enum interp_mode *interp = setup->softpipe->vertex_info.interp_mode;
unsigned slot, j;
/* z and w are done by linear interpolation:
@@ -674,7 +674,7 @@ line_persp_coeff(struct setup_stage *setup, unsigned slot, unsigned i)
static INLINE void
setup_line_coefficients(struct setup_stage *setup, struct prim_header *prim)
{
const enum interp_mode *interp = setup->softpipe->interp;
const enum interp_mode *interp = setup->softpipe->vertex_info.interp_mode;
unsigned slot, j;
/* use setup->vmin, vmax to point to vertices */
+45 -44
View File
@@ -37,15 +37,18 @@
#define EMIT_ATTR( ATTR, FRAG_ATTR, INTERP ) \
do { \
slot_to_vf_attr[softpipe->nr_attrs] = ATTR; \
softpipe->vf_attr_to_slot[ATTR] = softpipe->nr_attrs; \
softpipe->fp_attr_to_slot[FRAG_ATTR] = softpipe->nr_attrs; \
softpipe->interp[softpipe->nr_attrs] = INTERP; \
softpipe->nr_attrs++; \
attr_mask |= (1 << (ATTR)); \
} while (0)
static void
emit_vertex_attr(struct vertex_info *vinfo, uint vfAttr, uint format,
uint interp)
{
const uint n = vinfo->num_attribs;
vinfo->attr_mask |= (1 << vfAttr);
vinfo->slot_to_attrib[n] = vfAttr;
vinfo->interp_mode[n] = interp;
vinfo->format[n] = format;
vinfo->num_attribs++;
}
/**
@@ -56,9 +59,12 @@ do { \
static void calculate_vertex_layout( struct softpipe_context *softpipe )
{
const unsigned inputsRead = softpipe->fs.inputs_read;
unsigned slot_to_vf_attr[TGSI_ATTRIB_MAX];
unsigned attr_mask = 0x0;
unsigned i;
const uint colorInterp
= softpipe->setup.flatshade ? INTERP_CONSTANT : INTERP_LINEAR;
struct vertex_info *vinfo = &softpipe->vertex_info;
uint i;
memset(vinfo, 0, sizeof(*vinfo));
/* Need Z if depth test is enabled or the fragment program uses the
* fragment position (XYZW).
@@ -77,39 +83,34 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
else
softpipe->need_w = FALSE;
softpipe->nr_attrs = 0;
memset(slot_to_vf_attr, 0, sizeof(slot_to_vf_attr));
memset(softpipe->fp_attr_to_slot, 0, sizeof(softpipe->fp_attr_to_slot));
memset(softpipe->vf_attr_to_slot, 0, sizeof(softpipe->vf_attr_to_slot));
/* TODO - Figure out if we need to do perspective divide, etc.
*/
EMIT_ATTR(TGSI_ATTRIB_POS, TGSI_ATTRIB_POS, INTERP_LINEAR);
/* Pull in the rest of the attributes. They are all in float4
* format. Future optimizations could be to keep some attributes
* as fixed point or ubyte format.
*/
for (i = 1; i < TGSI_ATTRIB_TEX0; i++) {
if (inputsRead & (1 << i)) {
if (softpipe->setup.flatshade
&& (i == TGSI_ATTRIB_COLOR0 || i == TGSI_ATTRIB_COLOR1))
EMIT_ATTR(i, i, INTERP_CONSTANT);
else
EMIT_ATTR(i, i, INTERP_LINEAR);
}
/* position */
/* TODO - Figure out if we need to do perspective divide, etc. */
emit_vertex_attr(vinfo, TGSI_ATTRIB_POS, FORMAT_4F, INTERP_LINEAR);
/* color0 */
if (inputsRead & (1 << TGSI_ATTRIB_COLOR0)) {
emit_vertex_attr(vinfo, TGSI_ATTRIB_COLOR0, FORMAT_4F, colorInterp);
}
for (i = TGSI_ATTRIB_TEX0; i < TGSI_ATTRIB_MAX; i++) {
/* color1 */
if (inputsRead & (1 << TGSI_ATTRIB_COLOR1)) {
emit_vertex_attr(vinfo, TGSI_ATTRIB_COLOR1, FORMAT_4F, colorInterp);
}
/* fog */
if (inputsRead & (1 << TGSI_ATTRIB_FOG)) {
emit_vertex_attr(vinfo, TGSI_ATTRIB_FOG, FORMAT_1F, INTERP_PERSPECTIVE);
}
/* texcoords and varying vars */
for (i = TGSI_ATTRIB_TEX0; i < TGSI_ATTRIB_VAR7; i++) {
if (inputsRead & (1 << i)) {
EMIT_ATTR(i, i, INTERP_PERSPECTIVE);
emit_vertex_attr(vinfo, i, FORMAT_4F, INTERP_PERSPECTIVE);
softpipe->need_w = TRUE;
}
}
softpipe->nr_frag_attrs = softpipe->nr_attrs;
softpipe->nr_frag_attrs = vinfo->num_attribs;
/* Additional attributes required for setup: Just twosided
* lighting. Edgeflag is dealt with specially by setting bits in
@@ -117,23 +118,23 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
*/
if (softpipe->setup.light_twoside) {
if (inputsRead & (1 << TGSI_ATTRIB_COLOR0)) {
EMIT_ATTR(TGSI_ATTRIB_BFC0, TGSI_ATTRIB_MAX, 0); /* XXX: mark as discarded after setup */
emit_vertex_attr(vinfo, TGSI_ATTRIB_BFC0, FORMAT_OMIT, INTERP_LINEAR);
}
if (inputsRead & (1 << TGSI_ATTRIB_COLOR1)) {
EMIT_ATTR(TGSI_ATTRIB_BFC1, TGSI_ATTRIB_MAX, 0); /* XXX: discard after setup */
emit_vertex_attr(vinfo, TGSI_ATTRIB_BFC1, FORMAT_OMIT, INTERP_LINEAR);
}
}
/* If the attributes have changed, tell the draw module about
* the new vertex layout.
*/
if (attr_mask != softpipe->attr_mask) {
softpipe->attr_mask = attr_mask;
if (vinfo->attr_mask != softpipe->attr_mask) {
softpipe->attr_mask = vinfo->attr_mask;
draw_set_vertex_attributes( softpipe->draw,
slot_to_vf_attr,
softpipe->nr_attrs );
vinfo->slot_to_attrib,
vinfo->num_attribs);
}
}