for (i = 0; i < vinfo->num_attribs; i++) {
uint j = vinfo->src_index[i];
- switch (vinfo->format[i]) {
- case FORMAT_OMIT:
+ switch (vinfo->emit[i]) {
+ case EMIT_OMIT:
/* no-op */
break;
- case FORMAT_HEADER:
- memcpy(vbuf->vertex_ptr, vertex, sizeof(*vertex));
- vbuf->vertex_ptr += sizeof(*vertex) / 4;
- count += sizeof(*vertex) / 4;
- break;
- case FORMAT_1F:
+ case EMIT_ALL:
+ /* just copy the whole vertex as-is to the vbuf */
+ assert(i == 0);
+ memcpy(vbuf->vertex_ptr, vertex, vinfo->size * 4);
+ vbuf->vertex_ptr += vinfo->size;
+ return;
+ case EMIT_1F:
*vbuf->vertex_ptr++ = fui(vertex->data[j][0]);
count++;
break;
- case FORMAT_1F_PSIZE:
+ case EMIT_1F_PSIZE:
*vbuf->vertex_ptr++ = fui(vbuf->stage.draw->rasterizer->point_size);
count++;
break;
- case FORMAT_2F:
+ case EMIT_2F:
*vbuf->vertex_ptr++ = fui(vertex->data[j][0]);
*vbuf->vertex_ptr++ = fui(vertex->data[j][1]);
count += 2;
break;
- case FORMAT_3F:
+ case EMIT_3F:
*vbuf->vertex_ptr++ = fui(vertex->data[j][0]);
*vbuf->vertex_ptr++ = fui(vertex->data[j][1]);
*vbuf->vertex_ptr++ = fui(vertex->data[j][2]);
count += 3;
break;
- case FORMAT_4F:
+ case EMIT_4F:
*vbuf->vertex_ptr++ = fui(vertex->data[j][0]);
*vbuf->vertex_ptr++ = fui(vertex->data[j][1]);
*vbuf->vertex_ptr++ = fui(vertex->data[j][2]);
*vbuf->vertex_ptr++ = fui(vertex->data[j][3]);
count += 4;
break;
- case FORMAT_4UB:
+ case EMIT_4UB:
*vbuf->vertex_ptr++ = pack_ub4(float_to_ubyte( vertex->data[j][2] ),
float_to_ubyte( vertex->data[j][1] ),
float_to_ubyte( vertex->data[j][0] ),
vinfo->size = 0;
for (i = 0; i < vinfo->num_attribs; i++) {
- switch (vinfo->format[i]) {
- case FORMAT_OMIT:
+ switch (vinfo->emit[i]) {
+ case EMIT_OMIT:
break;
- case FORMAT_HEADER:
- vinfo->size += sizeof(struct vertex_header) / 4;
- break;
- case FORMAT_4UB:
+ case EMIT_4UB:
/* fall-through */
- case FORMAT_1F_PSIZE:
+ case EMIT_1F_PSIZE:
/* fall-through */
- case FORMAT_1F:
+ case EMIT_1F:
vinfo->size += 1;
break;
- case FORMAT_2F:
+ case EMIT_2F:
vinfo->size += 2;
break;
- case FORMAT_3F:
+ case EMIT_3F:
vinfo->size += 3;
break;
- case FORMAT_4F:
+ case EMIT_4F:
vinfo->size += 4;
break;
+ case EMIT_ALL:
+ /* fall-through */
default:
assert(0);
}
/**
- * Vertex attribute format
- * XXX rename to "EMIT"
+ * Vertex attribute emit modes
*/
-enum attrib_format {
- FORMAT_OMIT, /**< don't emit the attribute */
- FORMAT_HEADER, /**< The 5-byte vertex header */
- FORMAT_1F,
- FORMAT_1F_PSIZE, /**< insert constant point size */
- FORMAT_2F,
- FORMAT_3F,
- FORMAT_4F,
- FORMAT_4UB /**< XXX may need variations for RGBA vs BGRA, etc */
+enum attrib_emit {
+ EMIT_OMIT, /**< don't emit the attribute */
+ EMIT_ALL, /**< emit whole post-xform vertex, w/ header */
+ EMIT_1F,
+ EMIT_1F_PSIZE, /**< insert constant point size */
+ EMIT_2F,
+ EMIT_3F,
+ EMIT_4F,
+ EMIT_4UB /**< XXX may need variations for RGBA vs BGRA, etc */
};
uint num_attribs;
uint hwfmt[4]; /**< hardware format info for this format */
enum interp_mode interp_mode[PIPE_MAX_SHADER_OUTPUTS];
- enum attrib_format format[PIPE_MAX_SHADER_OUTPUTS]; /**< FORMAT_x */
+ enum attrib_emit emit[PIPE_MAX_SHADER_OUTPUTS]; /**< EMIT_x */
uint src_index[PIPE_MAX_SHADER_OUTPUTS]; /**< map to post-xform attribs */
uint size; /**< total vertex size in dwords */
};
*/
static INLINE uint
draw_emit_vertex_attr(struct vertex_info *vinfo,
- enum attrib_format format, enum interp_mode interp,
+ enum attrib_emit emit, enum interp_mode interp,
uint src_index)
{
const uint n = vinfo->num_attribs;
assert(n < PIPE_MAX_SHADER_OUTPUTS);
- vinfo->format[n] = format;
+ vinfo->emit[n] = emit;
vinfo->interp_mode[n] = interp;
vinfo->src_index[n] = src_index;
vinfo->num_attribs++;
uint count = 0; /* for debug/sanity */
for (i = 0; i < vinfo->num_attribs; i++) {
- switch (vinfo->format[i]) {
- case FORMAT_OMIT:
+ switch (vinfo->emit[i]) {
+ case EMIT_OMIT:
/* no-op */
break;
- case FORMAT_1F:
+ case EMIT_1F:
OUT_BATCH( fui(vertex->data[i][0]) );
count++;
break;
- case FORMAT_2F:
+ case EMIT_2F:
OUT_BATCH( fui(vertex->data[i][0]) );
OUT_BATCH( fui(vertex->data[i][1]) );
count += 2;
break;
- case FORMAT_3F:
+ case EMIT_3F:
OUT_BATCH( fui(vertex->data[i][0]) );
OUT_BATCH( fui(vertex->data[i][1]) );
OUT_BATCH( fui(vertex->data[i][2]) );
count += 3;
break;
- case FORMAT_4F:
+ case EMIT_4F:
OUT_BATCH( fui(vertex->data[i][0]) );
OUT_BATCH( fui(vertex->data[i][1]) );
OUT_BATCH( fui(vertex->data[i][2]) );
OUT_BATCH( fui(vertex->data[i][3]) );
count += 4;
break;
- case FORMAT_4UB:
+ case EMIT_4UB:
OUT_BATCH( pack_ub4(float_to_ubyte( vertex->data[i][2] ),
float_to_ubyte( vertex->data[i][1] ),
float_to_ubyte( vertex->data[i][0] ),
memset(&vinfo, 0, sizeof(vinfo));
/* pos */
- draw_emit_vertex_attr(&vinfo, FORMAT_3F, INTERP_LINEAR, src++);
+ draw_emit_vertex_attr(&vinfo, EMIT_3F, INTERP_LINEAR, src++);
/* Note: we'll set the S4_VFMT_XYZ[W] bits below */
for (i = 0; i < fs->num_inputs; i++) {
break;
case TGSI_SEMANTIC_COLOR:
if (fs->input_semantic_index[i] == 0) {
- front0 = draw_emit_vertex_attr(&vinfo, FORMAT_4UB, colorInterp, src++);
+ front0 = draw_emit_vertex_attr(&vinfo, EMIT_4UB, colorInterp, src++);
vinfo.hwfmt[0] |= S4_VFMT_COLOR;
}
else {
assert(fs->input_semantic_index[i] == 1);
- front1 = draw_emit_vertex_attr(&vinfo, FORMAT_4UB, colorInterp, src++);
+ front1 = draw_emit_vertex_attr(&vinfo, EMIT_4UB, colorInterp, src++);
vinfo.hwfmt[0] |= S4_VFMT_SPEC_FOG;
}
break;
const uint unit = fs->input_semantic_index[i];
uint hwtc;
texCoords[unit] = TRUE;
- draw_emit_vertex_attr(&vinfo, FORMAT_4F, INTERP_PERSPECTIVE, src++);
+ draw_emit_vertex_attr(&vinfo, EMIT_4F, INTERP_PERSPECTIVE, src++);
hwtc = TEXCOORDFMT_4D;
needW = TRUE;
vinfo.hwfmt[1] |= hwtc << (unit * 4);
break;
case TGSI_SEMANTIC_FOG:
fprintf(stderr, "i915 fogcoord not implemented yet\n");
- draw_emit_vertex_attr(&vinfo, FORMAT_1F, INTERP_PERSPECTIVE, src++);
+ draw_emit_vertex_attr(&vinfo, EMIT_1F, INTERP_PERSPECTIVE, src++);
break;
default:
assert(0);
/* go back and fill in the vertex position info now that we have needW */
if (needW) {
vinfo.hwfmt[0] |= S4_VFMT_XYZW;
- vinfo.format[0] = FORMAT_4F;
+ vinfo.emit[0] = EMIT_4F;
}
else {
vinfo.hwfmt[0] |= S4_VFMT_XYZ;
- vinfo.format[0] = FORMAT_3F;
+ vinfo.emit[0] = EMIT_3F;
}
/* Additional attributes required for setup: Just twosided
*/
if (i915->rasterizer->light_twoside) {
if (front0) {
- back0 = draw_emit_vertex_attr(&vinfo, FORMAT_OMIT, colorInterp, src++);
+ back0 = draw_emit_vertex_attr(&vinfo, EMIT_OMIT, colorInterp, src++);
}
if (back0) {
- back1 = draw_emit_vertex_attr(&vinfo, FORMAT_OMIT, colorInterp, src++);
+ back1 = draw_emit_vertex_attr(&vinfo, EMIT_OMIT, colorInterp, src++);
}
}
#include "pipe/p_shader_tokens.h"
#include "pipe/draw/draw_context.h"
#include "pipe/draw/draw_vertex.h"
+#include "pipe/draw/draw_private.h"
#include "sp_context.h"
#include "sp_state.h"
const enum interp_mode colorInterp
= softpipe->rasterizer->flatshade ? INTERP_CONSTANT : INTERP_LINEAR;
struct vertex_info *vinfo = &softpipe->vertex_info;
- struct vertex_info *vinfo_vbuf = &softpipe->vertex_info_vbuf;
uint i;
- int src;
if (softpipe->vbuf) {
/* if using the post-transform vertex buffer, tell draw_vbuf to
* simply emit the whole post-xform vertex as-is:
*/
+ struct vertex_info *vinfo_vbuf = &softpipe->vertex_info_vbuf;
vinfo_vbuf->num_attribs = 0;
- draw_emit_vertex_attr(vinfo_vbuf, FORMAT_HEADER, INTERP_NONE, 0);
- for (i = 0; i < vs->num_outputs; i++) {
- draw_emit_vertex_attr(vinfo_vbuf, FORMAT_4F, INTERP_NONE, i);
- }
- draw_compute_vertex_size(vinfo_vbuf);
+ draw_emit_vertex_attr(vinfo_vbuf, EMIT_ALL, INTERP_NONE, 0);
+ vinfo_vbuf->size = 4 * vs->num_outputs + sizeof(struct vertex_header)/4;
}
/*
*/
vinfo->num_attribs = 0;
for (i = 0; i < fs->num_inputs; i++) {
+ int src;
switch (fs->input_semantic_name[i]) {
case TGSI_SEMANTIC_POSITION:
src = find_vs_output(vs, TGSI_SEMANTIC_POSITION, 0);
assert(src >= 0);
- draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_POS, src);
+ draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_POS, src);
break;
case TGSI_SEMANTIC_COLOR:
src = find_vs_output(vs, TGSI_SEMANTIC_COLOR,
fs->input_semantic_index[i]);
assert(src >= 0);
- draw_emit_vertex_attr(vinfo, FORMAT_4F, colorInterp, src);
+ draw_emit_vertex_attr(vinfo, EMIT_4F, colorInterp, src);
break;
case TGSI_SEMANTIC_FOG:
src = 0;
#endif
assert(src >= 0);
- draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_PERSPECTIVE, src);
+ draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_PERSPECTIVE, src);
break;
case TGSI_SEMANTIC_GENERIC:
src = find_vs_output(vs, TGSI_SEMANTIC_GENERIC,
fs->input_semantic_index[i]);
assert(src >= 0);
- draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_PERSPECTIVE, src);
+ draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_PERSPECTIVE, src);
break;
default:
softpipe->psize_slot = find_vs_output(vs, TGSI_SEMANTIC_PSIZE, 0);
if (softpipe->psize_slot >= 0) {
- draw_emit_vertex_attr(vinfo, FORMAT_4F, INTERP_CONSTANT,
+ draw_emit_vertex_attr(vinfo, EMIT_4F, INTERP_CONSTANT,
softpipe->psize_slot);
}