void draw_set_setup_stage( struct draw_context *draw,
struct draw_stage *stage );
-void draw_set_vertex_attributes( struct draw_context *draw,
- const uint *attrs, const uint *interp_mode,
- unsigned nr_attrs );
-
-void draw_set_twoside_attributes(struct draw_context *draw,
- uint front0, uint back0,
- uint front1, uint back1);
-
-void draw_compute_vertex_size(struct vertex_info *vinfo);
-
unsigned draw_prim_info( unsigned prim, unsigned *first, unsigned *incr );
unsigned draw_trim( unsigned count, unsigned first, unsigned incr );
const struct vertex_header *src )
{
const uint num_attribs = stage->draw->vertex_info.num_attribs;
- const uint *interp_mode = stage->draw->vertex_info.interp_mode;
+ const interp_mode *interp = stage->draw->vertex_info.interp_mode;
uint i;
/* Look for constant/flat attribs and duplicate from src to dst vertex */
for (i = 1; i < num_attribs - 2; i++) {
- if (interp_mode[i + 2] == INTERP_CONSTANT) {
+ if (interp[i + 2] == INTERP_CONSTANT) {
copy_attr( i, dst, src );
}
}
static INLINE void
-emit_vertex_attr(struct vertex_info *vinfo, uint vfAttr, uint format,
- uint interp)
+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->interp_mode[n] = interp;
vinfo->format[n] = format;
vinfo->num_attribs++;
-
}
vinfo->size += 3;
break;
case FORMAT_4F:
+ case FORMAT_4F_VIEWPORT:
vinfo->size += 4;
break;
default:
void
draw_set_vertex_attributes( struct draw_context *draw,
const uint *slot_to_vf_attr,
- const uint *interp_mode,
+ const interp_mode *interps,
unsigned nr_attrs )
{
struct vertex_info *vinfo = &draw->vertex_info;
* Remaining attribs (color, texcoords, etc)
*/
for (i = 1; i < nr_attrs; i++) {
- emit_vertex_attr(vinfo, slot_to_vf_attr[i], FORMAT_4F, interp_mode[i]);
+ emit_vertex_attr(vinfo, slot_to_vf_attr[i], FORMAT_4F, interps[i]);
}
draw_compute_vertex_size(vinfo);
#define MAX_VERT_ATTRIBS 12 /* OK? */
-#define FORMAT_OMIT 0
-#define FORMAT_1F 1
-#define FORMAT_2F 2
-#define FORMAT_3F 3
-#define FORMAT_4F 4
-#define FORMAT_4F_VIEWPORT 4
-#define FORMAT_4UB 5
+
+struct draw_context;
+
+
+
+/**
+ * Vertex attribute format
+ */
+typedef enum {
+ FORMAT_OMIT,
+ FORMAT_1F,
+ FORMAT_2F,
+ FORMAT_3F,
+ FORMAT_4F,
+ FORMAT_4F_VIEWPORT,
+ FORMAT_4UB
+} attrib_format;
-enum interp_mode {
+/**
+ * Attribute interpolation mode
+ */
+typedef enum {
INTERP_NONE, /**< never interpolate vertex header info */
INTERP_CONSTANT,
INTERP_LINEAR,
INTERP_PERSPECTIVE
-};
+} interp_mode;
uint attr_mask; /**< mask of VF_ATTR_ bits */
uint slot_to_attrib[MAX_VERT_ATTRIBS];
uint attrib_to_slot[TGSI_ATTRIB_MAX];
- uint interp_mode[MAX_VERT_ATTRIBS];
- uint format[MAX_VERT_ATTRIBS]; /**< FORMAT_x */
+ interp_mode interp_mode[MAX_VERT_ATTRIBS];
+ attrib_format format[MAX_VERT_ATTRIBS]; /**< FORMAT_x */
uint size; /**< total vertex size in dwords */
};
* \return slot in which the attribute was added
*/
static INLINE uint
-draw_emit_vertex_attr(struct vertex_info *vinfo, uint vfAttr, uint format,
- uint interp)
+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);
vinfo->attr_mask |= (1 << vfAttr);
vinfo->slot_to_attrib[n] = vfAttr;
vinfo->format[n] = format;
}
+extern void draw_set_vertex_attributes( struct draw_context *draw,
+ const uint *attrs,
+ const interp_mode *interps,
+ unsigned nr_attrs );
+
+extern void draw_set_twoside_attributes(struct draw_context *draw,
+ uint front0, uint back0,
+ uint front1, uint back1);
+
+extern void draw_compute_vertex_size(struct vertex_info *vinfo);
-struct draw_context;
extern int draw_vertex_cache_check_space( struct draw_context *draw,
unsigned nr_verts );
*/
static void calculate_vertex_layout( struct i915_context *i915 )
{
- const unsigned inputsRead = i915->fs.inputs_read;
- const uint colorInterp
+ const uint inputsRead = i915->fs.inputs_read;
+ const interp_mode colorInterp
= i915->setup.flatshade ? INTERP_CONSTANT : INTERP_LINEAR;
struct vertex_info *vinfo = &i915->current.vertex_info;
uint front0 = 0, back0 = 0, front1 = 0, back1 = 0;
#include "sp_quad.h"
#include "sp_prim_setup.h"
#include "pipe/draw/draw_private.h"
+#include "pipe/draw/draw_vertex.h"
#include "pipe/p_util.h"
-#include "pipe/draw/draw_vertex.h"
/**
*/
static void setup_tri_coefficients( struct setup_stage *setup )
{
- const enum interp_mode *interp = setup->softpipe->vertex_info.interp_mode;
+ const interp_mode *interp = setup->softpipe->vertex_info.interp_mode;
unsigned slot, j;
/* z and w are done by linear interpolation:
static INLINE void
setup_line_coefficients(struct setup_stage *setup, struct prim_header *prim)
{
- const enum interp_mode *interp = setup->softpipe->vertex_info.interp_mode;
+ const interp_mode *interp = setup->softpipe->vertex_info.interp_mode;
unsigned slot, j;
/* use setup->vmin, vmax to point to vertices */
*/
static void calculate_vertex_layout( struct softpipe_context *softpipe )
{
- const unsigned inputsRead = softpipe->fs.inputs_read;
- const uint colorInterp
+ const uint inputsRead = softpipe->fs.inputs_read;
+ const interp_mode colorInterp
= softpipe->setup.flatshade ? INTERP_CONSTANT : INTERP_LINEAR;
struct vertex_info *vinfo = &softpipe->vertex_info;
uint front0 = 0, back0 = 0, front1 = 0, back1 = 0;