Checkpoint: vertex attribute clean-up.
Remove/disable the attrib/slot mapping arrays in a few places. Work in progress...
This commit is contained in:
@@ -382,8 +382,10 @@ static void clip_begin( struct draw_stage *stage )
|
||||
{
|
||||
/* sanity checks. If these fail, review the clip/interp code! */
|
||||
assert(stage->draw->vertex_info.num_attribs >= 3);
|
||||
#if 0
|
||||
assert(stage->draw->vertex_info.slot_to_attrib[0] == TGSI_ATTRIB_VERTEX_HEADER);
|
||||
assert(stage->draw->vertex_info.slot_to_attrib[1] == TGSI_ATTRIB_CLIP_POS);
|
||||
#endif
|
||||
|
||||
stage->next->begin( stage->next );
|
||||
}
|
||||
|
@@ -78,7 +78,7 @@ feedback_vertex(struct draw_stage *stage, const struct vertex_header *vertex)
|
||||
* we can either address output buffer 0 (for interleaving) or
|
||||
* output buffer i (for non-interleaved).
|
||||
*/
|
||||
|
||||
#if 0
|
||||
for (i = 0; i < feedback->num_attribs; i++) {
|
||||
const uint attr = feedback->attrib[i];
|
||||
const uint slot = stage->draw->vertex_info.attrib_to_slot[attr];
|
||||
@@ -104,6 +104,7 @@ feedback_vertex(struct draw_stage *stage, const struct vertex_header *vertex)
|
||||
}
|
||||
fs->dest[i * select] += size;
|
||||
}
|
||||
#endif
|
||||
|
||||
fs->num_vert_emitted++;
|
||||
}
|
||||
|
@@ -62,7 +62,7 @@ struct vertex_header {
|
||||
};
|
||||
|
||||
/* XXX This is too large */
|
||||
#define MAX_VERTEX_SIZE ((2 + TGSI_ATTRIB_MAX) * 4 * sizeof(float))
|
||||
#define MAX_VERTEX_SIZE ((2 + PIPE_MAX_SHADER_OUTPUTS) * 4 * sizeof(float))
|
||||
|
||||
|
||||
|
||||
|
@@ -45,17 +45,10 @@
|
||||
|
||||
|
||||
static INLINE void
|
||||
emit_vertex_attr(struct vertex_info *vinfo, uint vfAttr,
|
||||
emit_vertex_attr(struct vertex_info *vinfo, /*uint vfAttr,*/
|
||||
attrib_format format, interp_mode interp)
|
||||
{
|
||||
const uint n = vinfo->num_attribs;
|
||||
vinfo->attr_mask |= (1 << vfAttr);
|
||||
vinfo->slot_to_attrib[n] = vfAttr;
|
||||
if (n >= 2) {
|
||||
/* the first two slots are the vertex header & clippos */
|
||||
assert(vfAttr < Elements(vinfo->attrib_to_slot));
|
||||
vinfo->attrib_to_slot[vfAttr] = n - 2;
|
||||
}
|
||||
vinfo->interp_mode[n] = interp;
|
||||
vinfo->format[n] = format;
|
||||
vinfo->num_attribs++;
|
||||
@@ -110,22 +103,24 @@ draw_set_vertex_attributes( struct draw_context *draw,
|
||||
struct vertex_info *vinfo = &draw->vertex_info;
|
||||
unsigned i;
|
||||
|
||||
#if 0
|
||||
assert(slot_to_vf_attr[0] == TGSI_ATTRIB_POS);
|
||||
#endif
|
||||
|
||||
memset(vinfo, 0, sizeof(*vinfo));
|
||||
|
||||
/*
|
||||
* First three attribs are always the same: header, clip pos, winpos
|
||||
*/
|
||||
emit_vertex_attr(vinfo, TGSI_ATTRIB_VERTEX_HEADER, FORMAT_1F, INTERP_NONE);
|
||||
emit_vertex_attr(vinfo, TGSI_ATTRIB_CLIP_POS, FORMAT_4F, INTERP_LINEAR);
|
||||
emit_vertex_attr(vinfo, TGSI_ATTRIB_POS, FORMAT_4F_VIEWPORT, INTERP_LINEAR);
|
||||
emit_vertex_attr(vinfo, /*TGSI_ATTRIB_VERTEX_HEADER,*/ FORMAT_1F, INTERP_NONE);
|
||||
emit_vertex_attr(vinfo, /*TGSI_ATTRIB_CLIP_POS,*/ FORMAT_4F, INTERP_LINEAR);
|
||||
emit_vertex_attr(vinfo, /*TGSI_ATTRIB_POS,*/ FORMAT_4F_VIEWPORT, INTERP_LINEAR);
|
||||
|
||||
/*
|
||||
* Remaining attribs (color, texcoords, etc)
|
||||
*/
|
||||
for (i = 1; i < nr_attrs; i++) {
|
||||
emit_vertex_attr(vinfo, slot_to_vf_attr[i], FORMAT_4F, interps[i]);
|
||||
emit_vertex_attr(vinfo, /*slot_to_vf_attr[i],*/ FORMAT_4F, interps[i]);
|
||||
}
|
||||
|
||||
draw_compute_vertex_size(vinfo);
|
||||
|
@@ -68,16 +68,15 @@ typedef enum {
|
||||
} interp_mode;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Information about post-transformed vertex layout.
|
||||
*/
|
||||
struct vertex_info
|
||||
{
|
||||
uint num_attribs;
|
||||
uint hwfmt[4]; /**< hardware format info for this format */
|
||||
uint attr_mask; /**< mask of VF_ATTR_ bits */
|
||||
uint slot_to_attrib[MAX_VERT_ATTRIBS];
|
||||
uint attrib_to_slot[TGSI_ATTRIB_MAX];
|
||||
interp_mode interp_mode[MAX_VERT_ATTRIBS];
|
||||
attrib_format format[MAX_VERT_ATTRIBS]; /**< FORMAT_x */
|
||||
interp_mode interp_mode[PIPE_MAX_SHADER_OUTPUTS];
|
||||
attrib_format format[PIPE_MAX_SHADER_OUTPUTS]; /**< FORMAT_x */
|
||||
uint size; /**< total vertex size in dwords */
|
||||
};
|
||||
|
||||
@@ -92,9 +91,10 @@ draw_emit_vertex_attr(struct vertex_info *vinfo, uint vfAttr,
|
||||
attrib_format format, interp_mode interp)
|
||||
{
|
||||
const uint n = vinfo->num_attribs;
|
||||
assert(n < MAX_VERT_ATTRIBS);
|
||||
assert(n < PIPE_MAX_SHADER_OUTPUTS);
|
||||
/*
|
||||
vinfo->attr_mask |= (1 << vfAttr);
|
||||
vinfo->slot_to_attrib[n] = vfAttr;
|
||||
*/
|
||||
vinfo->format[n] = format;
|
||||
vinfo->interp_mode[n] = interp;
|
||||
vinfo->num_attribs++;
|
||||
|
@@ -81,6 +81,9 @@ void draw_vertex_fetch( struct draw_context *draw,
|
||||
/* loop over vertices */
|
||||
for (j = 0; j < count; j++) {
|
||||
uint attr;
|
||||
|
||||
/*printf("fetch vertex %u: \n", j);*/
|
||||
|
||||
/* loop over vertex attributes (vertex shader inputs) */
|
||||
for (attr = 0; attr < draw->vertex_shader.num_inputs; attr++) {
|
||||
|
||||
@@ -94,6 +97,8 @@ void draw_vertex_fetch( struct draw_context *draw,
|
||||
|
||||
fetch_attrib4(src, draw->vertex_element[attr].src_format, p);
|
||||
|
||||
/*printf(" %u: %f %f %f %f\n", attr, p[0], p[1], p[2], p[3]);*/
|
||||
|
||||
machine->Inputs[attr].xyzw[0].f[j] = p[0]; /*X*/
|
||||
machine->Inputs[attr].xyzw[1].f[j] = p[1]; /*Y*/
|
||||
machine->Inputs[attr].xyzw[2].f[j] = p[2]; /*Z*/
|
||||
|
@@ -173,7 +173,7 @@ static void calculate_vertex_layout( struct i915_context *i915 )
|
||||
* vertex layout. We'll also update the hardware vertex format info.
|
||||
*/
|
||||
draw_set_vertex_attributes( i915->draw,
|
||||
vinfo->slot_to_attrib,
|
||||
NULL,/*vinfo->slot_to_attrib,*/
|
||||
vinfo->interp_mode,
|
||||
vinfo->num_attribs);
|
||||
|
||||
|
@@ -111,6 +111,7 @@ struct softpipe_context {
|
||||
unsigned nr_frag_attrs; /**< number of active fragment attribs */
|
||||
boolean need_z; /**< produce quad/fragment Z values? */
|
||||
boolean need_w; /**< produce quad/fragment W values? */
|
||||
int psize_slot;
|
||||
|
||||
/** Feedback buffers */
|
||||
struct pipe_feedback_buffer feedback_buffer[PIPE_MAX_FEEDBACK_ATTRIBS];
|
||||
|
@@ -79,8 +79,6 @@ struct setup_stage {
|
||||
|
||||
float oneoverarea;
|
||||
|
||||
const unsigned *lookup; /**< vertex attribute positions */
|
||||
|
||||
struct tgsi_interp_coef coef[TGSI_ATTRIB_MAX];
|
||||
struct quad_header quad;
|
||||
|
||||
@@ -249,7 +247,7 @@ static void print_vertex(const struct setup_stage *setup,
|
||||
{
|
||||
int i;
|
||||
printf("Vertex:\n");
|
||||
for (i = 0; i < setup->softpipe->nr_attrs; i++) {
|
||||
for (i = 0; i < setup->quad.nr_attrs; i++) {
|
||||
printf(" %d: %f %f %f\n", i,
|
||||
v->data[i][0], v->data[i][1], v->data[i][2]);
|
||||
}
|
||||
@@ -907,8 +905,7 @@ setup_point(struct draw_stage *stage, struct prim_header *prim)
|
||||
{
|
||||
struct setup_stage *setup = setup_stage( stage );
|
||||
const struct vertex_header *v0 = prim->v[0];
|
||||
|
||||
const int sizeAttr = setup->lookup[TGSI_ATTRIB_POINTSIZE];
|
||||
const int sizeAttr = setup->softpipe->psize_slot;
|
||||
const float halfSize
|
||||
= sizeAttr ? (0.5f * v0->data[sizeAttr][0])
|
||||
: (0.5f * setup->softpipe->rasterizer->point_size);
|
||||
@@ -917,6 +914,8 @@ setup_point(struct draw_stage *stage, struct prim_header *prim)
|
||||
const float y = v0->data[TGSI_ATTRIB_POS][1];
|
||||
unsigned slot, j;
|
||||
|
||||
assert(sizeAttr >= 0);
|
||||
|
||||
/* For points, all interpolants are constant-valued.
|
||||
* However, for point sprites, we'll need to setup texcoords appropriately.
|
||||
* XXX: which coefficients are the texcoords???
|
||||
@@ -1097,7 +1096,5 @@ struct draw_stage *sp_draw_render_stage( struct softpipe_context *softpipe )
|
||||
|
||||
setup->quad.coef = setup->coef;
|
||||
|
||||
setup->lookup = softpipe->draw->vertex_info.attrib_to_slot;
|
||||
|
||||
return &setup->stage;
|
||||
}
|
||||
|
@@ -59,6 +59,8 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
|
||||
softpipe->need_z = FALSE;
|
||||
softpipe->need_w = FALSE;
|
||||
|
||||
softpipe->psize_slot = -1;
|
||||
|
||||
/* always emit vertex pos */
|
||||
/* TODO - Figure out if we need to do perspective divide, etc. */
|
||||
draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_POS, FORMAT_4F, INTERP_LINEAR);
|
||||
@@ -93,6 +95,7 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
|
||||
FORMAT_4F, INTERP_CONSTANT);
|
||||
break;
|
||||
#endif
|
||||
softpipe->psize_slot = i;
|
||||
/*case TGSI_SEMANTIC_TEXCOORD:*/
|
||||
case TGSI_SEMANTIC_TEX0:
|
||||
draw_emit_vertex_attr(vinfo, TGSI_ATTRIB_TEX0,
|
||||
@@ -131,10 +134,10 @@ static void calculate_vertex_layout( struct softpipe_context *softpipe )
|
||||
*/
|
||||
/* XXX we also need to do this when the shading mode (interp modes) change: */
|
||||
if (1/*vinfo->attr_mask != softpipe->attr_mask*/) {
|
||||
softpipe->attr_mask = vinfo->attr_mask;
|
||||
/*softpipe->attr_mask = vinfo->attr_mask;*/
|
||||
|
||||
draw_set_vertex_attributes( softpipe->draw,
|
||||
vinfo->slot_to_attrib,
|
||||
NULL,/*vinfo->slot_to_attrib,*/
|
||||
vinfo->interp_mode,
|
||||
vinfo->num_attribs);
|
||||
|
||||
|
@@ -57,7 +57,6 @@ const struct cso_vertex_shader *
|
||||
st_translate_vertex_shader(struct st_context *st,
|
||||
struct st_vertex_program *stvp)
|
||||
{
|
||||
GLuint outputMapping[PIPE_MAX_SHADER_INPUTS];
|
||||
struct pipe_shader_state vs;
|
||||
const struct cso_vertex_shader *cso;
|
||||
GLuint i;
|
||||
@@ -83,6 +82,9 @@ st_translate_vertex_shader(struct st_context *st,
|
||||
case VERT_ATTRIB_COLOR1:
|
||||
vs.input_semantics[vs.num_inputs] = TGSI_SEMANTIC_COLOR1;
|
||||
break;
|
||||
case VERT_ATTRIB_TEX0:
|
||||
vs.input_semantics[vs.num_inputs] = TGSI_SEMANTIC_TEX0;
|
||||
break;
|
||||
default:
|
||||
vs.input_semantics[vs.num_inputs] = TGSI_SEMANTIC_OTHER;
|
||||
}
|
||||
@@ -95,11 +97,8 @@ st_translate_vertex_shader(struct st_context *st,
|
||||
*/
|
||||
for (i = 0; i < VERT_RESULT_MAX; i++) {
|
||||
if (stvp->Base.Base.OutputsWritten & (1 << i)) {
|
||||
#if 0
|
||||
stvp->output_to_index[i] = vs.num_outputs;
|
||||
stvp->index_to_output[vs.num_outputs] = i;
|
||||
#endif
|
||||
outputMapping[i] = vs.num_outputs;
|
||||
/* put this attrib in the next available slot */
|
||||
st->vertex_attrib_to_slot[i] = vs.num_outputs;
|
||||
|
||||
switch (i) {
|
||||
case VERT_RESULT_HPOS:
|
||||
@@ -129,11 +128,7 @@ st_translate_vertex_shader(struct st_context *st,
|
||||
*/
|
||||
tgsi_mesa_compile_vp_program( &stvp->Base,
|
||||
stvp->input_to_index,
|
||||
#if 0
|
||||
stvp->output_to_index,
|
||||
#else
|
||||
outputMapping,
|
||||
#endif
|
||||
st->vertex_attrib_to_slot,
|
||||
stvp->tokens, ST_FP_MAX_TOKENS );
|
||||
|
||||
#if 0
|
||||
@@ -195,6 +190,12 @@ static void update_vs( struct st_context *st )
|
||||
st->vp = stvp;
|
||||
st->state.vs = stvp->vs;
|
||||
|
||||
#if 0
|
||||
printf("###### bind vp tokens: %p %p num_inp=%u\n",
|
||||
stvp, stvp->tokens, stvp->vs->state.num_inputs);
|
||||
if (TGSI_DEBUG)
|
||||
tgsi_dump( stvp->tokens, 0 );
|
||||
#endif
|
||||
st->pipe->bind_vs_state(st->pipe, st->state.vs->data);
|
||||
}
|
||||
}
|
||||
|
@@ -491,7 +491,7 @@ clear_depth_buffer(GLcontext *ctx, struct gl_renderbuffer *rb)
|
||||
|
||||
assert(strb->surface->format);
|
||||
|
||||
#if 01
|
||||
#if 0
|
||||
if (ctx->Scissor.Enabled ||
|
||||
(isDS && ctx->DrawBuffer->Visual.stencilBits > 0)) {
|
||||
/* scissoring or we have a combined depth/stencil buffer */
|
||||
|
@@ -87,6 +87,7 @@ static void
|
||||
feedback_vertex(GLcontext *ctx, const struct draw_context *draw,
|
||||
const struct vertex_header *v)
|
||||
{
|
||||
const struct st_context *st = ctx->st;
|
||||
GLfloat win[4];
|
||||
const GLfloat *color, *texcoord;
|
||||
const GLfloat ci = 0;
|
||||
@@ -97,13 +98,18 @@ feedback_vertex(GLcontext *ctx, const struct draw_context *draw,
|
||||
win[2] = v->data[0][2];
|
||||
win[3] = 1.0F / v->data[0][3];
|
||||
|
||||
slot = draw->vertex_info.attrib_to_slot[TGSI_ATTRIB_COLOR0];
|
||||
/* XXX
|
||||
* When we compute vertex layout, save info about position of the
|
||||
* color and texcoord attribs to use here.
|
||||
*/
|
||||
|
||||
slot = st->vertex_attrib_to_slot[VERT_RESULT_COL0];
|
||||
if (slot)
|
||||
color = v->data[slot];
|
||||
else
|
||||
color = ctx->Current.Attrib[VERT_ATTRIB_COLOR0];
|
||||
|
||||
slot = draw->vertex_info.attrib_to_slot[TGSI_ATTRIB_TEX0];
|
||||
slot = st->vertex_attrib_to_slot[VERT_RESULT_TEX0];
|
||||
if (slot)
|
||||
texcoord = v->data[slot];
|
||||
else
|
||||
|
@@ -119,9 +119,17 @@ struct st_context
|
||||
|
||||
GLfloat polygon_offset_scale; /* ?? */
|
||||
|
||||
struct st_vertex_program *vp;
|
||||
struct st_fragment_program *fp;
|
||||
/** Mapping from VERT_ATTRIB_x to post-transformed vertex slot */
|
||||
GLuint vertex_attrib_to_slot[VERT_RESULT_MAX];
|
||||
|
||||
struct st_vertex_program *vp; /**< Currently bound vertex program */
|
||||
struct st_fragment_program *fp; /**< Currently bound fragment program */
|
||||
|
||||
/**
|
||||
* Buffer object which stores the ctx->Current.Attrib[] values.
|
||||
* Used for vertex array drawing when we we need an attribute for
|
||||
* which there's no enabled array.
|
||||
*/
|
||||
struct pipe_buffer_handle *default_attrib_buffer;
|
||||
|
||||
struct cso_cache *cache;
|
||||
|
@@ -71,11 +71,6 @@ struct st_vertex_program
|
||||
/** maps a TGSI input index back to a Mesa VERT_ATTRIB_x */
|
||||
GLuint index_to_input[MAX_VERTEX_PROGRAM_ATTRIBS];
|
||||
|
||||
#if 0
|
||||
GLuint output_to_index[MAX_VERTEX_PROGRAM_ATTRIBS];
|
||||
GLuint index_to_output[MAX_VERTEX_PROGRAM_ATTRIBS];
|
||||
#endif
|
||||
|
||||
/** The program in TGSI format */
|
||||
struct tgsi_token tokens[ST_FP_MAX_TOKENS];
|
||||
GLboolean dirty;
|
||||
|
Reference in New Issue
Block a user