summaryrefslogtreecommitdiffstats
path: root/src/VBox/Additions/common/crOpenGL/pack/packspu_bufferobject.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/VBox/Additions/common/crOpenGL/pack/packspu_bufferobject.c')
-rw-r--r--src/VBox/Additions/common/crOpenGL/pack/packspu_bufferobject.c160
1 files changed, 160 insertions, 0 deletions
diff --git a/src/VBox/Additions/common/crOpenGL/pack/packspu_bufferobject.c b/src/VBox/Additions/common/crOpenGL/pack/packspu_bufferobject.c
new file mode 100644
index 00000000..65f64bd7
--- /dev/null
+++ b/src/VBox/Additions/common/crOpenGL/pack/packspu_bufferobject.c
@@ -0,0 +1,160 @@
+/* Copyright (c) 2001, Stanford University
+ * All rights reserved
+ *
+ * See the file LICENSE.txt for information on redistributing this software.
+ */
+
+#include "cr_error.h"
+#include "cr_mem.h"
+#include "cr_string.h"
+#include "packspu.h"
+#include "packspu_proto.h"
+
+static void packspu_GetHostBufferSubDataARB( GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data )
+{
+ GET_THREAD(thread);
+ int writeback = 1;
+
+ crPackGetBufferSubDataARB(target, offset, size, data, &writeback);
+
+ packspuFlush((void *) thread);
+
+ CRPACKSPU_WRITEBACK_WAIT(thread, writeback);
+}
+
+void * PACKSPU_APIENTRY
+packspu_MapBufferARB( GLenum target, GLenum access )
+{
+ GET_CONTEXT(ctx);
+ void *buffer;
+ CRBufferObject *pBufObj;
+
+ CRASSERT(GL_TRUE == ctx->clientState->bufferobject.retainBufferData);
+ buffer = crStateMapBufferARB(target, access);
+
+#ifdef CR_ARB_pixel_buffer_object
+ if (buffer)
+ {
+ pBufObj = crStateGetBoundBufferObject(target, &ctx->clientState->bufferobject);
+ CRASSERT(pBufObj);
+
+ if (pBufObj->bResyncOnRead &&
+ access != GL_WRITE_ONLY_ARB)
+ {
+ /*fetch data from host side*/
+ packspu_GetHostBufferSubDataARB(target, 0, pBufObj->size, buffer);
+ }
+ }
+#endif
+
+ return buffer;
+}
+
+void PACKSPU_APIENTRY packspu_GetBufferSubDataARB( GLenum target, GLintptrARB offset, GLsizeiptrARB size, void * data )
+{
+ GET_CONTEXT(ctx);
+
+#ifdef CR_ARB_pixel_buffer_object
+ CRBufferObject *pBufObj;
+
+ pBufObj = crStateGetBoundBufferObject(target, &ctx->clientState->bufferobject);
+
+ if (pBufObj && pBufObj->bResyncOnRead)
+ {
+ 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);
+}