Index: /trunk/src/VBox/GuestHost/OpenGL/Makefile.kmk
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/Makefile.kmk	(revision 46514)
+++ /trunk/src/VBox/GuestHost/OpenGL/Makefile.kmk	(revision 46515)
@@ -191,5 +191,5 @@
 
 ifdef VBOX_WITH_CRDUMPER
-$(VBOX_PATH_CROGL_GENFILES)/dump_gen.cpp: $(PATH_SUB_CURRENT)/state_tracker/dump_gen.py $(PATH_ROOT)/src/VBox/HostServices/SharedOpenGL/crserverlib/get_sizes.py $(addprefix $(PATH_SUB_CURRENT)/state_tracker/, state_isenabled.txt state_extensions_isenabled.txt) $(VBOX_CROGL_API_FILES) | $$(dir $$@)
+$(VBOX_PATH_CROGL_GENFILES)/dump_gen.cpp: $(PATH_SUB_CURRENT)/state_tracker/dump_gen.py $(PATH_ROOT)/src/VBox/HostServices/SharedOpenGL/crserverlib/get_sizes.py  $(PATH_ROOT)/src/VBox/HostServices/SharedOpenGL/crserverlib/get_components.py $(addprefix $(PATH_SUB_CURRENT)/state_tracker/, state_isenabled.txt state_extensions_isenabled.txt) $(VBOX_CROGL_API_FILES) | $$(dir $$@)
 	$(call MSG_GENERATE,python,$@,$<)
 	$(QUIET)$(call VBOX_CROGL_PYTHON_ENV,$(VBOX_PATH_CROGL_PYTHON_INCLUDE),$@) $(VBOX_BLD_PYTHON) $< $(VBOX_PATH_CROGL_GLAPI) $(<D)
Index: /trunk/src/VBox/GuestHost/OpenGL/include/cr_dump.h
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/include/cr_dump.h	(revision 46514)
+++ /trunk/src/VBox/GuestHost/OpenGL/include/cr_dump.h	(revision 46515)
@@ -129,7 +129,12 @@
 VBOXDUMPDECL(void) crRecDumpShader(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid);
 VBOXDUMPDECL(void) crRecDumpProgram(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid);
+VBOXDUMPDECL(void) crRecRecompileShader(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid);
+VBOXDUMPDECL(void) crRecRecompileProgram(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid);
 VBOXDUMPDECL(void) crRecDumpCurrentProgram(CR_RECORDER *pRec, CRContext *ctx);
 VBOXDUMPDECL(void) crRecDumpProgramUniforms(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid);
 VBOXDUMPDECL(void) crRecDumpCurrentProgramUniforms(CR_RECORDER *pRec, CRContext *ctx);
+VBOXDUMPDECL(void) crRecRecompileCurrentProgram(CR_RECORDER *pRec, CRContext *ctx);
+VBOXDUMPDECL(void) crRecDumpProgramAttribs(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid);
+VBOXDUMPDECL(void) crRecDumpCurrentProgramAttribs(CR_RECORDER *pRec, CRContext *ctx);
 VBOXDUMPDECL(void) crRecDumpGlGetState(CR_RECORDER *pRec, CRContext *ctx);
 VBOXDUMPDECL(void) crRecDumpGlEnableState(CR_RECORDER *pRec, CRContext *ctx);
@@ -137,4 +142,7 @@
 VBOXDUMPDECL(void) crRecDumpVertAttrF(CR_RECORDER *pRec, CRContext *ctx, const char*pszFormat, ...);
 VBOXDUMPDECL(void) crRecDumpVertAttrV(CR_RECORDER *pRec, CRContext *ctx, const char*pszFormat, va_list pArgList);
+VBOXDUMPDECL(void) crRecDumpTexParam(CR_RECORDER *pRec, CRContext *ctx, GLenum enmTarget);
+VBOXDUMPDECL(void) crRecDumpTexEnv(CR_RECORDER *pRec, CRContext *ctx);
+VBOXDUMPDECL(void) crRecDumpTexGen(CR_RECORDER *pRec, CRContext *ctx);
 
 typedef DECLCALLBACKPTR(GLuint, PFNCRDUMPGETHWID)(void *pvObj);
Index: /trunk/src/VBox/GuestHost/OpenGL/state_tracker/dump.cpp
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/state_tracker/dump.cpp	(revision 46514)
+++ /trunk/src/VBox/GuestHost/OpenGL/state_tracker/dump.cpp	(revision 46515)
@@ -483,9 +483,15 @@
     switch (enmType)
     {
+        CR_DUMP_MAKE_CASE(GL_BYTE);
+        CR_DUMP_MAKE_CASE(GL_UNSIGNED_BYTE);
+        CR_DUMP_MAKE_CASE(GL_SHORT);
+        CR_DUMP_MAKE_CASE(GL_UNSIGNED_SHORT);
         CR_DUMP_MAKE_CASE(GL_FLOAT);
+        CR_DUMP_MAKE_CASE(GL_DOUBLE);
         CR_DUMP_MAKE_CASE(GL_FLOAT_VEC2);
         CR_DUMP_MAKE_CASE(GL_FLOAT_VEC3);
         CR_DUMP_MAKE_CASE(GL_FLOAT_VEC4);
         CR_DUMP_MAKE_CASE(GL_INT);
+        CR_DUMP_MAKE_CASE(GL_UNSIGNED_INT);
         CR_DUMP_MAKE_CASE(GL_INT_VEC2);
         CR_DUMP_MAKE_CASE(GL_INT_VEC3);
@@ -681,5 +687,130 @@
     crFree(pShaders);
 
+    GLsizei cbLog = 0;
+
+    pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_INFO_LOG_LENGTH_ARB, &cbLog);
+    if (cbLog)
+    {
+        char *pszLog = (char *)crCalloc(cbLog+1);
+        pRec->pDispatch->GetInfoLogARB(hwid, cbLog, NULL, pszLog);
+        crDmpStrF(pRec->pDumper, "==LOG==");
+        crRecDumpStrByLine(pRec->pDumper, pszLog, cbLog);
+        crDmpStrF(pRec->pDumper, "==Done LOG==");
+        crFree(pszLog);
+    }
+    else
+    {
+        crDmpStrF(pRec->pDumper, "==No LOG==");
+    }
+
     crDmpStr(pRec->pDumper, "===END PROGRAM====");
+}
+
+void crRecRecompileShader(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
+{
+    GLint length = 0;
+    GLint type = 0;
+    GLint compileStatus = 0;
+    CRGLSLShader *pShad;
+
+    if (!id)
+    {
+        unsigned long tstKey = 0;
+        Assert(hwid);
+        pShad = (CRGLSLShader *)crDmpHashtableSearchByHwid(ctx->glsl.shaders, hwid, crDmpGetHwidShaderCB, &tstKey);
+        Assert(pShad);
+        if (!pShad)
+            return;
+        id = pShad->id;
+        Assert(tstKey == id);
+    }
+    else
+    {
+        pShad = (CRGLSLShader *)crHashtableSearch(ctx->glsl.shaders, id);
+        Assert(pShad);
+        if (!pShad)
+            return;
+    }
+
+    if (!hwid)
+        hwid = pShad->hwid;
+
+    Assert(pShad->hwid == hwid);
+    Assert(pShad->id == id);
+
+    pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_SUBTYPE_ARB, &type);
+    pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_COMPILE_STATUS_ARB, &compileStatus);
+    crDmpStrF(pRec->pDumper, "==RECOMPILE SHADER ctx(%d) id(%d) hwid(%d) type(%s) status(%d)==", ctx->id, id, hwid, crRecDumpShaderTypeString(type, pRec->pDumper), compileStatus);
+
+    compileStatus = 0;
+    GLenum status;
+    while ((status = pRec->pDispatch->GetError()) != GL_NO_ERROR) {/*Assert(0);*/}
+    pRec->pDispatch->CompileShader(hwid);
+    while ((status = pRec->pDispatch->GetError()) != GL_NO_ERROR) {Assert(0);}
+    pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_COMPILE_STATUS_ARB, &compileStatus);
+
+    crDmpStrF(pRec->pDumper, "==Done RECOMPILE SHADER, status(%d)==", compileStatus);
+}
+
+void crRecRecompileProgram(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
+{
+    GLint cShaders = 0, linkStatus = 0;
+    char *source = NULL;
+    CRGLSLProgram *pProg;
+
+    if (!id)
+    {
+        unsigned long tstKey = 0;
+        Assert(hwid);
+        pProg = (CRGLSLProgram*)crDmpHashtableSearchByHwid(ctx->glsl.programs, hwid, crDmpGetHwidProgramCB, &tstKey);
+        Assert(pProg);
+        if (!pProg)
+            return;
+        id = pProg->id;
+        Assert(tstKey == id);
+    }
+    else
+    {
+        pProg = (CRGLSLProgram *) crHashtableSearch(ctx->glsl.programs, id);
+        Assert(pProg);
+        if (!pProg)
+            return;
+    }
+
+    if (!hwid)
+        hwid = pProg->hwid;
+
+    Assert(pProg->hwid == hwid);
+    Assert(pProg->id == id);
+
+    pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_ATTACHED_OBJECTS_ARB, &cShaders);
+    pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_LINK_STATUS_ARB, &linkStatus);
+
+    crDmpStrF(pRec->pDumper, "==RECOMPILE PROGRAM ctx(%d) id(%d) hwid(%d) status(%d) shaders(%d)==", ctx->id, id, hwid, linkStatus, cShaders);
+
+    GLhandleARB *pShaders = (GLhandleARB*)crCalloc(cShaders * sizeof (*pShaders));
+    if (!pShaders)
+    {
+        crWarning("crCalloc failed");
+        crDmpStrF(pRec->pDumper, "WARNING: crCalloc failed");
+        return;
+    }
+
+    pRec->pDispatch->GetAttachedObjectsARB(hwid, cShaders, NULL, pShaders);
+    for (GLint i = 0; i < cShaders; ++i)
+    {
+        crRecRecompileShader(pRec, ctx, 0, pShaders[i]);
+    }
+
+    crFree(pShaders);
+
+    linkStatus = 0;
+    GLenum status;
+    while ((status = pRec->pDispatch->GetError()) != GL_NO_ERROR) {/*Assert(0);*/}
+    pRec->pDispatch->LinkProgram(hwid);
+    while ((status = pRec->pDispatch->GetError()) != GL_NO_ERROR) {Assert(0);}
+    pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_LINK_STATUS_ARB, &linkStatus);
+
+    crDmpStrF(pRec->pDumper, "==Done RECOMPILE PROGRAM, status(%d)==", linkStatus);
 }
 
@@ -813,19 +944,19 @@
                     {
                         case 1:
-                            crDmpStrF(pRec->pDumper, "%s = %d;", pszName, idata[0]);
+                            crDmpStrF(pRec->pDumper, "%s = %d; //location %d", pszName, idata[0], location);
                             break;
                         case 2:
-                            crDmpStrF(pRec->pDumper, "%s = {%d, %d};", pszName, idata[0], idata[1]);
+                            crDmpStrF(pRec->pDumper, "%s = {%d, %d}; //location %d", pszName, idata[0], idata[1], location);
                             break;
                         case 3:
-                            crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d};", pszName, idata[0], idata[1], idata[2]);
+                            crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d}; //location %d", pszName, idata[0], idata[1], idata[2], location);
                             break;
                         case 4:
-                            crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d, %d};", pszName, idata[0], idata[1], idata[2], idata[3]);
+                            crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d, %d}; //location %d", pszName, idata[0], idata[1], idata[2], idata[3], location);
                             break;
                         default:
                             for (GLint k = 0; k < uniformTypeSize; ++k)
                             {
-                                crDmpStrF(pRec->pDumper, "%s[%d] = %d;", pszName, k, idata[k]);
+                                crDmpStrF(pRec->pDumper, "%s[%d] = %d; //location %d", pszName, k, idata[k], location);
                             }
                             break;
@@ -838,19 +969,191 @@
                     {
                         case 1:
-                            crDmpStrF(pRec->pDumper, "%s = %f;", pszName, fdata[0]);
+                            crDmpStrF(pRec->pDumper, "%s = %f; //location %d", pszName, fdata[0], location);
                             break;
                         case 2:
-                            crDmpStrF(pRec->pDumper, "%s = {%f, %f};", pszName, fdata[0], fdata[1]);
+                            crDmpStrF(pRec->pDumper, "%s = {%f, %f}; //location %d", pszName, fdata[0], fdata[1], location);
                             break;
                         case 3:
-                            crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f};", pszName, fdata[0], fdata[1], fdata[2]);
+                            crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f}; //location %d", pszName, fdata[0], fdata[1], fdata[2], location);
                             break;
                         case 4:
-                            crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f, %f};", pszName, fdata[0], fdata[1], fdata[2], fdata[3]);
+                            crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f, %f}; //location %d", pszName, fdata[0], fdata[1], fdata[2], fdata[3], location);
                             break;
                         default:
                             for (GLint k = 0; k < uniformTypeSize; ++k)
                             {
-                                crDmpStrF(pRec->pDumper, "%s[%d] = %f;", pszName, k, fdata[k]);
+                                crDmpStrF(pRec->pDumper, "%s[%d] = %f; //location %d", pszName, k, fdata[k], location);
+                            }
+                            break;
+                    }
+                }
+            }
+        }
+
+        crFree(pszName);
+    }
+}
+
+void crRecDumpProgramAttribs(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
+{
+    CRGLSLProgram *pProg;
+
+    if (!id)
+    {
+        unsigned long tstKey = 0;
+        Assert(hwid);
+        pProg = (CRGLSLProgram*)crDmpHashtableSearchByHwid(ctx->glsl.programs, hwid, crDmpGetHwidProgramCB, &tstKey);
+        Assert(pProg);
+        if (!pProg)
+            return;
+        id = pProg->id;
+        Assert(tstKey == id);
+    }
+    else
+    {
+        pProg = (CRGLSLProgram *) crHashtableSearch(ctx->glsl.programs, id);
+        Assert(pProg);
+        if (!pProg)
+            return;
+    }
+
+    if (!hwid)
+        hwid = pProg->hwid;
+
+    Assert(pProg->hwid == hwid);
+    Assert(pProg->id == id);
+
+    GLint maxAttribLen = 0, activeAttrib = 0, i, j, attribCount = 0;
+    GLenum type;
+    GLint size, location;
+    GLchar *pszName = NULL;
+    pRec->pDispatch->GetProgramiv(hwid, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxAttribLen);
+    pRec->pDispatch->GetProgramiv(hwid, GL_ACTIVE_ATTRIBUTES, &activeAttrib);
+
+    if (!maxAttribLen)
+    {
+        if (activeAttrib)
+        {
+            crWarning("activeAttrib (%d), while maxAttribLen is zero", activeAttrib);
+            activeAttrib = 0;
+        }
+    }
+
+    if (activeAttrib>0)
+    {
+        pszName = (GLchar *) crAlloc((maxAttribLen+8)*sizeof(GLchar));
+
+        if (!pszName)
+        {
+            crWarning("crRecDumpProgramAttrib: out of memory");
+            return;
+        }
+    }
+
+    for (i=0; i<activeAttrib; ++i)
+    {
+        pRec->pDispatch->GetActiveAttrib(hwid, i, maxAttribLen, NULL, &size, &type, pszName);
+        attribCount += size;
+    }
+    Assert(attribCount>=activeAttrib);
+
+    if (activeAttrib>0)
+    {
+        GLfloat fdata[16];
+        GLint idata[16];
+        char *pIndexStr=NULL;
+
+        for (i=0; i<activeAttrib; ++i)
+        {
+            bool fPrintBraketsWithName = false;
+            pRec->pDispatch->GetActiveAttrib(hwid, i, maxAttribLen, NULL, &size, &type, pszName);
+            GLint arrayBufferBind = 0, arrayEnabled = 0, arraySize = 0, arrayStride = 0, arrayType = 0, arrayNormalized = 0, arrayInteger = 0/*, arrayDivisor = 0*/;
+
+            pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &arrayBufferBind);
+            pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &arrayEnabled);
+            pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_SIZE, &arraySize);
+            pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &arrayStride);
+            pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_TYPE, &arrayType);
+            pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &arrayNormalized);
+            pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_INTEGER, &arrayInteger);
+//            pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_DIVISOR, &arrayDivisor);
+
+            if (size>1)
+            {
+                pIndexStr = crStrchr(pszName, '[');
+                if (!pIndexStr)
+                {
+                    pIndexStr = pszName+crStrlen(pszName);
+                    fPrintBraketsWithName = true;
+                }
+            }
+
+            if (fPrintBraketsWithName)
+            {
+                crDmpStrF(pRec->pDumper, "%s %s[%d];", crRecDumpVarTypeString(type, pRec->pDumper), pszName, size);
+                Assert(size > 1);
+            }
+            else
+                crDmpStrF(pRec->pDumper, "%s %s;", crRecDumpVarTypeString(type, pRec->pDumper), pszName);
+
+            crDmpStrF(pRec->pDumper, "Array buff(%d), enabled(%d) size(%d), stride(%d), type(%s), normalized(%d), integer(%d)", arrayBufferBind, arrayEnabled, arraySize, arrayStride, crRecDumpVarTypeString(arrayType, pRec->pDumper), arrayNormalized, arrayInteger);
+
+            GLint attribTypeSize = crStateGetUniformSize(type);
+            Assert(attribTypeSize >= 1);
+
+            for (j=0; j<size; ++j)
+            {
+                if (size>1)
+                {
+                    sprintf(pIndexStr, "[%i]", j);
+                }
+                location = pRec->pDispatch->GetAttribLocation(hwid, pszName);
+
+                if (crStateIsIntUniform(type))
+                {
+                    pRec->pDispatch->GetVertexAttribivARB(location, GL_CURRENT_VERTEX_ATTRIB, &idata[0]);
+                    switch (attribTypeSize)
+                    {
+                        case 1:
+                            crDmpStrF(pRec->pDumper, "%s = %d; //location %d", pszName, idata[0], location);
+                            break;
+                        case 2:
+                            crDmpStrF(pRec->pDumper, "%s = {%d, %d}; //location %d", pszName, idata[0], idata[1], location);
+                            break;
+                        case 3:
+                            crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d}; //location %d", pszName, idata[0], idata[1], idata[2], location);
+                            break;
+                        case 4:
+                            crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d, %d}; //location %d", pszName, idata[0], idata[1], idata[2], idata[3], location);
+                            break;
+                        default:
+                            for (GLint k = 0; k < attribTypeSize; ++k)
+                            {
+                                crDmpStrF(pRec->pDumper, "%s[%d] = %d; //location %d", pszName, k, idata[k], location);
+                            }
+                            break;
+                    }
+                }
+                else
+                {
+                    pRec->pDispatch->GetVertexAttribfvARB(location, GL_CURRENT_VERTEX_ATTRIB, &fdata[0]);
+                    switch (attribTypeSize)
+                    {
+                        case 1:
+                            crDmpStrF(pRec->pDumper, "%s = %f; //location %d", pszName, fdata[0], location);
+                            break;
+                        case 2:
+                            crDmpStrF(pRec->pDumper, "%s = {%f, %f}; //location %d", pszName, fdata[0], fdata[1], location);
+                            break;
+                        case 3:
+                            crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f}; //location %d", pszName, fdata[0], fdata[1], fdata[2], location);
+                            break;
+                        case 4:
+                            crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f, %f}; //location %d", pszName, fdata[0], fdata[1], fdata[2], fdata[3], location);
+                            break;
+                        default:
+                            for (GLint k = 0; k < attribTypeSize; ++k)
+                            {
+                                crDmpStrF(pRec->pDumper, "%s[%d] = %f; //location %d", pszName, k, fdata[k], location);
                             }
                             break;
@@ -884,4 +1187,44 @@
 }
 
+VBOXDUMPDECL(void) crRecDumpCurrentProgramAttribs(CR_RECORDER *pRec, CRContext *ctx)
+{
+    GLint curProgram = 0;
+    pRec->pDispatch->GetIntegerv(GL_CURRENT_PROGRAM, &curProgram);
+    if (curProgram)
+    {
+        Assert(ctx->glsl.activeProgram);
+        if (!ctx->glsl.activeProgram)
+            crWarning("no active program state with active hw program");
+        else
+            Assert(ctx->glsl.activeProgram->hwid == curProgram);
+        crRecDumpProgramAttribs(pRec, ctx, 0, curProgram);
+    }
+    else
+    {
+        Assert(!ctx->glsl.activeProgram);
+        crDmpStrF(pRec->pDumper, "--no active program");
+    }
+}
+
+VBOXDUMPDECL(void) crRecRecompileCurrentProgram(CR_RECORDER *pRec, CRContext *ctx)
+{
+    GLint curProgram = 0;
+    pRec->pDispatch->GetIntegerv(GL_CURRENT_PROGRAM, &curProgram);
+    if (curProgram)
+    {
+        Assert(ctx->glsl.activeProgram);
+        if (!ctx->glsl.activeProgram)
+            crWarning("no active program state with active hw program");
+        else
+            Assert(ctx->glsl.activeProgram->hwid == curProgram);
+        crRecRecompileProgram(pRec, ctx, 0, curProgram);
+    }
+    else
+    {
+        Assert(!ctx->glsl.activeProgram);
+        crDmpStrF(pRec->pDumper, "--no active program");
+    }
+}
+
 void crRecDumpTextures(CR_RECORDER *pRec, CRContext *ctx, CR_BLITTER_CONTEXT *pCurCtx, CR_BLITTER_WINDOW *pCurWin)
 {
@@ -972,4 +1315,8 @@
                 Tex.hwid = hwTex;
 
+                crRecDumpTexParam(pRec, ctx, GL_TEXTURE_2D);
+                crRecDumpTexEnv(pRec, ctx);
+                crRecDumpTexGen(pRec, ctx);
+
                 rc = CrBltEnter(pRec->pBlitter, pCurCtx, pCurWin);
                 if (RT_SUCCESS(rc))
@@ -978,5 +1325,5 @@
                     if (RT_SUCCESS(rc))
                     {
-                        crDmpImgF(pRec->pDumper, &Img, "ctx(%d), Unit %d: TEXTURE_2D id(%d) hwid(%d)", ctx, i, pTobj->id, pTobj->hwid);
+                        crDmpImgF(pRec->pDumper, &Img, "ctx(%d), Unit %d: TEXTURE_2D id(%d) hwid(%d), width(%d), height(%d)", ctx, i, pTobj->id, pTobj->hwid, width, height);
                         CrBltImgFree(pRec->pBlitter, &Img);
                     }
Index: /trunk/src/VBox/GuestHost/OpenGL/state_tracker/dump_gen.py
===================================================================
--- /trunk/src/VBox/GuestHost/OpenGL/state_tracker/dump_gen.py	(revision 46514)
+++ /trunk/src/VBox/GuestHost/OpenGL/state_tracker/dump_gen.py	(revision 46515)
@@ -128,2 +128,132 @@
 #endif
 """
+
+from get_components import *;
+
+texenv_mappings = {
+    'GL_TEXTURE_ENV' : [
+        'GL_TEXTURE_ENV_MODE',
+        'GL_TEXTURE_ENV_COLOR',
+        'GL_COMBINE_RGB',
+        'GL_COMBINE_ALPHA',
+        'GL_RGB_SCALE',
+        'GL_ALPHA_SCALE', 
+        'GL_SRC0_RGB',
+        'GL_SRC1_RGB',
+        'GL_SRC2_RGB',
+        'GL_SRC0_ALPHA',
+        'GL_SRC1_ALPHA',
+        'GL_SRC2_ALPHA'
+    ],
+    'GL_TEXTURE_FILTER_CONTROL' : [
+        'GL_TEXTURE_LOD_BIAS'
+    ],
+    'GL_POINT_SPRITE' : [
+        'GL_COORD_REPLACE'
+    ]
+}
+
+texgen_coords = [
+    'GL_S',
+    'GL_T',
+    'GL_R',
+    'GL_Q'
+]
+
+texgen_names = [
+    'GL_TEXTURE_GEN_MODE',
+    'GL_OBJECT_PLANE',
+    'GL_EYE_PLANE'
+]
+
+texparam_names = [
+    'GL_TEXTURE_MAG_FILTER', 
+    'GL_TEXTURE_MIN_FILTER',
+    'GL_TEXTURE_MIN_LOD',
+    'GL_TEXTURE_MAX_LOD',
+    'GL_TEXTURE_BASE_LEVEL',
+    'GL_TEXTURE_MAX_LEVEL',
+    'GL_TEXTURE_WRAP_S',
+    'GL_TEXTURE_WRAP_T',
+    'GL_TEXTURE_WRAP_R',
+    'GL_TEXTURE_BORDER_COLOR',
+    'GL_TEXTURE_PRIORITY',
+    'GL_TEXTURE_RESIDENT',
+    'GL_TEXTURE_COMPARE_MODE',
+    'GL_TEXTURE_COMPARE_FUNC',
+    'GL_DEPTH_TEXTURE_MODE',
+    'GL_GENERATE_MIPMAP'
+]
+
+print """
+void crRecDumpTexParam(CR_RECORDER *pRec, CRContext *ctx, GLenum enmTarget)
+{
+    GLfloat afBuf[4];
+    char acBuf[1024];
+    unsigned int cComponents;
+    crDmpStrF(pRec->pDumper, "==TEX_PARAM for target(0x%x)==", enmTarget);
+"""
+for pname in texparam_names:
+    print "\tcComponents = lookupComponents(%s);" % pname
+    print "\tAssert(cComponents <= RT_ELEMENTS(afBuf));"
+    print "\tmemset(afBuf, 0, sizeof (afBuf));"
+    print "\tpRec->pDispatch->GetTexParameterfv(enmTarget, %s, afBuf);" % pname
+    print "\tcrDmpFormatArray(acBuf, sizeof (acBuf), \"%f\", sizeof (afBuf[0]), afBuf, cComponents);"
+    print "\tcrDmpStrF(pRec->pDumper, \"%s = %%s;\", acBuf);" % pname
+print """
+    crDmpStrF(pRec->pDumper, "==Done TEX_PARAM for target(0x%x)==", enmTarget);
+}
+"""
+
+print """
+void crRecDumpTexEnv(CR_RECORDER *pRec, CRContext *ctx)
+{
+    GLfloat afBuf[4];
+    char acBuf[1024];
+    unsigned int cComponents;
+    crDmpStrF(pRec->pDumper, "==TEX_ENV==");
+"""
+
+keys = texenv_mappings.keys()
+keys.sort();
+
+for target in keys:
+    print "\tcrDmpStrF(pRec->pDumper, \"===%s===\");" % target
+    values = texenv_mappings[target]
+    for pname in values:
+        print "\tcComponents = lookupComponents(%s);" % pname
+        print "\tAssert(cComponents <= RT_ELEMENTS(afBuf));"
+        print "\tmemset(afBuf, 0, sizeof (afBuf));"
+        print "\tpRec->pDispatch->GetTexEnvfv(%s, %s, afBuf);" % (target, pname)
+        print "\tcrDmpFormatArray(acBuf, sizeof (acBuf), \"%f\", sizeof (afBuf[0]), afBuf, cComponents);"
+        print "\tcrDmpStrF(pRec->pDumper, \"%s = %%s;\", acBuf);" % pname
+    print "\tcrDmpStrF(pRec->pDumper, \"===Done %s===\");" % target
+print """
+    crDmpStrF(pRec->pDumper, "==Done TEX_ENV==");
+}
+"""
+
+
+print """
+void crRecDumpTexGen(CR_RECORDER *pRec, CRContext *ctx)
+{
+    GLdouble afBuf[4];
+    char acBuf[1024];
+    unsigned int cComponents;
+    crDmpStrF(pRec->pDumper, "==TEX_GEN==");
+"""
+
+for coord in texgen_coords:
+    print "\tcrDmpStrF(pRec->pDumper, \"===%s===\");" % coord
+    for pname in texgen_names:
+        print "\tcComponents = lookupComponents(%s);" % pname
+        print "\tAssert(cComponents <= RT_ELEMENTS(afBuf));"
+        print "\tmemset(afBuf, 0, sizeof (afBuf));"
+        print "\tpRec->pDispatch->GetTexGendv(%s, %s, afBuf);" % (coord, pname)
+        print "\tcrDmpFormatArray(acBuf, sizeof (acBuf), \"%f\", sizeof (afBuf[0]), afBuf, cComponents);"
+        print "\tcrDmpStrF(pRec->pDumper, \"%s = %%s;\", acBuf);" % pname
+    print "\tcrDmpStrF(pRec->pDumper, \"===Done %s===\");" % coord
+print """
+    crDmpStrF(pRec->pDumper, "==Done TEX_GEN==");
+}
+"""
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h	(revision 46514)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server.h	(revision 46515)
@@ -395,5 +395,8 @@
 void crServerDumpProgram(GLint id);
 void crServerDumpCurrentProgram();
+void crServerDumpRecompileDumpCurrentProgram();
+void crServerRecompileCurrentProgram();
 void crServerDumpCurrentProgramUniforms();
+void crServerDumpCurrentProgramAttribs();
 void crServerDumpFramesCheck();
 void crServerDumpState();
@@ -456,17 +459,21 @@
 #define CR_SERVER_DUMP_F_DRAW_BUFF_ENTER        0x00000001
 #define CR_SERVER_DUMP_F_DRAW_BUFF_LEAVE        0x00000002
+#define CR_SERVER_DUMP_F_DRAW_STATE_ENTER       0x00000004
+#define CR_SERVER_DUMP_F_DRAW_STATE_LEAVE       0x00000008
 #define CR_SERVER_DUMP_F_DRAW_TEX_ENTER         0x00000010
 #define CR_SERVER_DUMP_F_DRAW_TEX_LEAVE         0x00000020
-#define CR_SERVER_DUMP_F_DRAW_PROGRAM_ENTER     0x00000100
-#define CR_SERVER_DUMP_F_DRAW_PROGRAM_LEAVE     0x00000200
-#define CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_ENTER     0x00000400
-#define CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_LEAVE     0x00000800
-#define CR_SERVER_DUMP_F_DRAW_STATE_ENTER                0x00000004
-#define CR_SERVER_DUMP_F_DRAW_STATE_LEAVE                0x00000008
+#define CR_SERVER_DUMP_F_DRAW_PROGRAM_ENTER     0x00000040
+#define CR_SERVER_DUMP_F_DRAW_PROGRAM_LEAVE     0x00000080
+#define CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_ENTER     0x00000100
+#define CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_LEAVE     0x00000200
+#define CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_ENTER      0x00000400
+#define CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_LEAVE      0x00000800
+
 #define CR_SERVER_DUMP_F_DRAW_ENTER_ALL (CR_SERVER_DUMP_F_DRAW_BUFF_ENTER \
         | CR_SERVER_DUMP_F_DRAW_TEX_ENTER \
         | CR_SERVER_DUMP_F_DRAW_PROGRAM_ENTER \
         | CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_ENTER \
-        | CR_SERVER_DUMP_F_DRAW_STATE_ENTER)
+        | CR_SERVER_DUMP_F_DRAW_STATE_ENTER \
+        | CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_ENTER)
 
 #define CR_SERVER_DUMP_F_DRAW_LEAVE_ALL (CR_SERVER_DUMP_F_DRAW_BUFF_LEAVE \
@@ -474,14 +481,15 @@
         | CR_SERVER_DUMP_F_DRAW_PROGRAM_LEAVE \
         | CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_LEAVE \
-        | CR_SERVER_DUMP_F_DRAW_STATE_LEAVE)
+        | CR_SERVER_DUMP_F_DRAW_STATE_LEAVE \
+        | CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_LEAVE)
 
 #define CR_SERVER_DUMP_F_DRAW_ALL (CR_SERVER_DUMP_F_DRAW_ENTER_ALL | CR_SERVER_DUMP_F_DRAW_LEAVE_ALL)
 
-#define CR_SERVER_DUMP_F_COMPILE_SHADER         0x00001000
-#define CR_SERVER_DUMP_F_SHADER_SOURCE          0x00002000
-#define CR_SERVER_DUMP_F_LINK_PROGRAM           0x00004000
 #define CR_SERVER_DUMP_F_SWAPBUFFERS_ENTER      0x00010000
 #define CR_SERVER_DUMP_F_SWAPBUFFERS_LEAVE      0x00020000
 #define CR_SERVER_DUMP_F_DRAWEL                 0x00100000
+#define CR_SERVER_DUMP_F_COMPILE_SHADER         0x01000000
+#define CR_SERVER_DUMP_F_SHADER_SOURCE          0x02000000
+#define CR_SERVER_DUMP_F_LINK_PROGRAM           0x04000000
 
 
@@ -497,11 +505,12 @@
             if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_DRAW_ENTER_ALL, cr_server.Recorder.pDumper)) break; \
             crServerDumpCheckInit(); \
-            crDmpStrF(cr_server.Recorder.pDumper, "==> %s", __FUNCTION__); \
+            crDmpStrF(cr_server.Recorder.pDumper, "==ENTER %s==", __FUNCTION__); \
             if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_STATE_ENTER, cr_server.Recorder.pDumper)) { crServerDumpState(); } \
             if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_PROGRAM_ENTER, cr_server.Recorder.pDumper)) { crServerDumpCurrentProgram(); } \
             if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_ENTER, cr_server.Recorder.pDumper)) { crServerDumpCurrentProgramUniforms(); } \
+            if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_ENTER, cr_server.Recorder.pDumper)) { crServerDumpCurrentProgramAttribs(); } \
             if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_TEX_ENTER, cr_server.Recorder.pDumper)) { crServerDumpTextures(); } \
             if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_BUFF_ENTER, cr_server.Recorder.pDumper)) { crServerDumpBuffer(-1); } \
-            crDmpStrF(cr_server.Recorder.pDumper, "=================="); \
+            crDmpStrF(cr_server.Recorder.pDumper, "==Done ENTER %s==", __FUNCTION__); \
         } while (0)
 
@@ -509,11 +518,12 @@
             if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_DRAW_LEAVE_ALL, cr_server.Recorder.pDumper)) break; \
             crServerDumpCheckInit(); \
-            crDmpStrF(cr_server.Recorder.pDumper, "<== %s", __FUNCTION__); \
+            crDmpStrF(cr_server.Recorder.pDumper, "==LEAVE %s==", __FUNCTION__); \
             if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_TEX_LEAVE, cr_server.Recorder.pDumper)) { crServerDumpTextures(); } \
             if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_BUFF_LEAVE, cr_server.Recorder.pDumper)) { crServerDumpBuffer(-1); } \
             if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_LEAVE, cr_server.Recorder.pDumper)) { crServerDumpCurrentProgramUniforms(); } \
+            if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_LEAVE, cr_server.Recorder.pDumper)) { crServerDumpCurrentProgramAttribs(); } \
             if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_PROGRAM_LEAVE, cr_server.Recorder.pDumper)) { crServerDumpCurrentProgram(); } \
             if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_DRAW_STATE_LEAVE, cr_server.Recorder.pDumper)) { crServerDumpState(); } \
-            crDmpStrF(cr_server.Recorder.pDumper, "=================="); \
+            crDmpStrF(cr_server.Recorder.pDumper, "==Done LEAVE %s==", __FUNCTION__); \
         } while (0)
 
@@ -529,7 +539,7 @@
             if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_SHADER_SOURCE, cr_server.Recorder.pDumper)) break; \
             crServerDumpCheckInit(); \
-            crDmpStrF(cr_server.Recorder.pDumper, "== %s", __FUNCTION__); \
+            crDmpStrF(cr_server.Recorder.pDumper, "==%s==", __FUNCTION__); \
             crServerDumpShader((_id)); \
-            crDmpStrF(cr_server.Recorder.pDumper, "====="); \
+            crDmpStrF(cr_server.Recorder.pDumper, "==Done %s==", __FUNCTION__); \
         } while (0)
 
@@ -537,7 +547,7 @@
             if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_LINK_PROGRAM, cr_server.Recorder.pDumper)) break; \
             crServerDumpCheckInit(); \
-            crDmpStrF(cr_server.Recorder.pDumper, "== %s", __FUNCTION__); \
+            crDmpStrF(cr_server.Recorder.pDumper, "==%s==", __FUNCTION__); \
             crServerDumpProgram((_id)); \
-            crDmpStrF(cr_server.Recorder.pDumper, "====="); \
+            crDmpStrF(cr_server.Recorder.pDumper, "==Done %s==", __FUNCTION__); \
         } while (0)
 
@@ -545,13 +555,15 @@
             if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_SWAPBUFFERS_ENTER, cr_server.Recorder.pDumper)) break; \
             crServerDumpCheckInit(); \
-            crDmpStrF(cr_server.Recorder.pDumper, "== %s", __FUNCTION__); \
+            crDmpStrF(cr_server.Recorder.pDumper, "==ENTER %s==", __FUNCTION__); \
             if (CR_SERVER_DUMP_FILTER_DMP(CR_SERVER_DUMP_F_SWAPBUFFERS_ENTER, cr_server.Recorder.pDumper)) { crServerDumpBuffer(CR_SERVER_FBO_BB_IDX(cr_server.currentMural)); } \
             if (g_CrDbgDumpDrawFramesCount) { crServerDumpFramesCheck(); } \
+            crDmpStrF(cr_server.Recorder.pDumper, "==Done ENTER %s==", __FUNCTION__); \
         } while (0)
 
 #define CR_SERVER_DUMP_SWAPBUFFERS_LEAVE() do { \
             if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_SWAPBUFFERS_LEAVE, cr_server.Recorder.pDumper)) break; \
-            crServerDumpCheckInit(); \
-            crDmpStrF(cr_server.Recorder.pDumper, "== %s", __FUNCTION__); \
+            crDmpStrF(cr_server.Recorder.pDumper, "==LEAVE %s==", __FUNCTION__); \
+            crServerDumpCheckInit(); \
+            crDmpStrF(cr_server.Recorder.pDumper, "==Done LEAVE %s==", __FUNCTION__); \
         } while (0)
 
@@ -559,5 +571,5 @@
         if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_DRAWEL, cr_server.Recorder.pDumper)) break; \
         crServerDumpCheckInit(); \
-        crDmpStrF(cr_server.Recorder.pDumper, "== %s", __FUNCTION__); \
+        crDmpStrF(cr_server.Recorder.pDumper, "==%s==", __FUNCTION__); \
         crServerDumpDrawel _msg; \
     } while (0)
@@ -566,5 +578,5 @@
         if (!CR_SERVER_DUMP_FILTER_OP(CR_SERVER_DUMP_F_DRAWEL, cr_server.Recorder.pDumper)) break; \
         crServerDumpCheckInit(); \
-        crDmpStrF(cr_server.Recorder.pDumper, "== %s", __FUNCTION__); \
+        crDmpStrF(cr_server.Recorder.pDumper, "==%s==", __FUNCTION__); \
         crServerDumpDrawelv((_index), (_pszElFormat), (_cbEl), (_pvVal), (_cVal)); \
     } while (0)
Index: /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_misc.c
===================================================================
--- /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_misc.c	(revision 46514)
+++ /trunk/src/VBox/HostServices/SharedOpenGL/crserverlib/server_misc.c	(revision 46515)
@@ -1396,11 +1396,14 @@
 unsigned long g_CrDbgDumpDraw = CR_SERVER_DUMP_F_COMPILE_SHADER
         | CR_SERVER_DUMP_F_LINK_PROGRAM
+        | CR_SERVER_DUMP_F_DRAW_BUFF_ENTER
         | CR_SERVER_DUMP_F_DRAW_BUFF_LEAVE
         | CR_SERVER_DUMP_F_DRAW_PROGRAM_UNIFORMS_ENTER
-        | CR_SERVER_DUMP_F_DRAW_TEX_LEAVE
+        | CR_SERVER_DUMP_F_DRAW_PROGRAM_ATTRIBS_ENTER
+        | CR_SERVER_DUMP_F_DRAW_TEX_ENTER
         | CR_SERVER_DUMP_F_DRAW_PROGRAM_ENTER
         | CR_SERVER_DUMP_F_DRAW_STATE_ENTER
         | CR_SERVER_DUMP_F_SWAPBUFFERS_ENTER
         | CR_SERVER_DUMP_F_DRAWEL
+        | CR_SERVER_DUMP_F_SHADER_SOURCE
         ; //CR_SERVER_DUMP_F_DRAW_BUFF_ENTER | CR_SERVER_DUMP_F_DRAW_BUFF_LEAVE;
 unsigned long g_CrDbgDumpDrawFramesSettings = CR_SERVER_DUMP_F_DRAW_BUFF_ENTER
@@ -1487,8 +1490,39 @@
 }
 
+void crServerDumpRecompileDumpCurrentProgram()
+{
+    crDmpStrF(cr_server.Recorder.pDumper, "==Dump(1)==");
+    crServerRecompileCurrentProgram();
+    crServerDumpCurrentProgramUniforms();
+    crServerDumpCurrentProgramAttribs();
+    crDmpStrF(cr_server.Recorder.pDumper, "Done Dump(1)");
+    crServerRecompileCurrentProgram();
+    crDmpStrF(cr_server.Recorder.pDumper, "Dump(2)");
+    crServerRecompileCurrentProgram();
+    crServerDumpCurrentProgramUniforms();
+    crServerDumpCurrentProgramAttribs();
+    crDmpStrF(cr_server.Recorder.pDumper, "Done Dump(2)");
+}
+
+void crServerRecompileCurrentProgram()
+{
+    CRContext *ctx = crStateGetCurrent();
+    crRecRecompileCurrentProgram(&cr_server.Recorder, ctx);
+}
+
 void crServerDumpCurrentProgramUniforms()
 {
     CRContext *ctx = crStateGetCurrent();
+    crDmpStrF(cr_server.Recorder.pDumper, "==Uniforms==");
     crRecDumpCurrentProgramUniforms(&cr_server.Recorder, ctx);
+    crDmpStrF(cr_server.Recorder.pDumper, "==Done Uniforms==");
+}
+
+void crServerDumpCurrentProgramAttribs()
+{
+    CRContext *ctx = crStateGetCurrent();
+    crDmpStrF(cr_server.Recorder.pDumper, "==Attribs==");
+    crRecDumpCurrentProgramAttribs(&cr_server.Recorder, ctx);
+    crDmpStrF(cr_server.Recorder.pDumper, "==Done Attribs==");
 }
 
