mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-03-05 03:40:28 +01:00
llvmpipe: asst. clean-ups in lp_setup_vbuf.c
Signed-off-by: Brian Paul <brianp@vmware.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/19289>
This commit is contained in:
parent
6ef3881010
commit
e72c735cde
1 changed files with 224 additions and 230 deletions
|
|
@ -53,7 +53,7 @@
|
|||
|
||||
#define LP_MAX_VBUF_SIZE 4096
|
||||
|
||||
|
||||
|
||||
|
||||
/** cast wrapper */
|
||||
static struct lp_setup_context *
|
||||
|
|
@ -93,16 +93,18 @@ lp_setup_allocate_vertices(struct vbuf_render *vbr,
|
|||
|
||||
setup->vertex_size = vertex_size;
|
||||
setup->nr_vertices = nr_vertices;
|
||||
|
||||
|
||||
return setup->vertex_buffer != NULL;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
lp_setup_release_vertices(struct vbuf_render *vbr)
|
||||
{
|
||||
/* keep the old allocation for next time */
|
||||
}
|
||||
|
||||
|
||||
static void *
|
||||
lp_setup_map_vertices(struct vbuf_render *vbr)
|
||||
{
|
||||
|
|
@ -110,13 +112,14 @@ lp_setup_map_vertices(struct vbuf_render *vbr)
|
|||
return setup->vertex_buffer;
|
||||
}
|
||||
|
||||
static void
|
||||
lp_setup_unmap_vertices(struct vbuf_render *vbr,
|
||||
ushort min_index,
|
||||
ushort max_index )
|
||||
|
||||
static void
|
||||
lp_setup_unmap_vertices(struct vbuf_render *vbr,
|
||||
ushort min_index,
|
||||
ushort max_index)
|
||||
{
|
||||
ASSERTED struct lp_setup_context *setup = lp_setup_context(vbr);
|
||||
assert( setup->vertex_buffer_size >= (max_index+1) * setup->vertex_size );
|
||||
assert(setup->vertex_buffer_size >= (max_index+1) * setup->vertex_size);
|
||||
/* do nothing */
|
||||
}
|
||||
|
||||
|
|
@ -127,21 +130,24 @@ lp_setup_set_primitive(struct vbuf_render *vbr, enum pipe_prim_type prim)
|
|||
lp_setup_context(vbr)->prim = prim;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
lp_setup_set_view_index(struct vbuf_render *vbr, unsigned view_index)
|
||||
{
|
||||
lp_setup_context(vbr)->view_index = view_index;
|
||||
}
|
||||
|
||||
|
||||
typedef const float (*const_float4_ptr)[4];
|
||||
|
||||
static inline const_float4_ptr get_vert( const void *vertex_buffer,
|
||||
int index,
|
||||
int stride )
|
||||
|
||||
static inline const_float4_ptr
|
||||
get_vert(const void *vertex_buffer, int index, int stride)
|
||||
{
|
||||
return (const_float4_ptr)((char *)vertex_buffer + index * stride);
|
||||
}
|
||||
|
||||
|
||||
static inline void
|
||||
rect(struct lp_setup_context *setup,
|
||||
const float (*v0)[4],
|
||||
|
|
@ -152,12 +158,13 @@ rect(struct lp_setup_context *setup,
|
|||
const float (*v5)[4])
|
||||
{
|
||||
if (!setup->permit_linear_rasterizer ||
|
||||
!setup->rect( setup, v0, v1, v2, v3, v4, v5)) {
|
||||
!setup->rect(setup, v0, v1, v2, v3, v4, v5)) {
|
||||
setup->triangle(setup, v0, v1, v2);
|
||||
setup->triangle(setup, v3, v4, v5);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* draw elements / indexed primitives
|
||||
*/
|
||||
|
|
@ -168,7 +175,6 @@ lp_setup_draw_elements(struct vbuf_render *vbr, const ushort *indices, uint nr)
|
|||
const unsigned stride = setup->vertex_info->size * sizeof(float);
|
||||
const void *vertex_buffer = setup->vertex_buffer;
|
||||
const boolean flatshade_first = setup->flatshade_first;
|
||||
boolean uses_constant_interp;
|
||||
unsigned i;
|
||||
|
||||
assert(setup->setup.variant);
|
||||
|
|
@ -176,63 +182,63 @@ lp_setup_draw_elements(struct vbuf_render *vbr, const ushort *indices, uint nr)
|
|||
if (!lp_setup_update_state(setup, TRUE))
|
||||
return;
|
||||
|
||||
uses_constant_interp = setup->setup.variant->key.uses_constant_interp;
|
||||
const bool uses_constant_interp =
|
||||
setup->setup.variant->key.uses_constant_interp;
|
||||
|
||||
switch (setup->prim) {
|
||||
case PIPE_PRIM_POINTS:
|
||||
for (i = 0; i < nr; i++) {
|
||||
setup->point( setup,
|
||||
get_vert(vertex_buffer, indices[i-0], stride) );
|
||||
setup->point(setup,
|
||||
get_vert(vertex_buffer, indices[i-0], stride));
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_LINES:
|
||||
for (i = 1; i < nr; i += 2) {
|
||||
setup->line( setup,
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride) );
|
||||
setup->line(setup,
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride));
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_LINE_STRIP:
|
||||
for (i = 1; i < nr; i ++) {
|
||||
setup->line( setup,
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride) );
|
||||
setup->line(setup,
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride));
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_LINE_LOOP:
|
||||
for (i = 1; i < nr; i ++) {
|
||||
setup->line( setup,
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride) );
|
||||
setup->line(setup,
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride));
|
||||
}
|
||||
if (nr) {
|
||||
setup->line( setup,
|
||||
get_vert(vertex_buffer, indices[nr-1], stride),
|
||||
get_vert(vertex_buffer, indices[0], stride) );
|
||||
setup->line(setup,
|
||||
get_vert(vertex_buffer, indices[nr-1], stride),
|
||||
get_vert(vertex_buffer, indices[0], stride));
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_TRIANGLES:
|
||||
if (nr % 6 == 0 && !uses_constant_interp) {
|
||||
for (i = 5; i < nr; i += 6) {
|
||||
rect( setup,
|
||||
get_vert(vertex_buffer, indices[i-5], stride),
|
||||
get_vert(vertex_buffer, indices[i-4], stride),
|
||||
get_vert(vertex_buffer, indices[i-3], stride),
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride) );
|
||||
rect(setup,
|
||||
get_vert(vertex_buffer, indices[i-5], stride),
|
||||
get_vert(vertex_buffer, indices[i-4], stride),
|
||||
get_vert(vertex_buffer, indices[i-3], stride),
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride));
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
for (i = 2; i < nr; i += 3) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -241,20 +247,19 @@ lp_setup_draw_elements(struct vbuf_render *vbr, const ushort *indices, uint nr)
|
|||
if (flatshade_first) {
|
||||
for (i = 2; i < nr; i += 1) {
|
||||
/* emit first triangle vertex as first triangle vertex */
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i+(i&1)-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-(i&1)], stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i+(i&1)-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-(i&1)], stride));
|
||||
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
for (i = 2; i < nr; i += 1) {
|
||||
/* emit last triangle vertex as last triangle vertex */
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[i+(i&1)-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-(i&1)-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[i+(i&1)-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-(i&1)-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -263,81 +268,78 @@ lp_setup_draw_elements(struct vbuf_render *vbr, const ushort *indices, uint nr)
|
|||
if (flatshade_first) {
|
||||
for (i = 2; i < nr; i += 1) {
|
||||
/* emit first non-spoke vertex as first vertex */
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride),
|
||||
get_vert(vertex_buffer, indices[0], stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride),
|
||||
get_vert(vertex_buffer, indices[0], stride));
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
for (i = 2; i < nr; i += 1) {
|
||||
/* emit last non-spoke vertex as last vertex */
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[0], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[0], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_QUADS:
|
||||
/* GL quads don't follow provoking vertex convention */
|
||||
if (flatshade_first) {
|
||||
if (flatshade_first) {
|
||||
/* emit last quad vertex as first triangle vertex */
|
||||
for (i = 3; i < nr; i += 4) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[i-0], stride),
|
||||
get_vert(vertex_buffer, indices[i-3], stride),
|
||||
get_vert(vertex_buffer, indices[i-2], stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[i-0], stride),
|
||||
get_vert(vertex_buffer, indices[i-3], stride),
|
||||
get_vert(vertex_buffer, indices[i-2], stride));
|
||||
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[i-0], stride),
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[i-0], stride),
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride));
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
/* emit last quad vertex as last triangle vertex */
|
||||
for (i = 3; i < nr; i += 4) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[i-3], stride),
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[i-3], stride),
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride));
|
||||
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_QUAD_STRIP:
|
||||
/* GL quad strips don't follow provoking vertex convention */
|
||||
if (flatshade_first) {
|
||||
if (flatshade_first) {
|
||||
/* emit last quad vertex as first triangle vertex */
|
||||
for (i = 3; i < nr; i += 2) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[i-0], stride),
|
||||
get_vert(vertex_buffer, indices[i-3], stride),
|
||||
get_vert(vertex_buffer, indices[i-2], stride) );
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[i-0], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-3], stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[i-0], stride),
|
||||
get_vert(vertex_buffer, indices[i-3], stride),
|
||||
get_vert(vertex_buffer, indices[i-2], stride));
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[i-0], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-3], stride));
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
/* emit last quad vertex as last triangle vertex */
|
||||
for (i = 3; i < nr; i += 2) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[i-3], stride),
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride) );
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-3], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[i-3], stride),
|
||||
get_vert(vertex_buffer, indices[i-2], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride));
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-3], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -346,22 +348,21 @@ lp_setup_draw_elements(struct vbuf_render *vbr, const ushort *indices, uint nr)
|
|||
/* Almost same as tri fan but the _first_ vertex specifies the flat
|
||||
* shading color.
|
||||
*/
|
||||
if (flatshade_first) {
|
||||
if (flatshade_first) {
|
||||
/* emit first polygon vertex as first triangle vertex */
|
||||
for (i = 2; i < nr; i += 1) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[0], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[0], stride),
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride));
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
/* emit first polygon vertex as last triangle vertex */
|
||||
for (i = 2; i < nr; i += 1) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride),
|
||||
get_vert(vertex_buffer, indices[0], stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, indices[i-1], stride),
|
||||
get_vert(vertex_buffer, indices[i-0], stride),
|
||||
get_vert(vertex_buffer, indices[0], stride));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -384,75 +385,73 @@ lp_setup_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)
|
|||
const void *vertex_buffer =
|
||||
(void *) get_vert(setup->vertex_buffer, start, stride);
|
||||
const boolean flatshade_first = setup->flatshade_first;
|
||||
boolean uses_constant_interp;
|
||||
unsigned i;
|
||||
|
||||
if (!lp_setup_update_state(setup, TRUE))
|
||||
return;
|
||||
|
||||
uses_constant_interp = setup->setup.variant->key.uses_constant_interp;
|
||||
const bool uses_constant_interp =
|
||||
setup->setup.variant->key.uses_constant_interp;
|
||||
|
||||
switch (setup->prim) {
|
||||
case PIPE_PRIM_POINTS:
|
||||
for (i = 0; i < nr; i++) {
|
||||
setup->point( setup,
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
setup->point(setup,
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_LINES:
|
||||
for (i = 1; i < nr; i += 2) {
|
||||
setup->line( setup,
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
setup->line(setup,
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_LINE_STRIP:
|
||||
for (i = 1; i < nr; i ++) {
|
||||
setup->line( setup,
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
setup->line(setup,
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_LINE_LOOP:
|
||||
for (i = 1; i < nr; i ++) {
|
||||
setup->line( setup,
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
setup->line(setup,
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
}
|
||||
if (nr) {
|
||||
setup->line( setup,
|
||||
get_vert(vertex_buffer, nr-1, stride),
|
||||
get_vert(vertex_buffer, 0, stride) );
|
||||
setup->line(setup,
|
||||
get_vert(vertex_buffer, nr-1, stride),
|
||||
get_vert(vertex_buffer, 0, stride));
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_TRIANGLES:
|
||||
if (nr % 6 == 0 && !uses_constant_interp) {
|
||||
for (i = 5; i < nr; i += 6) {
|
||||
rect( setup,
|
||||
get_vert(vertex_buffer, i-5, stride),
|
||||
get_vert(vertex_buffer, i-4, stride),
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
rect(setup,
|
||||
get_vert(vertex_buffer, i-5, stride),
|
||||
get_vert(vertex_buffer, i-4, stride),
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
}
|
||||
}
|
||||
else if (!uses_constant_interp &&
|
||||
} else if (!uses_constant_interp &&
|
||||
lp_setup_analyse_triangles(setup, vertex_buffer, stride, nr)) {
|
||||
/* If lp_setup_analyse_triangles() returned true, it also
|
||||
* emitted (setup) the rect or triangles.
|
||||
*/
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
for (i = 2; i < nr; i += 3) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -484,101 +483,95 @@ lp_setup_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)
|
|||
}
|
||||
if (i < nr) {
|
||||
/* emit last triangle */
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i+(i&1)-1, stride),
|
||||
get_vert(vertex_buffer, i-(i&1), stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i+(i&1)-1, stride),
|
||||
get_vert(vertex_buffer, i-(i&1), stride));
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
for (i = 2; i < nr; i++) {
|
||||
/* emit first triangle vertex as first triangle vertex */
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i+(i&1)-1, stride),
|
||||
get_vert(vertex_buffer, i-(i&1), stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i+(i&1)-1, stride),
|
||||
get_vert(vertex_buffer, i-(i&1), stride));
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
for (i = 2; i < nr; i++) {
|
||||
/* emit last triangle vertex as last triangle vertex */
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i+(i&1)-2, stride),
|
||||
get_vert(vertex_buffer, i-(i&1)-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i+(i&1)-2, stride),
|
||||
get_vert(vertex_buffer, i-(i&1)-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_TRIANGLE_FAN:
|
||||
if (nr == 4 && !uses_constant_interp) {
|
||||
rect( setup,
|
||||
rect(setup,
|
||||
get_vert(vertex_buffer, 0, stride),
|
||||
get_vert(vertex_buffer, 1, stride),
|
||||
get_vert(vertex_buffer, 2, stride),
|
||||
get_vert(vertex_buffer, 0, stride),
|
||||
get_vert(vertex_buffer, 2, stride),
|
||||
get_vert(vertex_buffer, 3, stride) );
|
||||
}
|
||||
else if (flatshade_first) {
|
||||
get_vert(vertex_buffer, 3, stride));
|
||||
} else if (flatshade_first) {
|
||||
for (i = 2; i < nr; i += 1) {
|
||||
/* emit first non-spoke vertex as first vertex */
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride),
|
||||
get_vert(vertex_buffer, 0, stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride),
|
||||
get_vert(vertex_buffer, 0, stride));
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
for (i = 2; i < nr; i += 1) {
|
||||
/* emit last non-spoke vertex as last vertex */
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, 0, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, 0, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case PIPE_PRIM_QUADS:
|
||||
/* GL quads don't follow provoking vertex convention */
|
||||
if (flatshade_first) {
|
||||
if (flatshade_first) {
|
||||
/* emit last quad vertex as first triangle vertex */
|
||||
for (i = 3; i < nr; i += 4) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i-0, stride),
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-2, stride) );
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i-0, stride),
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-1, stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i-0, stride),
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-2, stride));
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i-0, stride),
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-1, stride));
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
/* emit last quad vertex as last triangle vertex */
|
||||
if (!uses_constant_interp) {
|
||||
for (i = 3; i < nr; i += 4) {
|
||||
rect( setup,
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
rect(setup,
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
for (i = 3; i < nr; i += 4) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -586,30 +579,29 @@ lp_setup_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)
|
|||
|
||||
case PIPE_PRIM_QUAD_STRIP:
|
||||
/* GL quad strips don't follow provoking vertex convention */
|
||||
if (flatshade_first) {
|
||||
if (flatshade_first) {
|
||||
/* emit last quad vertex as first triangle vertex */
|
||||
for (i = 3; i < nr; i += 2) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i-0, stride),
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-2, stride) );
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i-0, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-3, stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i-0, stride),
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-2, stride));
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i-0, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-3, stride));
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
/* emit last quad vertex as last triangle vertex */
|
||||
for (i = 3; i < nr; i += 2) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-2, stride),
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-3, stride),
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -618,22 +610,21 @@ lp_setup_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)
|
|||
/* Almost same as tri fan but the _first_ vertex specifies the flat
|
||||
* shading color.
|
||||
*/
|
||||
if (flatshade_first) {
|
||||
if (flatshade_first) {
|
||||
/* emit first polygon vertex as first triangle vertex */
|
||||
for (i = 2; i < nr; i += 1) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, 0, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, 0, stride),
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride));
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
/* emit first polygon vertex as last triangle vertex */
|
||||
for (i = 2; i < nr; i += 1) {
|
||||
setup->triangle( setup,
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride),
|
||||
get_vert(vertex_buffer, 0, stride) );
|
||||
setup->triangle(setup,
|
||||
get_vert(vertex_buffer, i-1, stride),
|
||||
get_vert(vertex_buffer, i-0, stride),
|
||||
get_vert(vertex_buffer, 0, stride));
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
|
@ -644,7 +635,6 @@ lp_setup_draw_arrays(struct vbuf_render *vbr, uint start, uint nr)
|
|||
}
|
||||
|
||||
|
||||
|
||||
static void
|
||||
lp_setup_vbuf_destroy(struct vbuf_render *vbr)
|
||||
{
|
||||
|
|
@ -656,6 +646,7 @@ lp_setup_vbuf_destroy(struct vbuf_render *vbr)
|
|||
lp_setup_destroy(setup);
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* FIXME: it is unclear if primitives_storage_needed (which is generally
|
||||
* the same as pipe query num_primitives_generated) should increase
|
||||
|
|
@ -666,7 +657,8 @@ lp_setup_vbuf_destroy(struct vbuf_render *vbr)
|
|||
* increase too should call this from outside streamout code.
|
||||
*/
|
||||
static void
|
||||
lp_setup_so_info(struct vbuf_render *vbr, uint stream, uint primitives, uint prim_generated)
|
||||
lp_setup_so_info(struct vbuf_render *vbr, uint stream,
|
||||
uint primitives, uint prim_generated)
|
||||
{
|
||||
struct lp_setup_context *setup = lp_setup_context(vbr);
|
||||
struct llvmpipe_context *lp = llvmpipe_context(setup->pipe);
|
||||
|
|
@ -675,6 +667,7 @@ lp_setup_so_info(struct vbuf_render *vbr, uint stream, uint primitives, uint pri
|
|||
lp->so_stats[stream].primitives_storage_needed += prim_generated;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
lp_setup_pipeline_statistics(
|
||||
struct vbuf_render *vbr,
|
||||
|
|
@ -705,6 +698,7 @@ lp_setup_pipeline_statistics(
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Create the post-transform vertex handler for the given context.
|
||||
*/
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue