📄 t_dd_dmatmp.h
字号:
GLuint j, nr;
int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS();
int currentsz;
INIT(GL_QUAD_STRIP);
currentsz = GET_CURRENT_VB_MAX_VERTS();
if (currentsz < 8) {
currentsz = dmasz;
}
dmasz -= (dmasz & 2);
currentsz -= (currentsz & 2);
for (j = start ; j + 3 < count; j += nr - 2 ) {
nr = MIN2( currentsz, count - j );
TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) );
currentsz = dmasz;
}
FLUSH();
} else if (HAVE_TRI_STRIPS &&
(ctx->_TriangleCaps & DD_FLATSHADE) &&
TNL_CONTEXT(ctx)->vb.ColorPtr[0]->stride) {
if (HAVE_ELTS) {
LOCAL_VARS;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
int currentsz;
GLuint j, nr;
EMIT_INDEXED_VERTS( ctx, start, count );
/* Simulate flat-shaded quadstrips using indexed vertices:
*/
ELT_INIT( GL_TRIANGLES );
currentsz = GET_CURRENT_VB_MAX_ELTS();
/* Emit whole number of quads in total, and in each buffer.
*/
dmasz -= dmasz & 1;
count -= (count-start) & 1;
currentsz -= currentsz & 1;
if (currentsz < 12)
currentsz = dmasz;
currentsz = currentsz/6*2;
dmasz = dmasz/6*2;
for (j = start; j + 3 < count; j += nr - 2 ) {
nr = MIN2( currentsz, count - j );
if (nr >= 4) {
GLint quads = (nr/2)-1;
GLint i;
ELTS_VARS( ALLOC_ELTS( quads*6 ) );
for ( i = j-start ; i < j-start+quads*2 ; i+=2 ) {
EMIT_TWO_ELTS( 0, (i+0), (i+1) );
EMIT_TWO_ELTS( 2, (i+2), (i+1) );
EMIT_TWO_ELTS( 4, (i+3), (i+2) );
INCR_ELTS( 6 );
}
FLUSH();
}
currentsz = dmasz;
}
RELEASE_ELT_VERTS();
FLUSH();
}
else {
/* Vertices won't fit in a single buffer or elts not
* available - should never happen.
*/
fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
return;
}
}
else if (HAVE_TRI_STRIPS) {
LOCAL_VARS;
int dmasz = GET_SUBSEQUENT_VB_MAX_VERTS();
int currentsz;
/* Emit smooth-shaded quadstrips as tristrips:
*/
FLUSH();
INIT( GL_TRIANGLE_STRIP );
/* Emit whole number of quads in total, and in each buffer.
*/
dmasz -= dmasz & 1;
currentsz = GET_CURRENT_VB_MAX_VERTS();
currentsz -= currentsz & 1;
count -= (count-start) & 1;
if (currentsz < 8) {
currentsz = dmasz;
}
for (j = start; j + 3 < count; j += nr - 2 ) {
nr = MIN2( currentsz, count - j );
TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) );
currentsz = dmasz;
}
FLUSH();
} else {
fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
return;
}
}
static void TAG(render_quads_verts)( GLcontext *ctx,
GLuint start,
GLuint count,
GLuint flags )
{
if (HAVE_QUADS) {
LOCAL_VARS;
int dmasz = (GET_SUBSEQUENT_VB_MAX_VERTS()/4) * 4;
int currentsz;
GLuint j, nr;
INIT(GL_QUADS);
/* Emit whole number of quads in total. dmasz is already a multiple
* of 4.
*/
count -= (count-start)%4;
currentsz = (GET_CURRENT_VB_MAX_VERTS()/4) * 4;
if (currentsz < 8)
currentsz = dmasz;
for (j = start; j < count; j += nr) {
nr = MIN2( currentsz, count - j );
TAG(emit_verts)( ctx, j, nr, ALLOC_VERTS(nr) );
currentsz = dmasz;
}
}
else if (HAVE_ELTS) {
/* Hardware doesn't have a quad primitive type -- try to
* simulate it using indexed vertices and the triangle
* primitive:
*/
LOCAL_VARS;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
int currentsz;
GLuint j, nr;
EMIT_INDEXED_VERTS( ctx, start, count );
FLUSH();
ELT_INIT( GL_TRIANGLES );
currentsz = GET_CURRENT_VB_MAX_ELTS();
/* Emit whole number of quads in total, and in each buffer.
*/
dmasz -= dmasz & 3;
count -= (count-start) & 3;
currentsz -= currentsz & 3;
/* Adjust for rendering as triangles:
*/
currentsz = currentsz/6*4;
dmasz = dmasz/6*4;
if (currentsz < 8)
currentsz = dmasz;
for (j = start; j < count; j += nr ) {
nr = MIN2( currentsz, count - j );
if (nr >= 4) {
GLint quads = nr/4;
GLint i;
ELTS_VARS( ALLOC_ELTS( quads*6 ) );
for ( i = j-start ; i < j-start+quads*4 ; i+=4 ) {
EMIT_TWO_ELTS( 0, (i+0), (i+1) );
EMIT_TWO_ELTS( 2, (i+3), (i+1) );
EMIT_TWO_ELTS( 4, (i+2), (i+3) );
INCR_ELTS( 6 );
}
FLUSH();
}
currentsz = dmasz;
}
RELEASE_ELT_VERTS();
}
else if (HAVE_TRIANGLES) {
/* Hardware doesn't have a quad primitive type -- try to
* simulate it using triangle primitive. This is a win for
* gears, but is it useful in the broader world?
*/
LOCAL_VARS;
GLuint j;
INIT(GL_TRIANGLES);
for (j = start; j < count-3; j += 4) {
void *tmp = ALLOC_VERTS( 6 );
/* Send v0, v1, v3
*/
tmp = EMIT_VERTS(ctx, j, 2, tmp);
tmp = EMIT_VERTS(ctx, j + 3, 1, tmp);
/* Send v1, v2, v3
*/
tmp = EMIT_VERTS(ctx, j + 1, 3, tmp);
}
}
else {
/* Vertices won't fit in a single buffer, should never happen.
*/
fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
return;
}
}
static void TAG(render_noop)( GLcontext *ctx,
GLuint start,
GLuint count,
GLuint flags )
{
}
static tnl_render_func TAG(render_tab_verts)[GL_POLYGON+2] =
{
TAG(render_points_verts),
TAG(render_lines_verts),
TAG(render_line_loop_verts),
TAG(render_line_strip_verts),
TAG(render_triangles_verts),
TAG(render_tri_strip_verts),
TAG(render_tri_fan_verts),
TAG(render_quads_verts),
TAG(render_quad_strip_verts),
TAG(render_poly_verts),
TAG(render_noop),
};
/****************************************************************************
* Render elts using hardware indexed verts *
****************************************************************************/
#if (HAVE_ELTS)
static void TAG(render_points_elts)( GLcontext *ctx,
GLuint start,
GLuint count,
GLuint flags )
{
if (HAVE_POINTS) {
LOCAL_VARS;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
int currentsz;
GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
GLuint j, nr;
ELT_INIT( GL_POINTS );
currentsz = GET_CURRENT_VB_MAX_ELTS();
if (currentsz < 8)
currentsz = dmasz;
for (j = start; j < count; j += nr ) {
nr = MIN2( currentsz, count - j );
TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
FLUSH();
currentsz = dmasz;
}
} else {
fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
return;
}
}
static void TAG(render_lines_elts)( GLcontext *ctx,
GLuint start,
GLuint count,
GLuint flags )
{
if (HAVE_LINES) {
LOCAL_VARS;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
int currentsz;
GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
GLuint j, nr;
ELT_INIT( GL_LINES );
/* Emit whole number of lines in total and in each buffer:
*/
count -= (count-start) & 1;
currentsz -= currentsz & 1;
dmasz -= dmasz & 1;
currentsz = GET_CURRENT_VB_MAX_ELTS();
if (currentsz < 8)
currentsz = dmasz;
for (j = start; j < count; j += nr ) {
nr = MIN2( currentsz, count - j );
TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
FLUSH();
currentsz = dmasz;
}
} else {
fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
return;
}
}
static void TAG(render_line_strip_elts)( GLcontext *ctx,
GLuint start,
GLuint count,
GLuint flags )
{
if (HAVE_LINE_STRIPS) {
LOCAL_VARS;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
int currentsz;
GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
GLuint j, nr;
FLUSH(); /* always a new primitive */
ELT_INIT( GL_LINE_STRIP );
currentsz = GET_CURRENT_VB_MAX_ELTS();
if (currentsz < 8)
currentsz = dmasz;
for (j = start; j + 1 < count; j += nr - 1 ) {
nr = MIN2( currentsz, count - j );
TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
FLUSH();
currentsz = dmasz;
}
} else {
/* TODO: Try to emit as indexed lines.
*/
fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
return;
}
}
static void TAG(render_line_loop_elts)( GLcontext *ctx,
GLuint start,
GLuint count,
GLuint flags )
{
if (HAVE_LINE_STRIPS) {
LOCAL_VARS;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
int currentsz;
GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
GLuint j, nr;
FLUSH();
ELT_INIT( GL_LINE_STRIP );
if (flags & PRIM_BEGIN)
j = start;
else
j = start + 1;
currentsz = GET_CURRENT_VB_MAX_ELTS();
if (currentsz < 8) {
currentsz = dmasz;
}
/* Ensure last vertex doesn't wrap:
*/
currentsz--;
dmasz--;
if (j + 1 < count) {
for ( ; j + 1 < count; j += nr - 1 ) {
nr = MIN2( currentsz, count - j );
if (j + nr >= count &&
start < count - 1 &&
(flags & PRIM_END))
{
void *tmp;
tmp = ALLOC_ELTS(nr+1);
tmp = TAG(emit_elts)( ctx, elts+j, nr, tmp );
tmp = TAG(emit_elts)( ctx, elts+start, 1, tmp );
}
else {
TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
currentsz = dmasz;
}
}
}
else if (start + 1 < count && (flags & PRIM_END)) {
void *tmp;
tmp = ALLOC_ELTS(2);
tmp = TAG(emit_elts)( ctx, elts+start+1, 1, tmp );
tmp = TAG(emit_elts)( ctx, elts+start, 1, tmp );
}
FLUSH();
} else {
/* TODO: Try to emit as indexed lines */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -