12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync * Blitter API implementation
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync * Copyright (C) 2013 Oracle Corporation
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync * This file is part of VirtualBox Open Source Edition (OSE), as
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync * available from http://www.virtualbox.org. This file is free software;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync * you can redistribute it and/or modify it under the terms of the GNU
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync * General Public License (GPL) as published by the Free Software
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync * Foundation, in version 2 as it comes in the "COPYING" file of the
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync * VirtualBox OSE distribution. VirtualBox OSE is distributed in the
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind.
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync/* dump stuff */
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid crDmpImgBmp(CR_BLITTER_IMG *pImg, const char *pszFilename)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bf.bfSize = sizeof (VBOX_BITMAPFILEHEADER) + sizeof (VBOX_BITMAPINFOHEADER) + pImg->cbData;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bf.bfOffBits = sizeof (VBOX_BITMAPFILEHEADER) + sizeof (VBOX_BITMAPINFOHEADER);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic void crDmpHashtableSearchByHwidCB(unsigned long key, void *pData1, void *pData2)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRDUMPGETHWID_DATA *pData = (CRDUMPGETHWID_DATA*)pData2;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid* crDmpHashtableSearchByHwid(CRHashTable *pHash, GLuint hwid, PFNCRDUMPGETHWID pfnGetHwid, unsigned long *pKey)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crHashtableWalk(pHash, crDmpHashtableSearchByHwidCB, &Data);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid crServerDumpFindTexCb(unsigned long key, void *pData1, void *pData2)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_SERVER_DUMP_FIND_TEX *pTex = (CR_SERVER_DUMP_FIND_TEX*)pData2;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#define CR_DUMP_MAKE_CASE(_val) case _val: return #_val
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#define CR_DUMP_MAKE_CASE_UNKNOWN(_val, _str, _pDumper) default: { \
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF((_pDumper), "WARNING: %s %d", (_str), _val); \
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return (_str); \
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncDECLINLINE(size_t) crDmpFormatVal(char *pString, size_t cbString, const char *pszElFormat, uint32_t cbVal, const void *pvVal)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync if (pszElFormat[0] != '%' || pszElFormat[1] == '\0')
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return sprintf_s(pString, cbString, pszElFormat, *((double*)pvVal));
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync /* we do not care only about type specifiers, all the rest is not accepted */
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync /* float would be promoted to double */
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return sprintf_s(pString, cbString, pszElFormat, *((float*)pvVal));
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return sprintf_s(pString, cbString, pszElFormat, *((uint32_t*)pvVal));
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return sprintf_s(pString, cbString, pszElFormat, *((uint16_t*)pvVal));
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return sprintf_s(pString, cbString, pszElFormat, *((uint8_t*)pvVal));
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncVBOXDUMPDECL(size_t) crDmpFormatRawArray(char *pString, size_t cbString, const char *pszElFormat, uint32_t cbEl, const void *pvVal, uint32_t cVal)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync cbWritten = crDmpFormatVal(pString, cbString, pszElFormat, cbEl, (const void *)pu8Val);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncVBOXDUMPDECL(size_t) crDmpFormatMatrixArray(char *pString, size_t cbString, const char *pszElFormat, uint32_t cbEl, const void *pvVal, uint32_t cX, uint32_t cY)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync cbWritten = crDmpFormatRawArray(pString, cbString, pszElFormat, cbEl, (const void *)pu8Val, cX);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncVBOXDUMPDECL(size_t) crDmpFormatArray(char *pString, size_t cbString, const char *pszElFormat, uint32_t cbEl, const void *pvVal, uint32_t cVal)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return crDmpFormatVal(pString, cbString, pszElFormat, cbEl, pvVal);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return crDmpFormatMatrixArray(pString, cbString, pszElFormat, cbEl, pvVal, 4, 4);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return crDmpFormatMatrixArray(pString, cbString, pszElFormat, cbEl, pvVal, 3, 3);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return crDmpFormatRawArray(pString, cbString, pszElFormat, cbEl, pvVal, cVal);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncVBOXDUMPDECL(void) crRecDumpVertAttrv(CR_RECORDER *pRec, CRContext *ctx, GLuint idx, const char*pszElFormat, uint32_t cbEl, const void *pvVal, uint32_t cVal)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync crDmpFormatRawArray(aBuf, sizeof (aBuf), pszElFormat, cbEl, pvVal, cVal);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncVBOXDUMPDECL(void) crRecDumpVertAttrV(CR_RECORDER *pRec, CRContext *ctx, const char*pszFormat, va_list pArgList)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncVBOXDUMPDECL(void) crRecDumpVertAttrF(CR_RECORDER *pRec, CRContext *ctx, const char*pszFormat, ...)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync crRecDumpVertAttrV(pRec, ctx, pszFormat, pArgList);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncvoid crRecDumpBuffer(CR_RECORDER *pRec, CRContext *ctx, GLint idRedirFBO, VBOXVR_TEXTURE *pRedirTex)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint hwTex = 0, hwObjType = 0, hwTexLevel = 0, hwCubeFace = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_DRAW_BUFFER, &hwDrawBuf);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_FRAMEBUFFER_BINDING, &hwBuf);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetFramebufferAttachmentParameterivEXT(GL_DRAW_FRAMEBUFFER, hwDrawBuf, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME, &hwTex);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetFramebufferAttachmentParameterivEXT(GL_DRAW_FRAMEBUFFER, hwDrawBuf, GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE, &hwObjType);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetFramebufferAttachmentParameterivEXT(GL_DRAW_FRAMEBUFFER, hwDrawBuf, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL, &hwTexLevel);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetFramebufferAttachmentParameterivEXT(GL_DRAW_FRAMEBUFFER, hwDrawBuf, GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE, &hwCubeFace);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("non-zero tex level attached, unsupported");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLuint iColor = (hwDrawBuf - GL_COLOR_ATTACHMENT0_EXT);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRTextureObj *pTobj = (CRTextureObj *)crHashtableSearch(ctx->shared->textureTable, ctx->framebufferobject.drawFB->color[iColor].name);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(iColor < RT_ELEMENTS(ctx->framebufferobject.drawFB->color));
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->framebufferobject.drawFB->hwid == hwBuf);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->framebufferobject.drawFB->drawbuffer[0] == hwDrawBuf);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->framebufferobject.drawFB->color[iColor].level == hwTexLevel);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->framebufferobject.drawFB->color[iColor].type == hwObjType);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetTexLevelParameteriv(texTarget, hwTexLevel, GL_TEXTURE_WIDTH, &width);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetTexLevelParameteriv(texTarget, hwTexLevel, GL_TEXTURE_HEIGHT, &height);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetTexLevelParameteriv(texTarget, hwTexLevel, GL_TEXTURE_DEPTH, &depth);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("pRedirTex is expected for non-FBO state!");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync rc = CrBltImgGetTex(pRec->pBlitter, &Tex, GL_BGRA, &Img);
78be54197d4b03ee467a9a20d041b4018ee47091vboxsync crDmpImgF(pRec->pDumper, &Img, "ctx(%d), BUFFER: id(%d) hwid(%d), width(%d), height(%d)", ctx, id, Tex.hwid, width, height);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crDmpImgF(pRec->pDumper, &AlphaImg, "Buffer ALPHA Data");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic const char *crRecDumpShaderTypeString(GLenum enmType, CR_DUMPER *pDumper)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE_UNKNOWN(enmType, "Unknown Shader Type", pDumper);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic const char *crRecDumpVarTypeString(GLenum enmType, CR_DUMPER *pDumper)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE_UNKNOWN(enmType, "Unknown Variable Type", pDumper);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic char *crRecDumpGetLine(char **ppszStr, uint32_t *pcbStr)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync /* zero-length string */
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("string should be null-rerminated, forcing it!");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync /* the string contains a single line! */
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pcbStr = cbStr - (((uintptr_t)pNewLine) - ((uintptr_t)pszStr)) - 1;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic void crRecDumpStrByLine(CR_DUMPER *pDumper, char *pszStr, uint32_t cbStr)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync while ((pszCurLine = crRecDumpGetLine(&pszStr, &cbStr)) != NULL)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic DECLCALLBACK(GLuint) crDmpGetHwidShaderCB(void *pvObj)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic DECLCALLBACK(GLuint) crDmpGetHwidProgramCB(void *pvObj)
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync/* Context activation is done by the caller. */
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_INFO_LOG_LENGTH_ARB, &cbLog);
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync GLchar *pszLog = (GLchar *) crAlloc(cbLog*sizeof (GLchar));
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync pRec->pDispatch->GetInfoLogARB(hwid, cbLog, NULL, pszLog);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid crRecDumpShader(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pShad = (CRGLSLShader *)crDmpHashtableSearchByHwid(ctx->glsl.shaders, hwid, crDmpGetHwidShaderCB, &tstKey);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pShad = (CRGLSLShader *)crHashtableSearch(ctx->glsl.shaders, id);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_SUBTYPE_ARB, &type);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_COMPILE_STATUS_ARB, &compileStatus);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pRec->pDumper, "SHADER ctx(%d) id(%d) hwid(%d) type(%s) status(%d):", ctx->id, id, hwid, crRecDumpShaderTypeString(type, pRec->pDumper), compileStatus);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_SHADER_SOURCE_LENGTH_ARB, &length);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pRec->pDumper, "WARNING: crCalloc failed");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetShaderSource(hwid, length, NULL, pszSource);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crRecDumpStrByLine(pRec->pDumper, pszSource, length);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid crRecDumpProgram(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pProg = (CRGLSLProgram*)crDmpHashtableSearchByHwid(ctx->glsl.programs, hwid, crDmpGetHwidProgramCB, &tstKey);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pProg = (CRGLSLProgram *) crHashtableSearch(ctx->glsl.programs, id);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_ATTACHED_OBJECTS_ARB, &cShaders);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_LINK_STATUS_ARB, &linkStatus);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pRec->pDumper, "PROGRAM ctx(%d) id(%d) hwid(%d) status(%d) shaders(%d):", ctx->id, id, hwid, linkStatus, cShaders);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync VBoxGLhandleARB *pShaders = (VBoxGLhandleARB*)crCalloc(cShaders * sizeof (*pShaders));
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pRec->pDumper, "WARNING: crCalloc failed");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetAttachedObjectsARB(hwid, cShaders, NULL, pShaders);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crDmpStrF(pRec->pDumper, "WARNING: Shader[%d] is null", i);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_INFO_LOG_LENGTH_ARB, &cbLog);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetInfoLogARB(hwid, cbLog, NULL, pszLog);
e20b6c04833c7afc840681167235afc1e1376f34vboxsyncvoid crRecRecompileShader(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pShad = (CRGLSLShader *)crDmpHashtableSearchByHwid(ctx->glsl.shaders, hwid, crDmpGetHwidShaderCB, &tstKey);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pShad = (CRGLSLShader *)crHashtableSearch(ctx->glsl.shaders, id);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_SUBTYPE_ARB, &type);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_COMPILE_STATUS_ARB, &compileStatus);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "==RECOMPILE SHADER ctx(%d) id(%d) hwid(%d) type(%s) status(%d)==", ctx->id, id, hwid, crRecDumpShaderTypeString(type, pRec->pDumper), compileStatus);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync while ((status = pRec->pDispatch->GetError()) != GL_NO_ERROR) {/*Assert(0);*/}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync while ((status = pRec->pDispatch->GetError()) != GL_NO_ERROR) {Assert(0);}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_COMPILE_STATUS_ARB, &compileStatus);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "==Done RECOMPILE SHADER, status(%d)==", compileStatus);
e20b6c04833c7afc840681167235afc1e1376f34vboxsyncvoid crRecRecompileProgram(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pProg = (CRGLSLProgram*)crDmpHashtableSearchByHwid(ctx->glsl.programs, hwid, crDmpGetHwidProgramCB, &tstKey);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pProg = (CRGLSLProgram *) crHashtableSearch(ctx->glsl.programs, id);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_ATTACHED_OBJECTS_ARB, &cShaders);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_LINK_STATUS_ARB, &linkStatus);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "==RECOMPILE PROGRAM ctx(%d) id(%d) hwid(%d) status(%d) shaders(%d)==", ctx->id, id, hwid, linkStatus, cShaders);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync VBoxGLhandleARB *pShaders = (VBoxGLhandleARB*)crCalloc(cShaders * sizeof (*pShaders));
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "WARNING: crCalloc failed");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetAttachedObjectsARB(hwid, cShaders, NULL, pShaders);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync while ((status = pRec->pDispatch->GetError()) != GL_NO_ERROR) {/*Assert(0);*/}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync while ((status = pRec->pDispatch->GetError()) != GL_NO_ERROR) {Assert(0);}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_LINK_STATUS_ARB, &linkStatus);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "==Done RECOMPILE PROGRAM, status(%d)==", linkStatus);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncVBOXDUMPDECL(void) crRecDumpCurrentProgram(CR_RECORDER *pRec, CRContext *ctx)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_CURRENT_PROGRAM, &curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("no active program state with active hw program");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->glsl.activeProgram->hwid == curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid crRecDumpProgramUniforms(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pProg = (CRGLSLProgram*)crDmpHashtableSearchByHwid(ctx->glsl.programs, hwid, crDmpGetHwidProgramCB, &tstKey);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pProg = (CRGLSLProgram *) crHashtableSearch(ctx->glsl.programs, id);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint maxUniformLen = 0, activeUniforms = 0, i, j, uniformsCount = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetProgramiv(hwid, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxUniformLen);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetProgramiv(hwid, GL_ACTIVE_UNIFORMS, &activeUniforms);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("activeUniforms (%d), while maxUniformLen is zero", activeUniforms);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pszName = (GLchar *) crAlloc((maxUniformLen+8)*sizeof(GLchar));
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("crRecDumpProgramUniforms: out of memory");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync for (i=0; i<activeUniforms; ++i)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetActiveUniform(hwid, i, maxUniformLen, NULL, &size, &type, pszName);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync for (i=0; i<activeUniforms; ++i)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetActiveUniform(hwid, i, maxUniformLen, NULL, &size, &type, pszName);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pRec->pDumper, "%s %s[%d];", crRecDumpVarTypeString(type, pRec->pDumper), pszName, size);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pRec->pDumper, "%s %s;", crRecDumpVarTypeString(type, pRec->pDumper), pszName);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint uniformTypeSize = crStateGetUniformSize(type);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync for (j=0; j<size; ++j)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync location = pRec->pDispatch->GetUniformLocation(hwid, pszName);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetUniformiv(hwid, location, &idata[0]);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = %d; //location %d", pszName, idata[0], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%d, %d}; //location %d", pszName, idata[0], idata[1], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d}; //location %d", pszName, idata[0], idata[1], idata[2], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d, %d}; //location %d", pszName, idata[0], idata[1], idata[2], idata[3], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s[%d] = %d; //location %d", pszName, k, idata[k], location);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetUniformfv(hwid, location, &fdata[0]);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = %f; //location %d", pszName, fdata[0], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%f, %f}; //location %d", pszName, fdata[0], fdata[1], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f}; //location %d", pszName, fdata[0], fdata[1], fdata[2], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f, %f}; //location %d", pszName, fdata[0], fdata[1], fdata[2], fdata[3], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s[%d] = %f; //location %d", pszName, k, fdata[k], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsyncvoid crRecDumpProgramAttribs(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pProg = (CRGLSLProgram*)crDmpHashtableSearchByHwid(ctx->glsl.programs, hwid, crDmpGetHwidProgramCB, &tstKey);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pProg = (CRGLSLProgram *) crHashtableSearch(ctx->glsl.programs, id);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLint maxAttribLen = 0, activeAttrib = 0, i, j, attribCount = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetProgramiv(hwid, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxAttribLen);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetProgramiv(hwid, GL_ACTIVE_ATTRIBUTES, &activeAttrib);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crWarning("activeAttrib (%d), while maxAttribLen is zero", activeAttrib);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pszName = (GLchar *) crAlloc((maxAttribLen+8)*sizeof(GLchar));
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crWarning("crRecDumpProgramAttrib: out of memory");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync for (i=0; i<activeAttrib; ++i)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetActiveAttrib(hwid, i, maxAttribLen, NULL, &size, &type, pszName);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync for (i=0; i<activeAttrib; ++i)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetActiveAttrib(hwid, i, maxAttribLen, NULL, &size, &type, pszName);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLint arrayBufferBind = 0, arrayEnabled = 0, arraySize = 0, arrayStride = 0, arrayType = 0, arrayNormalized = 0, arrayInteger = 0/*, arrayDivisor = 0*/;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING, &arrayBufferBind);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_ENABLED, &arrayEnabled);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_SIZE, &arraySize);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_STRIDE, &arrayStride);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_TYPE, &arrayType);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_NORMALIZED, &arrayNormalized);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_INTEGER, &arrayInteger);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync// pRec->pDispatch->GetVertexAttribivARB(i, GL_VERTEX_ATTRIB_ARRAY_DIVISOR, &arrayDivisor);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s %s[%d];", crRecDumpVarTypeString(type, pRec->pDumper), pszName, size);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s %s;", crRecDumpVarTypeString(type, pRec->pDumper), pszName);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync 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);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLint attribTypeSize = crStateGetUniformSize(type);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync for (j=0; j<size; ++j)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync location = pRec->pDispatch->GetAttribLocation(hwid, pszName);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetVertexAttribivARB(location, GL_CURRENT_VERTEX_ATTRIB, &idata[0]);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = %d; //location %d", pszName, idata[0], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%d, %d}; //location %d", pszName, idata[0], idata[1], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d}; //location %d", pszName, idata[0], idata[1], idata[2], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d, %d}; //location %d", pszName, idata[0], idata[1], idata[2], idata[3], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s[%d] = %d; //location %d", pszName, k, idata[k], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetVertexAttribfvARB(location, GL_CURRENT_VERTEX_ATTRIB, &fdata[0]);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = %f; //location %d", pszName, fdata[0], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%f, %f}; //location %d", pszName, fdata[0], fdata[1], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f}; //location %d", pszName, fdata[0], fdata[1], fdata[2], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f, %f}; //location %d", pszName, fdata[0], fdata[1], fdata[2], fdata[3], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s[%d] = %f; //location %d", pszName, k, fdata[k], location);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncVBOXDUMPDECL(void) crRecDumpCurrentProgramUniforms(CR_RECORDER *pRec, CRContext *ctx)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_CURRENT_PROGRAM, &curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("no active program state with active hw program");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->glsl.activeProgram->hwid == curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crRecDumpProgramUniforms(pRec, ctx, 0, curProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsyncVBOXDUMPDECL(void) crRecDumpCurrentProgramAttribs(CR_RECORDER *pRec, CRContext *ctx)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetIntegerv(GL_CURRENT_PROGRAM, &curProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crWarning("no active program state with active hw program");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(ctx->glsl.activeProgram->hwid == curProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsyncVBOXDUMPDECL(void) crRecRecompileCurrentProgram(CR_RECORDER *pRec, CRContext *ctx)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetIntegerv(GL_CURRENT_PROGRAM, &curProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crWarning("no active program state with active hw program");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(ctx->glsl.activeProgram->hwid == curProgram);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsyncint crRecAlphaImgCreate(const CR_BLITTER_IMG *pImg, CR_BLITTER_IMG *pAlphaImg)
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crWarning("unsupported format 0x%x", pImg->enmFormat);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync pAlphaImg->cbData = pAlphaImg->pitch * pImg->height;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync for (uint32_t ih = 0; ih < pAlphaImg->height; ++ih)
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync *pu32DstBuf = (0xff << 24) || (alpha << 16) || (alpha << 8) || alpha;
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncvoid crRecDumpTextureV(CR_RECORDER *pRec, const VBOXVR_TEXTURE *pTex, const char *pszStr, va_list pArgList)
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync rc = CrBltImgGetTex(pRec->pBlitter, pTex, GL_BGRA, &Img);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crDmpImgF(pRec->pDumper, &AlphaImg, "Texture ALPHA Data");
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncvoid crRecDumpTextureF(CR_RECORDER *pRec, const VBOXVR_TEXTURE *pTex, const char *pszStr, ...)
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncvoid crRecDumpTextureByIdV(CR_RECORDER *pRec, CRContext *ctx, GLint id, const char *pszStr, va_list pArgList)
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync CRTextureObj *pTobj = (CRTextureObj *)crHashtableSearch(ctx->shared->textureTable, id);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync CRTextureLevel *pTl = &pTobj->level[0][0 /* level */];
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncvoid crRecDumpTextureByIdF(CR_RECORDER *pRec, CRContext *ctx, GLint id, const char *pszStr, ...)
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync crRecDumpTextureByIdV(pRec, ctx, id, pszStr, pArgList);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncvoid crRecDumpTextures(CR_RECORDER *pRec, CRContext *ctx)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxUnits);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_CURRENT_PROGRAM, &curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->glsl.activeProgram && ctx->glsl.activeProgram->hwid == curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_ACTIVE_TEXTURE, &curTexUnit);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->texture.curTextureUnit == restoreTexUnit - GL_TEXTURE0);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync for (i = 0; i < maxUnits; ++i)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->ActiveTextureARB(i + GL_TEXTURE0);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync enabled1D = pRec->pDispatch->IsEnabled(GL_TEXTURE_1D);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync enabled2D = pRec->pDispatch->IsEnabled(GL_TEXTURE_2D);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync enabled3D = pRec->pDispatch->IsEnabled(GL_TEXTURE_3D);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync enabledCubeMap = pRec->pDispatch->IsEnabled(GL_TEXTURE_CUBE_MAP_ARB);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync enabledRect = pRec->pDispatch->IsEnabled(GL_TEXTURE_RECTANGLE_NV);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// if (enabled2D)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_TEXTURE_BINDING_2D, &hwTex);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRTextureLevel *pTl = &pTobj->level[0][0 /* level */];
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_WIDTH, &width);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_HEIGHT, &height);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetTexLevelParameteriv(GL_TEXTURE_2D, 0, GL_TEXTURE_DEPTH, &depth);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync crRecDumpTextureF(pRec, &Tex, "ctx(%d), Unit %d: TEXTURE_2D id(%d) hwid(%d), width(%d), height(%d)", ctx, i, pTobj->id, pTobj->hwid, width, height);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// Assert(!pTobj || pTobj->hwid == 0);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// crWarning("no TEXTURE_2D bound!");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// if (enabledRect)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_NV, &hwTex);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRTextureLevel *pTl = &pTobj->level[0][0 /* level */];
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetTexLevelParameteriv(GL_TEXTURE_RECTANGLE_NV, 0, GL_TEXTURE_WIDTH, &width);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetTexLevelParameteriv(GL_TEXTURE_RECTANGLE_NV, 0, GL_TEXTURE_HEIGHT, &height);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetTexLevelParameteriv(GL_TEXTURE_RECTANGLE_NV, 0, GL_TEXTURE_DEPTH, &depth);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync rc = CrBltImgGetTex(pRec->pBlitter, &Tex, GL_BGRA, &Img);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpImgF(pRec->pDumper, &Img, "Unit %d: TEXTURE_RECTANGLE data", i);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// Assert(!pTobj || pTobj->hwid == 0);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// crWarning("no TEXTURE_RECTANGLE bound!");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync RTStrPrintfV(szBuffer, sizeof (szBuffer), szString, pArgList);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic void crDmpPrintDmlCmd(const char* pszDesc, const char* pszCmd)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpPrint("<?dml?><exec cmd=\"%s\">%s</exec>, ( %s )\n", pszCmd, pszDesc, pszCmd);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid crDmpPrintDumpDmlCmd(const char* pszDesc, const void *pvData, uint32_t width, uint32_t height, uint32_t bpp, uint32_t pitch)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync sprintf(Cmd, "!vbvdbg.ms 0x%p 0n%d 0n%d 0n%d 0n%d", pvData, width, height, bpp, pitch);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncDECLCALLBACK(void) crDmpDumpImgDmlBreak(struct CR_DUMPER * pDumper, CR_BLITTER_IMG *pImg, const char*pszEntryDesc)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpPrintDumpDmlCmd(pszEntryDesc, pImg->pvData, pImg->width, pImg->height, pImg->bpp, pImg->pitch);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncDECLCALLBACK(void) crDmpDumpStrDbgPrint(struct CR_DUMPER * pDumper, const char*pszStr)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic void crDmpHtmlDumpStrExact(struct CR_HTML_DUMPER * pDumper, const char *pszStr)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic DECLCALLBACK(void) crDmpHtmlDumpStr(struct CR_DUMPER * pDumper, const char*pszStr)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_HTML_DUMPER * pHtmlDumper = (CR_HTML_DUMPER*)pDumper;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fprintf(pHtmlDumper->pFile, "<pre>%s</pre>\n", pszStr);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic DECLCALLBACK(void) crDmpHtmlDumpImg(struct CR_DUMPER * pDumper, CR_BLITTER_IMG *pImg, const char*pszEntryDesc)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_HTML_DUMPER * pHtmlDumper = (CR_HTML_DUMPER*)pDumper;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync size_t cbWritten = RTStrPrintf(szBuffer, sizeof(szBuffer), "%s/", pHtmlDumper->pszDir);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync RTStrPrintf(pszFileName, sizeof(szBuffer) - cbWritten, "img%d.bmp", ++pHtmlDumper->cImg);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fprintf(pHtmlDumper->pFile, "<a href=\"%s\"><pre>%s</pre><img src=\"%s\" alt=\"%s\" width=\"150\" height=\"100\" /></a><br>\n",
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pszFileName, pszEntryDesc, pszFileName, pszEntryDesc);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic void crDmpHtmlPrintHeader(struct CR_HTML_DUMPER * pDumper)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic void crDmpHtmlPrintFooter(struct CR_HTML_DUMPER * pDumper)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncDECLEXPORT(bool) crDmpHtmlIsInited(struct CR_HTML_DUMPER * pDumper)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncDECLEXPORT(void) crDmpHtmlTerm(struct CR_HTML_DUMPER * pDumper)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncDECLEXPORT(int) crDmpHtmlInit(struct CR_HTML_DUMPER * pDumper, const char *pszDir, const char *pszFile)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync RTStrPrintf(szBuffer, sizeof(szBuffer), "%s/%s", pszDir, pszFile);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncDECLEXPORT(int) crDmpHtmlInitV(struct CR_HTML_DUMPER * pDumper, const char *pszDir, const char *pszFile, va_list pArgList)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync vsprintf_s(szBuffer, sizeof (szBuffer), pszFile, pArgList);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncDECLEXPORT(int) crDmpHtmlInitF(struct CR_HTML_DUMPER * pDumper, const char *pszDir, const char *pszFile, ...)