packspu_bufferobject.c revision f331d205f60c47a901a1f827ee4c68ef47ece20d
5c151cd77f89e923c6f2d3686c53733234d61ef1vboxsync/* Copyright (c) 2001, Stanford University
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync * All rights reserved
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync *
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync * See the file LICENSE.txt for information on redistributing this software.
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync */
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync#include "cr_error.h"
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync#include "cr_mem.h"
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync#include "cr_string.h"
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync#include "packspu.h"
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync#include "packspu_proto.h"
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsyncstatic void packspu_GetHostBufferSubDataARB( GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data )
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync{
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync GET_THREAD(thread);
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync int writeback = 1;
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync crPackGetBufferSubDataARB(target, offset, size, data, &writeback);
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync packspuFlush((void *) thread);
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync CRPACKSPU_WRITEBACK_WAIT(thread, writeback);
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync}
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsyncvoid * PACKSPU_APIENTRY
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsyncpackspu_MapBufferARB( GLenum target, GLenum access )
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync{
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync GET_CONTEXT(ctx);
f57695f2e0f50d04904c83d599f87942c8bb31f3vboxsync void *buffer;
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync CRBufferObject *pBufObj;
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync CRASSERT(GL_TRUE == ctx->clientState->bufferobject.retainBufferData);
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync buffer = crStateMapBufferARB(target, access);
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync#ifdef CR_ARB_pixel_buffer_object
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync if (buffer)
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync {
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync pBufObj = crStateGetBoundBufferObject(target, &ctx->clientState->bufferobject);
f57695f2e0f50d04904c83d599f87942c8bb31f3vboxsync CRASSERT(pBufObj);
f57695f2e0f50d04904c83d599f87942c8bb31f3vboxsync
f57695f2e0f50d04904c83d599f87942c8bb31f3vboxsync if (pBufObj->bResyncOnRead &&
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync access != GL_WRITE_ONLY_ARB)
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync {
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync /*fetch data from host side*/
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync packspu_GetHostBufferSubDataARB(target, 0, pBufObj->size, buffer);
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync }
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync }
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync#endif
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync return buffer;
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync}
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsyncvoid PACKSPU_APIENTRY packspu_GetBufferSubDataARB( GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data )
71e78bc7cd31385955b5684085e43f9d1d051d5avboxsync{
71e78bc7cd31385955b5684085e43f9d1d051d5avboxsync GET_CONTEXT(ctx);
71e78bc7cd31385955b5684085e43f9d1d051d5avboxsync
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync#ifdef CR_ARB_pixel_buffer_object
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync CRBufferObject *pBufObj;
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync pBufObj = crStateGetBoundBufferObject(target, &ctx->clientState->bufferobject);
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync if (pBufObj && pBufObj->bResyncOnRead)
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync {
88b7935c7a9d5156b439570abcea19c121ecf60bvboxsync packspu_GetHostBufferSubDataARB(target, offset, size, data);
return;
}
#endif
crStateGetBufferSubDataARB(target, offset, size, data);
}
GLboolean PACKSPU_APIENTRY
packspu_UnmapBufferARB( GLenum target )
{
GET_CONTEXT(ctx);
#if CR_ARB_vertex_buffer_object
CRBufferObject *bufObj;
bufObj = crStateGetBoundBufferObject(target, &ctx->clientState->bufferobject);
/* send new buffer contents to server */
crPackBufferDataARB( target, bufObj->size, bufObj->pointer, bufObj->usage );
#endif
CRASSERT(GL_TRUE == ctx->clientState->bufferobject.retainBufferData);
crStateUnmapBufferARB( target );
return GL_TRUE;
}
void PACKSPU_APIENTRY
packspu_BufferDataARB(GLenum target, GLsizeiptrARB size, const GLvoid * data, GLenum usage)
{
/*crDebug("packspu_BufferDataARB size:%d", size);*/
crStateBufferDataARB(target, size, data, usage);
crPackBufferDataARB(target, size, data, usage);
}
void PACKSPU_APIENTRY
packspu_BufferSubDataARB(GLenum target, GLintptrARB offset, GLsizeiptrARB size, const GLvoid * data)
{
/*crDebug("packspu_BufferSubDataARB size:%d", size);*/
crStateBufferSubDataARB(target, offset, size, data);
crPackBufferSubDataARB(target, offset, size, data);
}
void PACKSPU_APIENTRY
packspu_GetBufferPointervARB(GLenum target, GLenum pname, GLvoid **params)
{
crStateGetBufferPointervARB( target, pname, params );
}
void PACKSPU_APIENTRY
packspu_GetBufferParameterivARB( GLenum target, GLenum pname, GLint * params )
{
crStateGetBufferParameterivARB( target, pname, params );
}
/*
* Need to update our local state for vertex arrays.
*/
void PACKSPU_APIENTRY
packspu_BindBufferARB( GLenum target, GLuint buffer )
{
crStateBindBufferARB(target, buffer);
crPackBindBufferARB(target, buffer);
}
void PACKSPU_APIENTRY packspu_GenBuffersARB( GLsizei n, GLuint * buffer )
{
GET_THREAD(thread);
int writeback = 1;
if (!CRPACKSPU_IS_WDDM_CRHGSMI() && !(pack_spu.thread[pack_spu.idxThreadInUse].netServer.conn->actual_network))
{
crError( "packspu_GenBuffersARB doesn't work when there's no actual network involved!\nTry using the simplequery SPU in your chain!" );
}
if (pack_spu.swap)
{
crPackGenBuffersARBSWAP( n, buffer, &writeback );
}
else
{
crPackGenBuffersARB( n, buffer, &writeback );
}
packspuFlush( (void *) thread );
CRPACKSPU_WRITEBACK_WAIT(thread, writeback);
crStateRegBuffers(n, buffer);
}
void PACKSPU_APIENTRY packspu_DeleteBuffersARB( GLsizei n, const GLuint * buffer )
{
crStateDeleteBuffersARB( n, buffer );
crPackDeleteBuffersARB(n, buffer);
}