diff options
Diffstat (limited to 'src/VBox/GuestHost/OpenGL/include/cr_dump.h')
-rw-r--r-- | src/VBox/GuestHost/OpenGL/include/cr_dump.h | 177 |
1 files changed, 177 insertions, 0 deletions
diff --git a/src/VBox/GuestHost/OpenGL/include/cr_dump.h b/src/VBox/GuestHost/OpenGL/include/cr_dump.h new file mode 100644 index 00000000..d156b169 --- /dev/null +++ b/src/VBox/GuestHost/OpenGL/include/cr_dump.h @@ -0,0 +1,177 @@ +/* $Id: cr_dump.h $ */ + +/** @file + * Debugging: Dump API + */ +/* + * Copyright (C) 2013-2019 Oracle Corporation + * + * This file is part of VirtualBox Open Source Edition (OSE), as + * available from http://www.virtualbox.org. This file is free software; + * you can redistribute it and/or modify it under the terms of the GNU + * General Public License (GPL) as published by the Free Software + * Foundation, in version 2 as it comes in the "COPYING" file of the + * VirtualBox OSE distribution. VirtualBox OSE is distributed in the + * hope that it will be useful, but WITHOUT ANY WARRANTY of any kind. + */ +#ifndef ___cr_dump_h__ +#define ___cr_dump_h__ + +/* dump stuff */ +//#define VBOX_WITH_CRDUMPER +#ifdef VBOX_WITH_CRDUMPER + +#include <iprt/cdefs.h> +#include <iprt/string.h> +#include <cr_spu.h> +#include <cr_glstate.h> +#include <cr_blitter.h> + +# define VBOXDUMPDECL(_type) _type RTCALL + +RT_C_DECLS_BEGIN + +#ifdef RT_OS_WINDOWS +DECLEXPORT(void) crDmpDumpImgDmlBreak(struct CR_DUMPER * pDumper, CR_BLITTER_IMG *pImg, const char*pszEntryDesc); + +DECLEXPORT(void) crDmpDumpStrDbgPrint(struct CR_DUMPER * pDumper, const char*pszStr); +#endif + +struct CR_DUMPER; + +typedef DECLCALLBACKPTR(void, PFNCRDUMPIMG)(struct CR_DUMPER * pDumper, CR_BLITTER_IMG *pImg, const char*pszEntryDesc); +typedef DECLCALLBACKPTR(void, PFNCRDUMPSTR)(struct CR_DUMPER * pDumper, const char*pszStr); + +typedef struct CR_DUMPER +{ + PFNCRDUMPIMG pfnDumpImg; + PFNCRDUMPSTR pfnDumpStr; +} CR_DUMPER; + +#define crDmpImg(_pDumper, _pImg, _pDesc) do { \ + (_pDumper)->pfnDumpImg((_pDumper), (_pImg), (_pDesc)); \ + } while (0) + +#define crDmpStr(_pDumper, _pDesc) do { \ + (_pDumper)->pfnDumpStr((_pDumper), (_pDesc)); \ + } while (0) + +#ifndef RT_OS_WINDOWS +# define vsprintf_s vsnprintf +# define sprintf_s snprintf +#endif + +DECLINLINE(void) crDmpStrV(CR_DUMPER *pDumper, const char *pszStr, va_list pArgList) +{ + char szBuffer[4096] = {0}; + vsprintf_s(szBuffer, sizeof (szBuffer), pszStr, pArgList); + crDmpStr(pDumper, szBuffer); +} + +DECLINLINE(void) crDmpStrF(CR_DUMPER *pDumper, const char *pszStr, ...) +{ + va_list pArgList; + va_start(pArgList, pszStr); + crDmpStrV(pDumper, pszStr, pArgList); + va_end(pArgList); +} + +DECLINLINE(void) crDmpImgV(CR_DUMPER *pDumper, CR_BLITTER_IMG *pImg, const char *pszStr, va_list pArgList) +{ + char szBuffer[4096] = {0}; + vsprintf_s(szBuffer, sizeof (szBuffer), pszStr, pArgList); + crDmpImg(pDumper, pImg, szBuffer); +} + +DECLINLINE(void) crDmpImgF(CR_DUMPER *pDumper, CR_BLITTER_IMG *pImg, const char *pszStr, ...) +{ + va_list pArgList; + va_start(pArgList, pszStr); + crDmpImgV(pDumper, pImg, pszStr, pArgList); + va_end(pArgList); +} + +VBOXDUMPDECL(size_t) crDmpFormatArray(char *pString, size_t cbString, const char *pszElFormat, uint32_t cbEl, const void *pVal, uint32_t cVal); +VBOXDUMPDECL(size_t) crDmpFormatRawArray(char *pString, size_t cbString, const char *pszElFormat, uint32_t cbEl, const void *pVal, uint32_t cVal); +VBOXDUMPDECL(size_t) crDmpFormatMatrixArray(char *pString, size_t cbString, const char *pszElFormat, uint32_t cbEl, const void *pVal, uint32_t cX, uint32_t cY); + +typedef struct CR_DBGPRINT_DUMPER +{ + CR_DUMPER Base; +} CR_DBGPRINT_DUMPER; + +typedef struct CR_HTML_DUMPER +{ + CR_DUMPER Base; + const char* pszFile; + const char* pszDir; + FILE *pFile; + uint32_t cImg; +} CR_HTML_DUMPER; + +DECLEXPORT(bool) crDmpHtmlIsInited(struct CR_HTML_DUMPER * pDumper); +DECLEXPORT(void) crDmpHtmlTerm(struct CR_HTML_DUMPER * pDumper); +DECLEXPORT(int) crDmpHtmlInit(struct CR_HTML_DUMPER * pDumper, const char *pszDir, const char *pszFile); +DECLEXPORT(int) crDmpHtmlInitV(struct CR_HTML_DUMPER * pDumper, const char *pszDir, const char *pszFile, va_list pArgList); +DECLEXPORT(int) crDmpHtmlInitF(struct CR_HTML_DUMPER * pDumper, const char *pszDir, const char *pszFile, ...); + +#ifdef RT_OS_WINDOWS +DECLINLINE(void) crDmpDbgPrintInit(CR_DBGPRINT_DUMPER *pDumper) +{ + pDumper->Base.pfnDumpImg = crDmpDumpImgDmlBreak; + pDumper->Base.pfnDumpStr = crDmpDumpStrDbgPrint; +} +#endif + +typedef struct CR_RECORDER +{ + CR_BLITTER *pBlitter; + SPUDispatchTable *pDispatch; + CR_DUMPER *pDumper; +} CR_RECORDER; + +DECLINLINE(void) crRecInit(CR_RECORDER *pRec, CR_BLITTER *pBlitter, SPUDispatchTable *pDispatch, CR_DUMPER *pDumper) +{ + pRec->pBlitter = pBlitter; + pRec->pDispatch = pDispatch; + pRec->pDumper = pDumper; +} + +VBOXDUMPDECL(void) crRecDumpBuffer(CR_RECORDER *pRec, CRContext *ctx, GLint idRedirFBO, VBOXVR_TEXTURE *pRedirTex); +VBOXDUMPDECL(void) crRecDumpTextures(CR_RECORDER *pRec, CRContext *ctx); +VBOXDUMPDECL(void) crRecDumpTextureV(CR_RECORDER *pRec, const VBOXVR_TEXTURE *pTex, CR_BLITTER_CONTEXT *pCurCtx, CR_BLITTER_WINDOW *pCurWin, const char *pszStr, va_list pArgList); +VBOXDUMPDECL(void) crRecDumpTextureF(CR_RECORDER *pRec, const VBOXVR_TEXTURE *pTex, const char *pszStr, ...); +VBOXDUMPDECL(void) crRecDumpTextureByIdV(CR_RECORDER *pRec, CRContext *ctx, GLint id, CR_BLITTER_CONTEXT *pCurCtx, CR_BLITTER_WINDOW *pCurWin, const char *pszStr, va_list pArgList); +VBOXDUMPDECL(void) crRecDumpTextureByIdF(CR_RECORDER *pRec, CRContext *ctx, GLint id, CR_BLITTER_CONTEXT *pCurCtx, CR_BLITTER_WINDOW *pCurWin, const char *pszStr, ...); +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); +VBOXDUMPDECL(void) crRecDumpVertAttrv(CR_RECORDER *pRec, CRContext *ctx, GLuint idx, const char*pszElFormat, uint32_t cbEl, const void *pvVal, uint32_t cVal); +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); + +VBOXDUMPDECL(int) crRecAlphaImgCreate(const CR_BLITTER_IMG *pImg, CR_BLITTER_IMG *pAlphaImg); +VBOXDUMPDECL(void) crRecAlphaImgDestroy(CR_BLITTER_IMG *pImg); + + +typedef DECLCALLBACKPTR(GLuint, PFNCRDUMPGETHWID)(void *pvObj); +void* crDmpHashtableSearchByHwid(CRHashTable *pHash, GLuint hwid, PFNCRDUMPGETHWID pfnGetHwid, unsigned long *pKey); + +RT_C_DECLS_END + +#endif /* VBOX_WITH_CRDUMPER */ +/* */ + +#endif /* #ifndef ___cr_dump_h__ */ |