summaryrefslogtreecommitdiff
path: root/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c
diff options
context:
space:
mode:
authorLorry Tar Creator <lorry-tar-importer@baserock.org>2014-03-26 19:21:20 +0000
committer <>2014-05-08 15:03:54 +0000
commitfb123f93f9f5ce42c8e5785d2f8e0edaf951740e (patch)
treec2103d76aec5f1f10892cd1d3a38e24f665ae5db /src/VBox/GuestHost/OpenGL/state_tracker/state_client.c
parent58ed4748338f9466599adfc8a9171280ed99e23f (diff)
downloadVirtualBox-master.tar.gz
Imported from /home/lorry/working-area/delta_VirtualBox/VirtualBox-4.3.10.tar.bz2.HEADVirtualBox-4.3.10master
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/state_tracker/state_client.c')
-rw-r--r--src/VBox/GuestHost/OpenGL/state_tracker/state_client.c218
1 files changed, 201 insertions, 17 deletions
diff --git a/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c b/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c
index f0405c64..e02f3abe 100644
--- a/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c
+++ b/src/VBox/GuestHost/OpenGL/state_tracker/state_client.c
@@ -83,8 +83,9 @@ static void crStateUnlockClientPointer(CRClientPointer* cp)
}
}
-void crStateClientDestroy(CRClientState *c)
+void crStateClientDestroy(CRContext *g)
{
+ CRClientState *c = &(g->client);
#ifdef CR_EXT_compiled_vertex_array
if (c->array.locked)
{
@@ -109,9 +110,9 @@ void crStateClientDestroy(CRClientState *c)
#endif
}
-void crStateClientInit(CRClientState *c)
+void crStateClientInit(CRContext *ctx)
{
- CRContext *g = GetCurrentContext();
+ CRClientState *c = &(ctx->client);
unsigned int i;
/* pixel pack/unpack */
@@ -151,7 +152,9 @@ void crStateClientInit(CRClientState *c)
c->array.v.stride = 0;
c->array.v.enabled = 0;
#ifdef CR_ARB_vertex_buffer_object
- c->array.v.buffer = g ? g->bufferobject.arrayBuffer : NULL;
+ c->array.v.buffer = ctx->bufferobject.arrayBuffer;
+ if (c->array.v.buffer)
+ ++c->array.v.buffer->refCount;
#endif
#ifdef CR_EXT_compiled_vertex_array
c->array.v.locked = GL_FALSE;
@@ -166,7 +169,9 @@ void crStateClientInit(CRClientState *c)
c->array.c.stride = 0;
c->array.c.enabled = 0;
#ifdef CR_ARB_vertex_buffer_object
- c->array.c.buffer = g ? g->bufferobject.arrayBuffer : NULL;
+ c->array.c.buffer = ctx->bufferobject.arrayBuffer;
+ if (c->array.c.buffer)
+ ++c->array.c.buffer->refCount;
#endif
#ifdef CR_EXT_compiled_vertex_array
c->array.c.locked = GL_FALSE;
@@ -181,7 +186,9 @@ void crStateClientInit(CRClientState *c)
c->array.f.stride = 0;
c->array.f.enabled = 0;
#ifdef CR_ARB_vertex_buffer_object
- c->array.f.buffer = g ? g->bufferobject.arrayBuffer : NULL;
+ c->array.f.buffer = ctx->bufferobject.arrayBuffer;
+ if (c->array.f.buffer)
+ ++c->array.f.buffer->refCount;
#endif
#ifdef CR_EXT_compiled_vertex_array
c->array.f.locked = GL_FALSE;
@@ -196,7 +203,9 @@ void crStateClientInit(CRClientState *c)
c->array.s.stride = 0;
c->array.s.enabled = 0;
#ifdef CR_ARB_vertex_buffer_object
- c->array.s.buffer = g ? g->bufferobject.arrayBuffer : NULL;
+ c->array.s.buffer = ctx->bufferobject.arrayBuffer;
+ if (c->array.s.buffer)
+ ++c->array.s.buffer->refCount;
#endif
#ifdef CR_EXT_compiled_vertex_array
c->array.s.locked = GL_FALSE;
@@ -211,7 +220,9 @@ void crStateClientInit(CRClientState *c)
c->array.e.stride = 0;
c->array.e.enabled = 0;
#ifdef CR_ARB_vertex_buffer_object
- c->array.e.buffer = g ? g->bufferobject.arrayBuffer : NULL;
+ c->array.e.buffer = ctx->bufferobject.arrayBuffer;
+ if (c->array.e.buffer)
+ ++c->array.e.buffer->refCount;
#endif
#ifdef CR_EXT_compiled_vertex_array
c->array.e.locked = GL_FALSE;
@@ -226,7 +237,9 @@ void crStateClientInit(CRClientState *c)
c->array.i.stride = 0;
c->array.i.enabled = 0;
#ifdef CR_ARB_vertex_buffer_object
- c->array.i.buffer = g ? g->bufferobject.arrayBuffer : NULL;
+ c->array.i.buffer = ctx->bufferobject.arrayBuffer;
+ if (c->array.i.buffer)
+ ++c->array.i.buffer->refCount;
#endif
#ifdef CR_EXT_compiled_vertex_array
c->array.i.locked = GL_FALSE;
@@ -241,7 +254,9 @@ void crStateClientInit(CRClientState *c)
c->array.n.stride = 0;
c->array.n.enabled = 0;
#ifdef CR_ARB_vertex_buffer_object
- c->array.n.buffer = g ? g->bufferobject.arrayBuffer : NULL;
+ c->array.n.buffer = ctx->bufferobject.arrayBuffer;
+ if (c->array.n.buffer)
+ ++c->array.n.buffer->refCount;
#endif
#ifdef CR_EXT_compiled_vertex_array
c->array.n.locked = GL_FALSE;
@@ -258,7 +273,9 @@ void crStateClientInit(CRClientState *c)
c->array.t[i].stride = 0;
c->array.t[i].enabled = 0;
#ifdef CR_ARB_vertex_buffer_object
- c->array.t[i].buffer = g ? g->bufferobject.arrayBuffer : NULL;
+ c->array.t[i].buffer = ctx->bufferobject.arrayBuffer;
+ if (c->array.t[i].buffer)
+ ++c->array.t[i].buffer->refCount;
#endif
#ifdef CR_EXT_compiled_vertex_array
c->array.t[i].locked = GL_FALSE;
@@ -275,7 +292,9 @@ void crStateClientInit(CRClientState *c)
c->array.a[i].size = 4;
c->array.a[i].stride = 0;
#ifdef CR_ARB_vertex_buffer_object
- c->array.a[i].buffer = g ? g->bufferobject.arrayBuffer : NULL;
+ c->array.a[i].buffer = ctx->bufferobject.arrayBuffer;
+ if (c->array.a[i].buffer)
+ ++c->array.a[i].buffer->refCount;
#endif
#ifdef CR_EXT_compiled_vertex_array
c->array.a[i].locked = GL_FALSE;
@@ -622,7 +641,14 @@ crStateClientSetPointer(CRClientPointer *cp, GLint size,
cp->stride = cp->bytesPerIndex;
#ifdef CR_ARB_vertex_buffer_object
+ if (cp->buffer)
+ {
+ --cp->buffer->refCount;
+ CRASSERT(cp->buffer->refCount && cp->buffer->refCount < UINT32_MAX/2);
+ }
cp->buffer = g->bufferobject.arrayBuffer;
+ if (cp->buffer)
+ ++cp->buffer->refCount;
#endif
}
@@ -1622,6 +1648,7 @@ crStateUseServerArrayElements(void)
#endif
}
+#define CR_BUFFER_HWID(_p) ((_p) ? (_p)->hwid : 0)
void
crStateClientDiff(CRClientBits *cb, CRbitvalue *bitID,
@@ -1631,6 +1658,17 @@ crStateClientDiff(CRClientBits *cb, CRbitvalue *bitID,
const CRClientState *to = &(toCtx->client);
GLint curClientTextureUnit = from->curClientTextureUnit;
int i;
+ GLint idHwArrayBuffer = CR_BUFFER_HWID(toCtx->bufferobject.arrayBuffer);
+ const GLint idHwInitialBuffer = idHwArrayBuffer;
+
+#ifdef DEBUG_misha
+ {
+ GLint tstHwBuffer = -1;
+ diff_api.GetIntegerv(GL_ARRAY_BUFFER_BINDING, &tstHwBuffer);
+ CRASSERT(idHwInitialBuffer == tstHwBuffer);
+ }
+#endif
+
if (CHECKDIRTY(cb->clientPointer, bitID)) {
/* one or more vertex pointers is dirty */
@@ -1638,7 +1676,14 @@ crStateClientDiff(CRClientBits *cb, CRbitvalue *bitID,
if (from->array.v.size != to->array.v.size ||
from->array.v.type != to->array.v.type ||
from->array.v.stride != to->array.v.stride ||
+ from->array.v.p != to->array.v.p ||
from->array.v.buffer != to->array.v.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.v.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.VertexPointer(to->array.v.size, to->array.v.type,
to->array.v.stride, to->array.v.p);
from->array.v.size = to->array.v.size;
@@ -1653,7 +1698,14 @@ crStateClientDiff(CRClientBits *cb, CRbitvalue *bitID,
if (CHECKDIRTY(cb->n, bitID)) {
if (from->array.n.type != to->array.n.type ||
from->array.n.stride != to->array.n.stride ||
+ from->array.n.p != to->array.n.p ||
from->array.n.buffer != to->array.n.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.n.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.NormalPointer(to->array.n.type,
to->array.n.stride, to->array.n.p);
from->array.n.type = to->array.n.type;
@@ -1668,7 +1720,14 @@ crStateClientDiff(CRClientBits *cb, CRbitvalue *bitID,
if (from->array.c.size != to->array.c.size ||
from->array.c.type != to->array.c.type ||
from->array.c.stride != to->array.c.stride ||
+ from->array.c.p != to->array.c.p ||
from->array.c.buffer != to->array.c.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.c.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.ColorPointer(to->array.c.size, to->array.c.type,
to->array.c.stride, to->array.c.p);
from->array.c.size = to->array.c.size;
@@ -1683,7 +1742,14 @@ crStateClientDiff(CRClientBits *cb, CRbitvalue *bitID,
if (CHECKDIRTY(cb->i, bitID)) {
if (from->array.i.type != to->array.i.type ||
from->array.i.stride != to->array.i.stride ||
+ from->array.i.p != to->array.i.p ||
from->array.i.buffer != to->array.i.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.i.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.IndexPointer(to->array.i.type,
to->array.i.stride, to->array.i.p);
from->array.i.type = to->array.i.type;
@@ -1699,7 +1765,14 @@ crStateClientDiff(CRClientBits *cb, CRbitvalue *bitID,
if (from->array.t[i].size != to->array.t[i].size ||
from->array.t[i].type != to->array.t[i].type ||
from->array.t[i].stride != to->array.t[i].stride ||
+ from->array.t[i].p != to->array.t[i].p ||
from->array.t[i].buffer != to->array.t[i].buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.t[i].buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.ClientActiveTextureARB(GL_TEXTURE0_ARB + i);
curClientTextureUnit = i;
diff_api.TexCoordPointer(to->array.t[i].size, to->array.t[i].type,
@@ -1716,7 +1789,14 @@ crStateClientDiff(CRClientBits *cb, CRbitvalue *bitID,
/* edge flag */
if (CHECKDIRTY(cb->e, bitID)) {
if (from->array.e.stride != to->array.e.stride ||
+ from->array.e.p != to->array.e.p ||
from->array.e.buffer != to->array.e.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.e.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.EdgeFlagPointer(to->array.e.stride, to->array.e.p);
from->array.e.stride = to->array.e.stride;
from->array.e.p = to->array.e.p;
@@ -1729,7 +1809,14 @@ crStateClientDiff(CRClientBits *cb, CRbitvalue *bitID,
if (from->array.s.size != to->array.s.size ||
from->array.s.type != to->array.s.type ||
from->array.s.stride != to->array.s.stride ||
+ from->array.s.p != to->array.s.p ||
from->array.s.buffer != to->array.s.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.s.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.SecondaryColorPointerEXT(to->array.s.size, to->array.s.type,
to->array.s.stride, to->array.s.p);
from->array.s.size = to->array.s.size;
@@ -1744,7 +1831,14 @@ crStateClientDiff(CRClientBits *cb, CRbitvalue *bitID,
if (CHECKDIRTY(cb->f, bitID)) {
if (from->array.f.type != to->array.f.type ||
from->array.f.stride != to->array.f.stride ||
+ from->array.f.p != to->array.f.p ||
from->array.f.buffer != to->array.f.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.f.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.FogCoordPointerEXT(to->array.f.type,
to->array.f.stride, to->array.f.p);
from->array.f.type = to->array.f.type;
@@ -1762,7 +1856,14 @@ crStateClientDiff(CRClientBits *cb, CRbitvalue *bitID,
from->array.a[i].type != to->array.a[i].type ||
from->array.a[i].stride != to->array.a[i].stride ||
from->array.a[i].normalized != to->array.a[i].normalized ||
+ from->array.a[i].p != to->array.a[i].p ||
from->array.a[i].buffer != to->array.a[i].buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.a[i].buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.VertexAttribPointerARB(i, to->array.a[i].size,
to->array.a[i].type,
to->array.a[i].normalized,
@@ -1781,11 +1882,16 @@ crStateClientDiff(CRClientBits *cb, CRbitvalue *bitID,
#endif
}
+ if (idHwArrayBuffer != idHwInitialBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwInitialBuffer);
+ }
+
if (CHECKDIRTY(cb->enableClientState, bitID)) {
/* update vertex array enable/disable flags */
glAble able[2];
- able[0] = diff_api.Disable;
- able[1] = diff_api.Enable;
+ able[0] = diff_api.DisableClientState;
+ able[1] = diff_api.EnableClientState;
if (from->array.v.enabled != to->array.v.enabled) {
able[to->array.v.enabled](GL_VERTEX_ARRAY);
from->array.v.enabled = to->array.v.enabled;
@@ -1849,6 +1955,16 @@ crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,
const CRClientState *to = &(toCtx->client);
GLint curClientTextureUnit = from->curClientTextureUnit;
int i;
+ GLint idHwArrayBuffer = CR_BUFFER_HWID(toCtx->bufferobject.arrayBuffer);
+ const GLint idHwInitialBuffer = idHwArrayBuffer;
+
+#ifdef DEBUG_misha
+ {
+ GLint tstHwBuffer = -1;
+ diff_api.GetIntegerv(GL_ARRAY_BUFFER_BINDING, &tstHwBuffer);
+ CRASSERT(idHwInitialBuffer == tstHwBuffer);
+ }
+#endif
if (CHECKDIRTY(cb->clientPointer, bitID)) {
/* one or more vertex pointers is dirty */
@@ -1856,7 +1972,14 @@ crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,
if (from->array.v.size != to->array.v.size ||
from->array.v.type != to->array.v.type ||
from->array.v.stride != to->array.v.stride ||
+ from->array.v.p != to->array.v.p ||
from->array.v.buffer != to->array.v.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.v.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.VertexPointer(to->array.v.size, to->array.v.type,
to->array.v.stride, to->array.v.p);
FILLDIRTY(cb->v);
@@ -1869,7 +1992,14 @@ crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,
if (CHECKDIRTY(cb->n, bitID)) {
if (from->array.n.type != to->array.n.type ||
from->array.n.stride != to->array.n.stride ||
+ from->array.n.p != to->array.n.p ||
from->array.n.buffer != to->array.n.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.n.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.NormalPointer(to->array.n.type,
to->array.n.stride, to->array.n.p);
FILLDIRTY(cb->n);
@@ -1883,7 +2013,14 @@ crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,
if (from->array.c.size != to->array.c.size ||
from->array.c.type != to->array.c.type ||
from->array.c.stride != to->array.c.stride ||
+ from->array.c.p != to->array.c.p ||
from->array.c.buffer != to->array.c.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.c.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.ColorPointer(to->array.c.size, to->array.c.type,
to->array.c.stride, to->array.c.p);
FILLDIRTY(cb->c);
@@ -1896,7 +2033,14 @@ crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,
if (CHECKDIRTY(cb->i, bitID)) {
if (from->array.i.type != to->array.i.type ||
from->array.i.stride != to->array.i.stride ||
+ from->array.i.p != to->array.i.p ||
from->array.i.buffer != to->array.i.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.i.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.IndexPointer(to->array.i.type,
to->array.i.stride, to->array.i.p);
FILLDIRTY(cb->i);
@@ -1911,7 +2055,14 @@ crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,
if (from->array.t[i].size != to->array.t[i].size ||
from->array.t[i].type != to->array.t[i].type ||
from->array.t[i].stride != to->array.t[i].stride ||
+ from->array.t[i].p != to->array.t[i].p ||
from->array.t[i].buffer != to->array.t[i].buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.t[i].buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.ClientActiveTextureARB(GL_TEXTURE0_ARB + i);
curClientTextureUnit = i;
diff_api.TexCoordPointer(to->array.t[i].size, to->array.t[i].type,
@@ -1926,7 +2077,14 @@ crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,
/* edge flag */
if (CHECKDIRTY(cb->e, bitID)) {
if (from->array.e.stride != to->array.e.stride ||
+ from->array.e.p != to->array.e.p ||
from->array.e.buffer != to->array.e.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.e.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.EdgeFlagPointer(to->array.e.stride, to->array.e.p);
FILLDIRTY(cb->e);
FILLDIRTY(cb->clientPointer);
@@ -1939,7 +2097,14 @@ crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,
if (from->array.s.size != to->array.s.size ||
from->array.s.type != to->array.s.type ||
from->array.s.stride != to->array.s.stride ||
+ from->array.s.p != to->array.s.p ||
from->array.s.buffer != to->array.s.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.s.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.SecondaryColorPointerEXT(to->array.s.size, to->array.s.type,
to->array.s.stride, to->array.s.p);
FILLDIRTY(cb->s);
@@ -1952,7 +2117,14 @@ crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,
if (CHECKDIRTY(cb->f, bitID)) {
if (from->array.f.type != to->array.f.type ||
from->array.f.stride != to->array.f.stride ||
+ from->array.f.p != to->array.f.p ||
from->array.f.buffer != to->array.f.buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.f.buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.FogCoordPointerEXT(to->array.f.type,
to->array.f.stride, to->array.f.p);
FILLDIRTY(cb->f);
@@ -1969,7 +2141,14 @@ crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,
from->array.a[i].type != to->array.a[i].type ||
from->array.a[i].stride != to->array.a[i].stride ||
from->array.a[i].normalized != to->array.a[i].normalized ||
+ from->array.a[i].p != to->array.a[i].p ||
from->array.a[i].buffer != to->array.a[i].buffer) {
+ GLint idHwArrayBufferUsed = CR_BUFFER_HWID(to->array.a[i].buffer);
+ if (idHwArrayBufferUsed != idHwArrayBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwArrayBufferUsed);
+ idHwArrayBuffer = idHwArrayBufferUsed;
+ }
diff_api.VertexAttribPointerARB(i, to->array.a[i].size,
to->array.a[i].type,
to->array.a[i].normalized,
@@ -1985,11 +2164,16 @@ crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,
#endif
}
+ if (idHwArrayBuffer != idHwInitialBuffer)
+ {
+ diff_api.BindBufferARB(GL_ARRAY_BUFFER_ARB, idHwInitialBuffer);
+ }
+
if (CHECKDIRTY(cb->enableClientState, bitID)) {
/* update vertex array enable/disable flags */
glAble able[2];
- able[0] = diff_api.Disable;
- able[1] = diff_api.Enable;
+ able[0] = diff_api.DisableClientState;
+ able[1] = diff_api.EnableClientState;
if (from->array.v.enabled != to->array.v.enabled) {
able[to->array.v.enabled](GL_VERTEX_ARRAY);
FILLDIRTY(cb->enableClientState);
@@ -2038,7 +2222,7 @@ crStateClientSwitch(CRClientBits *cb, CRbitvalue *bitID,
if (from->array.a[i].enabled != to->array.a[i].enabled) {
if (to->array.a[i].enabled)
diff_api.EnableVertexAttribArrayARB(i);
- else
+ else
diff_api.DisableVertexAttribArrayARB(i);
FILLDIRTY(cb->enableClientState);
FILLDIRTY(cb->dirty);