Esempio n. 1
0
void REPLICATESPU_APIENTRY replicatespu_End( void )
{
	GET_THREAD(thread);
	CRPackBuffer *buf = &thread->BeginEndBuffer;

	if ( thread->server.conn->Barf &&
		(thread->BeginEndMode == GL_LINES
		|| thread->BeginEndMode == GL_TRIANGLES
		|| thread->BeginEndMode == GL_QUADS
		|| thread->BeginEndMode == GL_POLYGON ) )
	{
		CRASSERT(buf->pack);

		crPackReleaseBuffer( thread->packer );
		crPackSetBuffer( thread->packer, &thread->normBuffer );
		if ( !crPackCanHoldBuffer( buf ) )
			replicatespuFlush( (void *) thread );

		crPackAppendBuffer( buf );
		crNetFree( thread->server.conn, buf->pack );
		buf->pack = NULL;
	}

	if (thread->currentContext->displayListMode != GL_FALSE) {
		crDLMCompileEnd();
	}
	if (replicate_spu.swap)
	{
		crPackEndSWAP();
	}
	else
	{
		crPackEnd();
	}
}
Esempio n. 2
0
void
crPackExpandDrawArrays(GLenum mode, GLint first, GLsizei count, CRClientState *c)
{
    int i;

    if (count < 0)
    {
        __PackError(__LINE__, __FILE__, GL_INVALID_VALUE, "crPackDrawArrays(negative count)");
        return;
    }

    if (mode > GL_POLYGON)
    {
        __PackError(__LINE__, __FILE__, GL_INVALID_ENUM, "crPackDrawArrays(bad mode)");
        return;
    }

    crPackBegin(mode);
    for (i=0; i<count; i++)
    {
        crPackExpandArrayElement(first + i, c);
    }
    crPackEnd();
}
Esempio n. 3
0
void TILESORTSPU_APIENTRY tilesortspu_End( void )
{
	GET_CONTEXT(ctx);
	CRLimitsState *limits = &(ctx->limits);
	GLenum dlMode = thread->currentContext->displayListMode;
	if (dlMode != GL_FALSE) {
	    /* just creating and/or compiling display lists */
	    if (tilesort_spu.lazySendDLists) crDLMCompileEnd();
	    else if (tilesort_spu.swap) crPackEndSWAP();
	    else crPackEnd();
	    return;
	}

	if (thread->pinchState.isLoop)
	{
		unsigned int i;

		/* XXX \todo vertex attribs */

		for (i = 0 ; i < limits->maxTextureUnits; i++)
		{
			if (i == 0)
			{
				if (tilesort_spu.swap)
				{
					crPackTexCoord4fvSWAP ( (GLfloat *) &(thread->pinchState.vtx->attrib[VERT_ATTRIB_TEX0 + i][0]));
				}
				else
				{
					crPackTexCoord4fv ( (GLfloat *) &(thread->pinchState.vtx->attrib[VERT_ATTRIB_TEX0 + i][0]));
				}
			}
			else
			{
				if (tilesort_spu.swap)
				{
					crPackMultiTexCoord4fvARBSWAP ( i + GL_TEXTURE0_ARB, (GLfloat *) &(thread->pinchState.vtx->attrib[VERT_ATTRIB_TEX0 + i][0]));
				}
				else
				{
					crPackMultiTexCoord4fvARB ( i + GL_TEXTURE0_ARB, (GLfloat *) &(thread->pinchState.vtx->attrib[VERT_ATTRIB_TEX0 + i][0]));
				}
			}
		}
		if (tilesort_spu.swap)
		{
			crPackNormal3fvSWAP((GLfloat *) &(thread->pinchState.vtx->attrib[VERT_ATTRIB_NORMAL][0]));
		}
		else
		{
			crPackNormal3fv((GLfloat *) &(thread->pinchState.vtx->attrib[VERT_ATTRIB_NORMAL][0]));
		}
		if (tilesort_spu.swap)
		{
			crPackEdgeFlagSWAP(thread->pinchState.vtx->edgeFlag);
		}
		else
		{
			crPackEdgeFlag(thread->pinchState.vtx->edgeFlag);
		}
		if (tilesort_spu.swap)
		{
			crPackColor4fvSWAP((GLfloat *) &(thread->pinchState.vtx->attrib[VERT_ATTRIB_COLOR0][0]));
		}
		else
		{
			crPackColor4fv((GLfloat *) &(thread->pinchState.vtx->attrib[VERT_ATTRIB_COLOR0][0]));
		}
		if (tilesort_spu.swap)
		{
			crPackVertex4fvBBOX_COUNTSWAP((GLfloat *) &(thread->pinchState.vtx->attrib[VERT_ATTRIB_POS][0]));
		}
		else
		{
			crPackVertex4fvBBOX_COUNT((GLfloat *) &(thread->pinchState.vtx->attrib[VERT_ATTRIB_POS][0]));
		}

		thread->pinchState.isLoop = 0;
	}
	if (tilesort_spu.swap)
	{
		crPackEndSWAP();
	}
	else
	{
		crPackEnd();
	}
	crStateEnd();
}
Esempio n. 4
0
/**
 * Expand glDrawElements into crPackBegin/Vertex/End, etc commands.
 * Note: if mode==999, don't call glBegin/glEnd.
 */
void
crPackExpandDrawElements(GLenum mode, GLsizei count, GLenum type,
                                                 const GLvoid *indices, CRClientState *c)
{
    int i;
    GLubyte *p = (GLubyte *)indices;
#ifdef CR_ARB_vertex_buffer_object
    CRBufferObject *elementsBuffer = crStateGetCurrent()->bufferobject.elementsBuffer;
#endif

    if (count < 0)
    {
        __PackError(__LINE__, __FILE__, GL_INVALID_VALUE,
                                "crPackDrawElements(negative count)");
        return;
    }

    if (mode > GL_POLYGON && mode != 999)
    {
        __PackError(__LINE__, __FILE__, GL_INVALID_ENUM,
                                "crPackDrawElements(bad mode)");
        return;
    }

    if (type != GL_UNSIGNED_BYTE &&
            type != GL_UNSIGNED_SHORT &&
            type != GL_UNSIGNED_INT)
    {
        __PackError(__LINE__, __FILE__, GL_INVALID_ENUM,
                                "crPackDrawElements(bad type)");
        return;
    }

#ifdef CR_ARB_vertex_buffer_object
    if (elementsBuffer && elementsBuffer->data)
    {
        p = (unsigned char *)(elementsBuffer->data) + (unsigned long)p;
    }
#endif

    if (mode != 999)
        crPackBegin(mode);

    //crDebug("crPackExpandDrawElements mode:0x%x, count:%d, type:0x%x", mode, count, type);

    switch (type)
    {
        case GL_UNSIGNED_BYTE:
            for (i=0; i<count; i++)
            {
                crPackExpandArrayElement((GLint) *p++, c);
            }
            break;
        case GL_UNSIGNED_SHORT:
            for (i=0; i<count; i++)
            {
                crPackExpandArrayElement((GLint) * (GLushort *) p, c);
                p+=sizeof (GLushort);
            }
            break;
        case GL_UNSIGNED_INT:
            for (i=0; i<count; i++)
            {
                crPackExpandArrayElement((GLint) * (GLuint *) p, c);
                p+=sizeof (GLuint);
            }
            break;
        default:
            crError( "this can't happen: array_spu.self.DrawElements" );
            break;
    }

    if (mode != 999)
        crPackEnd();
}