📄 t_dd_dmatmp.h
字号:
fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
return;
}
}
/* For verts, we still eliminate the copy from main memory to dma
* buffers. For elts, this is probably no better (worse?) than the
* standard path.
*/
static void TAG(render_triangles_elts)( GLcontext *ctx,
GLuint start,
GLuint count,
GLuint flags )
{
LOCAL_VARS;
GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS()/3*3;
int currentsz;
GLuint j, nr;
FLUSH();
ELT_INIT( GL_TRIANGLES );
currentsz = GET_CURRENT_VB_MAX_ELTS();
/* Emit whole number of tris in total. dmasz is already a multiple
* of 3.
*/
count -= (count-start)%3;
currentsz -= currentsz%3;
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;
}
}
static void TAG(render_tri_strip_elts)( GLcontext *ctx,
GLuint start,
GLuint count,
GLuint flags )
{
if (HAVE_TRI_STRIPS) {
LOCAL_VARS;
GLuint j, nr;
GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
int currentsz;
FLUSH();
ELT_INIT( GL_TRIANGLE_STRIP );
currentsz = GET_CURRENT_VB_MAX_ELTS();
if (currentsz < 8) {
currentsz = dmasz;
}
/* Keep the same winding over multiple buffers:
*/
dmasz -= (dmasz & 1);
currentsz -= (currentsz & 1);
for (j = start ; j + 2 < count; j += nr - 2 ) {
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 triangles */
fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
return;
}
}
static void TAG(render_tri_fan_elts)( GLcontext *ctx,
GLuint start,
GLuint count,
GLuint flags )
{
if (HAVE_TRI_FANS) {
LOCAL_VARS;
GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
GLuint j, nr;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
int currentsz;
FLUSH();
ELT_INIT( GL_TRIANGLE_FAN );
currentsz = GET_CURRENT_VB_MAX_ELTS();
if (currentsz < 8) {
currentsz = dmasz;
}
for (j = start + 1 ; j + 1 < count; j += nr - 2 ) {
void *tmp;
nr = MIN2( currentsz, count - j + 1 );
tmp = ALLOC_ELTS( nr );
tmp = TAG(emit_elts)( ctx, elts+start, 1, tmp );
tmp = TAG(emit_elts)( ctx, elts+j, nr - 1, tmp );
FLUSH();
currentsz = dmasz;
}
} else {
/* TODO: try to emit as indexed triangles */
fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
return;
}
}
static void TAG(render_poly_elts)( GLcontext *ctx,
GLuint start,
GLuint count,
GLuint flags )
{
if (HAVE_POLYGONS) {
LOCAL_VARS;
GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
GLuint j, nr;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
int currentsz;
FLUSH();
ELT_INIT( GL_POLYGON );
currentsz = GET_CURRENT_VB_MAX_ELTS();
if (currentsz < 8) {
currentsz = dmasz;
}
for (j = start + 1 ; j + 1 < count; j += nr - 2 ) {
void *tmp;
nr = MIN2( currentsz, count - j + 1 );
tmp = ALLOC_ELTS( nr );
tmp = TAG(emit_elts)( ctx, elts+start, 1, tmp );
tmp = TAG(emit_elts)( ctx, elts+j, nr - 1, tmp );
FLUSH();
currentsz = dmasz;
}
} else if (HAVE_TRI_FANS && !(ctx->_TriangleCaps & DD_FLATSHADE)) {
TAG(render_tri_fan_verts)( ctx, start, count, flags );
} else {
fprintf(stderr, "%s - cannot draw primitive\n", __FUNCTION__);
return;
}
}
static void TAG(render_quad_strip_elts)( GLcontext *ctx,
GLuint start,
GLuint count,
GLuint flags )
{
if (HAVE_QUAD_STRIPS && 0) {
}
else if (HAVE_TRI_STRIPS) {
LOCAL_VARS;
GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
int currentsz;
GLuint j, nr;
FLUSH();
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;
if (ctx->_TriangleCaps & DD_FLATSHADE) {
ELT_INIT( GL_TRIANGLES );
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 i;
GLint quads = (nr/2)-1;
ELTS_VARS( ALLOC_ELTS( quads*6 ) );
for ( i = j-start ; i < j-start+quads ; i++, elts += 2 ) {
EMIT_TWO_ELTS( 0, elts[0], elts[1] );
EMIT_TWO_ELTS( 2, elts[2], elts[1] );
EMIT_TWO_ELTS( 4, elts[3], elts[2] );
INCR_ELTS( 6 );
}
FLUSH();
}
currentsz = dmasz;
}
}
else {
ELT_INIT( GL_TRIANGLE_STRIP );
for (j = start; j + 3 < count; j += nr - 2 ) {
nr = MIN2( currentsz, count - j );
TAG(emit_elts)( ctx, elts+j, nr, ALLOC_ELTS(nr) );
FLUSH();
currentsz = dmasz;
}
}
}
}
static void TAG(render_quads_elts)( GLcontext *ctx,
GLuint start,
GLuint count,
GLuint flags )
{
if (HAVE_QUADS) {
LOCAL_VARS;
GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS()/4*4;
int currentsz;
GLuint j, nr;
FLUSH();
ELT_INIT( GL_TRIANGLES );
currentsz = GET_CURRENT_VB_MAX_ELTS()/4*4;
count -= (count-start)%4;
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 {
LOCAL_VARS;
GLuint *elts = TNL_CONTEXT(ctx)->vb.Elts;
int dmasz = GET_SUBSEQUENT_VB_MAX_ELTS();
int currentsz;
GLuint j, nr;
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 + 3 < count; j += nr - 2 ) {
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 ; i++, elts += 4 ) {
EMIT_TWO_ELTS( 0, elts[0], elts[1] );
EMIT_TWO_ELTS( 2, elts[3], elts[1] );
EMIT_TWO_ELTS( 4, elts[2], elts[3] );
INCR_ELTS( 6 );
}
FLUSH();
}
currentsz = dmasz;
}
}
}
static tnl_render_func TAG(render_tab_elts)[GL_POLYGON+2] =
{
TAG(render_points_elts),
TAG(render_lines_elts),
TAG(render_line_loop_elts),
TAG(render_line_strip_elts),
TAG(render_triangles_elts),
TAG(render_tri_strip_elts),
TAG(render_tri_fan_elts),
TAG(render_quads_elts),
TAG(render_quad_strip_elts),
TAG(render_poly_elts),
TAG(render_noop),
};
#endif
/* Pre-check the primitives in the VB to prevent the need for
* fallbacks later on.
*/
static GLboolean TAG(validate_render)( GLcontext *ctx,
struct vertex_buffer *VB )
{
GLint i;
if (VB->ClipOrMask & ~CLIP_CULL_BIT)
return GL_FALSE;
if (VB->Elts && !HAVE_ELTS)
return GL_FALSE;
for (i = 0 ; i < VB->PrimitiveCount ; i++) {
GLuint prim = VB->Primitive[i].mode;
GLuint count = VB->Primitive[i].count;
GLboolean ok = GL_FALSE;
if (!count)
continue;
switch (prim & PRIM_MODE_MASK) {
case GL_POINTS:
ok = HAVE_POINTS;
break;
case GL_LINES:
ok = HAVE_LINES && !ctx->Line.StippleFlag;
break;
case GL_LINE_STRIP:
ok = HAVE_LINE_STRIPS && !ctx->Line.StippleFlag;
break;
case GL_LINE_LOOP:
ok = HAVE_LINE_STRIPS && !ctx->Line.StippleFlag;
break;
case GL_TRIANGLES:
ok = HAVE_TRIANGLES;
break;
case GL_TRIANGLE_STRIP:
ok = HAVE_TRI_STRIPS;
break;
case GL_TRIANGLE_FAN:
ok = HAVE_TRI_FANS;
break;
case GL_POLYGON:
if (HAVE_POLYGONS) {
ok = GL_TRUE;
}
else
ok = (HAVE_TRI_FANS && !(ctx->_TriangleCaps & DD_FLATSHADE));
break;
case GL_QUAD_STRIP:
if (VB->Elts) {
ok = HAVE_TRI_STRIPS;
}
else if (HAVE_QUAD_STRIPS) {
ok = GL_TRUE;
} else if (HAVE_TRI_STRIPS &&
(ctx->_TriangleCaps & DD_FLATSHADE) &&
VB->ColorPtr[0]->stride != 0) {
if (HAVE_ELTS) {
ok = (GLint) count < GET_SUBSEQUENT_VB_MAX_ELTS();
}
else {
ok = GL_FALSE;
}
}
else
ok = HAVE_TRI_STRIPS;
break;
case GL_QUADS:
if (HAVE_QUADS) {
ok = GL_TRUE;
} else if (HAVE_ELTS) {
ok = (GLint) count < GET_SUBSEQUENT_VB_MAX_ELTS();
}
else {
ok = HAVE_TRIANGLES; /* flatshading is ok. */
}
break;
default:
break;
}
if (!ok) {
/* fprintf(stderr, "not ok %s\n", _mesa_lookup_enum_by_nr(prim & PRIM_MODE_MASK)); */
return GL_FALSE;
}
}
return GL_TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -