Index: /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_bufferobject.c
===================================================================
--- /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_bufferobject.c	(revision 44124)
+++ /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_bufferobject.c	(revision 44125)
@@ -131,2 +131,24 @@
     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);
+}
Index: /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_framebuffer.c
===================================================================
--- /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_framebuffer.c	(revision 44124)
+++ /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_framebuffer.c	(revision 44125)
@@ -98,2 +98,46 @@
     return status;
 }
+
+void PACKSPU_APIENTRY packspu_GenFramebuffersEXT( GLsizei n, GLuint * framebuffers )
+{
+    GET_THREAD(thread);
+    int writeback = 1;
+    if (!CRPACKSPU_IS_WDDM_CRHGSMI() && !(pack_spu.thread[pack_spu.idxThreadInUse].netServer.conn->actual_network))
+    {
+        crError( "packspu_GenFramebuffersEXT doesn't work when there's no actual network involved!\nTry using the simplequery SPU in your chain!" );
+    }
+    if (pack_spu.swap)
+    {
+        crPackGenFramebuffersEXTSWAP( n, framebuffers, &writeback );
+    }
+    else
+    {
+        crPackGenFramebuffersEXT( n, framebuffers, &writeback );
+    }
+    packspuFlush( (void *) thread );
+    CRPACKSPU_WRITEBACK_WAIT(thread, writeback);
+
+    crStateRegFramebuffers(n, framebuffers);
+}
+
+void PACKSPU_APIENTRY packspu_GenRenderbuffersEXT( GLsizei n, GLuint * renderbuffers )
+{
+    GET_THREAD(thread);
+    int writeback = 1;
+    if (!CRPACKSPU_IS_WDDM_CRHGSMI() && !(pack_spu.thread[pack_spu.idxThreadInUse].netServer.conn->actual_network))
+    {
+        crError( "packspu_GenRenderbuffersEXT doesn't work when there's no actual network involved!\nTry using the simplequery SPU in your chain!" );
+    }
+    if (pack_spu.swap)
+    {
+        crPackGenRenderbuffersEXTSWAP( n, renderbuffers, &writeback );
+    }
+    else
+    {
+        crPackGenRenderbuffersEXT( n, renderbuffers, &writeback );
+    }
+    packspuFlush( (void *) thread );
+    CRPACKSPU_WRITEBACK_WAIT(thread, writeback);
+
+    crStateRegRenderbuffers(n, renderbuffers);
+}
Index: /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_special
===================================================================
--- /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_special	(revision 44124)
+++ /trunk/src/VBox/Additions/common/crOpenGL/pack/packspu_special	(revision 44125)
@@ -120,2 +120,5 @@
 CompressedTexSubImage2DARB
 CompressedTexSubImage3DARB
+GenFramebuffersEXT
+GenRenderbuffersEXT
+GenBuffersARB
Index: /trunk/src/VBox/GuestHost/OpenGL/include/cr_hash.h
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/include/cr_hash.h	(revision 44124)
+++ /trunk/src/VBox/GuestHost/OpenGL/include/cr_hash.h	(revision 44125)
@@ -27,4 +27,5 @@
 DECLEXPORT(void) crHashtableAdd( CRHashTable *h, unsigned long key, void *data );
 DECLEXPORT(GLuint) crHashtableAllocKeys( CRHashTable *h, GLsizei range );
+GLboolean crHashtableAllocRegisterKey( CRHashTable *h,  GLuint key);
 DECLEXPORT(void) crHashtableDelete( CRHashTable *h, unsigned long key, CRHashtableCallback deleteCallback );
 DECLEXPORT(void) crHashtableDeleteBlock( CRHashTable *h, unsigned long key, GLsizei range, CRHashtableCallback deleteFunc );
Index: /trunk/src/VBox/GuestHost/OpenGL/include/state/cr_bufferobject.h
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/include/state/cr_bufferobject.h	(revision 44124)
+++ /trunk/src/VBox/GuestHost/OpenGL/include/state/cr_bufferobject.h	(revision 44125)
@@ -64,4 +64,5 @@
 DECLEXPORT(GLuint) STATE_APIENTRY crStateGetBufferHWID(GLuint id);
 
+DECLEXPORT(void) crStateRegBuffers(GLsizei n, GLuint *buffers);
 #ifdef __cplusplus
 }
Index: /trunk/src/VBox/GuestHost/OpenGL/include/state/cr_framebuffer.h
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/include/state/cr_framebuffer.h	(revision 44124)
+++ /trunk/src/VBox/GuestHost/OpenGL/include/state/cr_framebuffer.h	(revision 44125)
@@ -97,4 +97,7 @@
 DECLEXPORT(GLuint) STATE_APIENTRY crStateRBOHWIDtoID(GLuint hwid);
 
+DECLEXPORT(void) crStateRegFramebuffers(GLsizei n, GLuint *buffers);
+DECLEXPORT(void) crStateRegRenderbuffers(GLsizei n, GLuint *buffers);
+
 #ifdef IN_GUEST
 DECLEXPORT(GLenum) STATE_APIENTRY crStateCheckFramebufferStatusEXT(GLenum target);
Index: /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_bufferobject.c
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_bufferobject.c	(revision 44124)
+++ /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_bufferobject.c	(revision 44125)
@@ -34,4 +34,10 @@
     CRContext *g = GetCurrentContext();
     crStateGenNames(g, g->shared->buffersTable, n, buffers);
+}
+
+void crStateRegBuffers(GLsizei n, GLuint *buffers)
+{
+    CRContext *g = GetCurrentContext();
+    crStateRegNames(g, g->shared->buffersTable, n, buffers);
 }
 
Index: /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_framebuffer.c
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_framebuffer.c	(revision 44124)
+++ /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_framebuffer.c	(revision 44125)
@@ -44,4 +44,16 @@
     CRContext *g = GetCurrentContext();
     crStateGenNames(g, g->shared->rbTable, n, buffers);
+}
+
+void crStateRegFramebuffers(GLsizei n, GLuint *buffers)
+{
+    CRContext *g = GetCurrentContext();
+    crStateRegNames(g, g->shared->fbTable, n, buffers);
+}
+
+void crStateRegRenderbuffers(GLsizei n, GLuint *buffers)
+{
+    CRContext *g = GetCurrentContext();
+    crStateRegNames(g, g->shared->rbTable, n, buffers);
 }
 
Index: /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_texture.c
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_texture.c	(revision 44124)
+++ /trunk/src/VBox/GuestHost/OpenGL/state_tracker/state_texture.c	(revision 44125)
@@ -619,4 +619,19 @@
     crStateDeleteTextureObjectData(tobj);
     crFree(tobj);
+}
+
+void crStateRegNames(CRContext *g, CRHashTable *table, GLsizei n, GLuint *names)
+{
+    GLint i;
+    for (i = 0; i < n; i++)
+    {
+        if (names[i])
+        {
+            GLboolean isNewKey = crHashtableAllocRegisterKey(table, names[i]);
+            CRASSERT(isNewKey);
+        }
+        else
+            crWarning("RegNames: requested to register a null name");
+    }
 }
 
Index: /trunk/src/VBox/GuestHost/OpenGL/util/hash.c
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/util/hash.c	(revision 44124)
+++ /trunk/src/VBox/GuestHost/OpenGL/util/hash.c	(revision 44125)
@@ -236,5 +236,5 @@
  * Mark the given Id as being allocated.
  */
-static void crHashIdPoolAllocId( CRHashIdPool *pool, GLuint id )
+static GLboolean crHashIdPoolAllocId( CRHashIdPool *pool, GLuint id )
 {
     FreeElem *f;
@@ -267,5 +267,5 @@
                 f->next = newelem;
             }
-            return;
+            return GL_TRUE;
         }
         f = f->next;
@@ -273,4 +273,5 @@
 
     /* if we get here, the ID was already allocated - that's OK */
+    return GL_FALSE;
 }
 
@@ -418,4 +419,17 @@
 }
 
+GLboolean crHashtableAllocRegisterKey( CRHashTable *h,  GLuint key)
+{
+    GLboolean fAllocated;
+#ifdef CHROMIUM_THREADSAFE
+    crLockMutex(&h->mutex);
+#endif
+    fAllocated = crHashIdPoolAllocId (h->idPool, key);
+#ifdef CHROMIUM_THREADSAFE
+    crUnlockMutex(&h->mutex);
+#endif
+    return fAllocated;
+}
+
 GLuint crHashtableAllocKeys( CRHashTable *h,  GLsizei range)
 {
@@ -427,4 +441,12 @@
 #endif
     res = crHashIdPoolAllocBlock (h->idPool, range);
+#ifdef DEBUG_misha
+    Assert(res);
+    for (i = 0; i < range; ++i)
+    {
+        void *search = crHashtableSearch( h, res+i );
+        Assert(!search);
+    }
+#endif
 #ifdef CHROMIUM_THREADSAFE
     crUnlockMutex(&h->mutex);
Index: /trunk/src/VBox/GuestHost/OpenGL/util/util.def
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/util/util.def	(revision 44124)
+++ /trunk/src/VBox/GuestHost/OpenGL/util/util.def	(revision 44125)
@@ -83,4 +83,5 @@
 crHashtableNumElements
 crHashtableWalk
+crHashtableAllocRegisterKey
 crAllocHashtable
 crFreeHashtable
