12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync/* $Id$ */
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync/** @file
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync * Blitter API implementation
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync */
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync/*
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync * Copyright (C) 2013 Oracle Corporation
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *
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 */
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include "cr_blitter.h"
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include "cr_spu.h"
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include "chromium.h"
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include "cr_error.h"
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include "cr_net.h"
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include "cr_rand.h"
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include "cr_mem.h"
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include "cr_string.h"
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include <cr_dump.h>
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include "cr_pixeldata.h"
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include <iprt/cdefs.h>
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include <iprt/types.h>
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include <iprt/mem.h>
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#include <stdio.h>
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#ifdef VBOX_WITH_CRDUMPER
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsyncstatic uint32_t g_CrDbgDumpRecTexInfo = 1;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsyncstatic uint32_t g_CrDbgDumpAlphaData = 1;
78be54197d4b03ee467a9a20d041b4018ee47091vboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync/* dump stuff */
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#pragma pack(1)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsynctypedef struct VBOX_BITMAPFILEHEADER {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync uint16_t bfType;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync uint32_t bfSize;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync uint16_t bfReserved1;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync uint16_t bfReserved2;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync uint32_t bfOffBits;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync} VBOX_BITMAPFILEHEADER;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsynctypedef struct VBOX_BITMAPINFOHEADER {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync uint32_t biSize;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync int32_t biWidth;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync int32_t biHeight;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync uint16_t biPlanes;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync uint16_t biBitCount;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync uint32_t biCompression;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync uint32_t biSizeImage;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync int32_t biXPelsPerMeter;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync int32_t biYPelsPerMeter;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync uint32_t biClrUsed;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync uint32_t biClrImportant;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync} VBOX_BITMAPINFOHEADER;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#pragma pack()
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid crDmpImgBmp(CR_BLITTER_IMG *pImg, const char *pszFilename)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync static int sIdx = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if ( pImg->bpp != 16
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync && pImg->bpp != 24
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync && pImg->bpp != 32)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("not supported bpp %d", pImg->bpp);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync FILE *f = fopen (pszFilename, "wb");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!f)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("fopen failed");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync VBOX_BITMAPFILEHEADER bf;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bf.bfType = 'MB';
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bf.bfSize = sizeof (VBOX_BITMAPFILEHEADER) + sizeof (VBOX_BITMAPINFOHEADER) + pImg->cbData;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bf.bfReserved1 = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bf.bfReserved2 = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bf.bfOffBits = sizeof (VBOX_BITMAPFILEHEADER) + sizeof (VBOX_BITMAPINFOHEADER);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync VBOX_BITMAPINFOHEADER bi;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bi.biSize = sizeof (bi);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bi.biWidth = pImg->width;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bi.biHeight = pImg->height;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bi.biPlanes = 1;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bi.biBitCount = pImg->bpp;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bi.biCompression = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bi.biSizeImage = pImg->cbData;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bi.biXPelsPerMeter = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bi.biYPelsPerMeter = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bi.biClrUsed = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bi.biClrImportant = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fwrite (&bf, 1, sizeof (bf), f);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fwrite (&bi, 1, sizeof (bi), f);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fwrite (pImg->pvData, 1, pImg->cbData, f);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fclose (f);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsynctypedef struct CRDUMPGETHWID_DATA
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLuint hwid;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync PFNCRDUMPGETHWID pfnGetHwid;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync unsigned long Key;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync void* pvObj;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync} CRDUMPGETHWID_DATA;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic void crDmpHashtableSearchByHwidCB(unsigned long key, void *pData1, void *pData2)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRDUMPGETHWID_DATA *pData = (CRDUMPGETHWID_DATA*)pData2;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (pData->pvObj)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (pData->hwid == pData->pfnGetHwid(pData1))
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pData->Key = key;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pData->pvObj = pData1;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid* crDmpHashtableSearchByHwid(CRHashTable *pHash, GLuint hwid, PFNCRDUMPGETHWID pfnGetHwid, unsigned long *pKey)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRDUMPGETHWID_DATA Data = {0};
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Data.hwid = hwid;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Data.pfnGetHwid = pfnGetHwid;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crHashtableWalk(pHash, crDmpHashtableSearchByHwidCB, &Data);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(Data.pvObj);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (pKey)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pKey = Data.Key;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return Data.pvObj;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#if 0
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsynctypedef struct CR_SERVER_DUMP_FIND_TEX
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint hwid;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRTextureObj *pTobj
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync} CR_SERVER_DUMP_FIND_TEX;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid crServerDumpFindTexCb(unsigned long key, void *pData1, void *pData2)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_SERVER_DUMP_FIND_TEX *pTex = (CR_SERVER_DUMP_FIND_TEX*)pData2;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRTextureObj *pTobj = (CRTextureObj *)pData1;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (pTobj->hwid == pTex->hwid)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pTex->pTobj = pTobj;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#endif
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#define CR_DUMP_MAKE_CASE(_val) case _val: return #_val
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#define CR_DUMP_MAKE_CASE_UNKNOWN(_val, _str, _pDumper) default: { \
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("%s %d", (_str), _val); \
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF((_pDumper), "WARNING: %s %d", (_str), _val); \
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return (_str); \
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncDECLINLINE(size_t) crDmpFormatVal(char *pString, size_t cbString, const char *pszElFormat, uint32_t cbVal, const void *pvVal)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync{
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync if (pszElFormat[0] != '%' || pszElFormat[1] == '\0')
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync {
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync crWarning("invalid format %s", pszElFormat);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return 0;
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync }
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync switch (cbVal)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync {
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync case 8:
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return sprintf_s(pString, cbString, pszElFormat, *((double*)pvVal));
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync case 4:
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync {
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync /* we do not care only about type specifiers, all the rest is not accepted */
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync switch (pszElFormat[1])
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync {
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync case 'f':
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync /* float would be promoted to double */
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return sprintf_s(pString, cbString, pszElFormat, *((float*)pvVal));
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync default:
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return sprintf_s(pString, cbString, pszElFormat, *((uint32_t*)pvVal));
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync }
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync }
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync case 2:
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return sprintf_s(pString, cbString, pszElFormat, *((uint16_t*)pvVal));
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync case 1:
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return sprintf_s(pString, cbString, pszElFormat, *((uint8_t*)pvVal));
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync default:
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync crWarning("unsupported size %d", cbVal);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return 0;
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync }
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync}
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncVBOXDUMPDECL(size_t) crDmpFormatRawArray(char *pString, size_t cbString, const char *pszElFormat, uint32_t cbEl, const void *pvVal, uint32_t cVal)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (cbString < 2)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("too few buffer size");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync const size_t cbInitString = cbString;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pString++ = '{';
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync --cbString;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync size_t cbWritten;
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync const uint8_t *pu8Val = (const uint8_t *)pvVal;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync for (uint32_t i = 0; i < cVal; ++i)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync cbWritten = crDmpFormatVal(pString, cbString, pszElFormat, cbEl, (const void *)pu8Val);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync pu8Val += cbEl;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(cbString >= cbWritten);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pString += cbWritten;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync cbString -= cbWritten;
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync if (i != cVal - 1)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync {
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync cbWritten = sprintf_s(pString, cbString, ", ");
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync Assert(cbString >= cbWritten);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync pString += cbWritten;
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync cbString -= cbWritten;
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!cbString)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("too few buffer size");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pString++ = '}';
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync --cbString;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!cbString)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("too few buffer size");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pString++ = '\0';
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return cbInitString - cbString;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncVBOXDUMPDECL(size_t) crDmpFormatMatrixArray(char *pString, size_t cbString, const char *pszElFormat, uint32_t cbEl, const void *pvVal, uint32_t cX, uint32_t cY)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (cbString < 2)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("too few buffer size");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync const size_t cbInitString = cbString;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pString++ = '{';
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync --cbString;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync size_t cbWritten;
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync const uint8_t *pu8Val = (const uint8_t *)pvVal;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync for (uint32_t i = 0; i < cY; ++i)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync cbWritten = crDmpFormatRawArray(pString, cbString, pszElFormat, cbEl, (const void *)pu8Val, cX);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync pu8Val += (cbEl * cX);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(cbString >= cbWritten);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pString += cbWritten;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync cbString -= cbWritten;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (i != cY - 1)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (cbString < 3)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("too few buffer size");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pString++ = ',';
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync --cbString;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pString++ = '\n';
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync --cbString;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!cbString)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("too few buffer size");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pString++ = '}';
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync --cbString;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!cbString)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("too few buffer size");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pString++ = '\0';
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return cbInitString - cbString;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncVBOXDUMPDECL(size_t) crDmpFormatArray(char *pString, size_t cbString, const char *pszElFormat, uint32_t cbEl, const void *pvVal, uint32_t cVal)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync switch(cVal)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync case 1:
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return crDmpFormatVal(pString, cbString, pszElFormat, cbEl, pvVal);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync case 16:
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return crDmpFormatMatrixArray(pString, cbString, pszElFormat, cbEl, pvVal, 4, 4);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync case 9:
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return crDmpFormatMatrixArray(pString, cbString, pszElFormat, cbEl, pvVal, 3, 3);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync case 0:
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("value array is empty");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync default:
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync return crDmpFormatRawArray(pString, cbString, pszElFormat, cbEl, pvVal, cVal);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncVBOXDUMPDECL(void) crRecDumpVertAttrv(CR_RECORDER *pRec, CRContext *ctx, GLuint idx, const char*pszElFormat, uint32_t cbEl, const void *pvVal, uint32_t cVal)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync{
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync char aBuf[1024];
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync crDmpFormatRawArray(aBuf, sizeof (aBuf), pszElFormat, cbEl, pvVal, cVal);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync crDmpStrF(pRec->pDumper, "(%u, %s)", idx, aBuf);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync}
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncVBOXDUMPDECL(void) crRecDumpVertAttrV(CR_RECORDER *pRec, CRContext *ctx, const char*pszFormat, va_list pArgList)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync{
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync crDmpStrV(pRec->pDumper, pszFormat, pArgList);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync}
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsyncVBOXDUMPDECL(void) crRecDumpVertAttrF(CR_RECORDER *pRec, CRContext *ctx, const char*pszFormat, ...)
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync{
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync va_list pArgList;
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync va_start(pArgList, pszFormat);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync crRecDumpVertAttrV(pRec, ctx, pszFormat, pArgList);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync va_end(pArgList);
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync}
ce2cc4412def73d9a9c4663225431dd415b208e8vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncvoid crRecDumpBuffer(CR_RECORDER *pRec, CRContext *ctx, GLint idRedirFBO, VBOXVR_TEXTURE *pRedirTex)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLenum texTarget = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint hwBuf = 0, hwDrawBuf = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint hwTex = 0, hwObjType = 0, hwTexLevel = 0, hwCubeFace = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint width = 0, height = 0, depth = 0;
78be54197d4b03ee467a9a20d041b4018ee47091vboxsync GLint id = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_BLITTER_IMG Img = {0};
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync VBOXVR_TEXTURE Tex;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync int rc;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_DRAW_BUFFER, &hwDrawBuf);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_FRAMEBUFFER_BINDING, &hwBuf);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (hwBuf)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
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 if (hwObjType == GL_TEXTURE)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
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 if (hwCubeFace)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("cube face: unsupported");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (hwTexLevel)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("non-zero tex level attached, unsupported");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("unsupported");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("no buffer attached: unsupported");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (ctx->framebufferobject.drawFB)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLuint iColor = (hwDrawBuf - GL_COLOR_ATTACHMENT0_EXT);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRTextureObj *pTobj = (CRTextureObj *)crHashtableSearch(ctx->shared->textureTable, ctx->framebufferobject.drawFB->color[iColor].name);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRTextureLevel *pTl = NULL;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
78be54197d4b03ee467a9a20d041b4018ee47091vboxsync id = pTobj->id;
78be54197d4b03ee467a9a20d041b4018ee47091vboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(iColor < RT_ELEMENTS(ctx->framebufferobject.drawFB->color));
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!pTobj)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("no tobj");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pTobj->hwid == hwTex);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pTobj);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->framebufferobject.drawFB->hwid);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->framebufferobject.drawFB->hwid == hwBuf);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->framebufferobject.drawFB->drawbuffer[0] == hwDrawBuf);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->framebufferobject.drawFB->color[iColor].level == hwTexLevel);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->framebufferobject.drawFB->color[iColor].type == hwObjType);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync texTarget = pTobj->target;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(texTarget == GL_TEXTURE_2D);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pTl = &pTobj->level[0][hwTexLevel];
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync rc = CrBltEnter(pRec->pBlitter);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!RT_SUCCESS(rc))
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("CrBltEnter failed, rc %d", rc);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->BindTexture(texTarget, hwTex);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
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
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(width == pTl->width);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(height == pTl->height);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(depth == pTl->depth);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->BindTexture(texTarget, 0);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(hwBuf == idRedirFBO);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!pRedirTex)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("pRedirTex is expected for non-FBO state!");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(hwTex == pRedirTex->hwid);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync texTarget = pRedirTex->target;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync width = pRedirTex->width;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync height = pRedirTex->height;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync rc = CrBltEnter(pRec->pBlitter);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!RT_SUCCESS(rc))
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("CrBltEnter failed, rc %d", rc);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Tex.width = width;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Tex.height = height;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Tex.target = texTarget;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Tex.hwid = hwTex;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync rc = CrBltImgGetTex(pRec->pBlitter, &Tex, GL_BGRA, &Img);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (RT_SUCCESS(rc))
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
78be54197d4b03ee467a9a20d041b4018ee47091vboxsync crDmpImgF(pRec->pDumper, &Img, "ctx(%d), BUFFER: id(%d) hwid(%d), width(%d), height(%d)", ctx, id, Tex.hwid, width, height);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync if (g_CrDbgDumpAlphaData)
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync {
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync CR_BLITTER_IMG AlphaImg = {0};
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync rc = crRecAlphaImgCreate(&Img, &AlphaImg);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync if (RT_SUCCESS(rc))
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync {
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crDmpImgF(pRec->pDumper, &AlphaImg, "Buffer ALPHA Data");
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crRecAlphaImgDestroy(&AlphaImg);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync }
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync else
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync {
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crWarning("crRecAlphaImgCreate failed rc %d", rc);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync }
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync }
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CrBltImgFree(pRec->pBlitter, &Img);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("CrBltImgGetTex failed, rc %d", rc);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CrBltLeave(pRec->pBlitter);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic const char *crRecDumpShaderTypeString(GLenum enmType, CR_DUMPER *pDumper)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync switch (enmType)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_VERTEX_SHADER_ARB);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FRAGMENT_SHADER_ARB);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_GEOMETRY_SHADER_ARB);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE_UNKNOWN(enmType, "Unknown Shader Type", pDumper);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic const char *crRecDumpVarTypeString(GLenum enmType, CR_DUMPER *pDumper)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync switch (enmType)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync CR_DUMP_MAKE_CASE(GL_BYTE);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync CR_DUMP_MAKE_CASE(GL_UNSIGNED_BYTE);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync CR_DUMP_MAKE_CASE(GL_SHORT);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync CR_DUMP_MAKE_CASE(GL_UNSIGNED_SHORT);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FLOAT);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync CR_DUMP_MAKE_CASE(GL_DOUBLE);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FLOAT_VEC2);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FLOAT_VEC3);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FLOAT_VEC4);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_INT);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync CR_DUMP_MAKE_CASE(GL_UNSIGNED_INT);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_INT_VEC2);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_INT_VEC3);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_INT_VEC4);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_BOOL);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_BOOL_VEC2);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_BOOL_VEC3);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_BOOL_VEC4);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FLOAT_MAT2);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FLOAT_MAT3);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FLOAT_MAT4);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_SAMPLER_1D);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_SAMPLER_2D);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_SAMPLER_3D);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_SAMPLER_CUBE);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_SAMPLER_1D_SHADOW);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_SAMPLER_2D_SHADOW);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_SAMPLER_2D_RECT_ARB);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_SAMPLER_2D_RECT_SHADOW_ARB);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FLOAT_MAT2x3);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FLOAT_MAT2x4);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FLOAT_MAT3x2);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FLOAT_MAT3x4);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FLOAT_MAT4x2);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE(GL_FLOAT_MAT4x3);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_DUMP_MAKE_CASE_UNKNOWN(enmType, "Unknown Variable Type", pDumper);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic char *crRecDumpGetLine(char **ppszStr, uint32_t *pcbStr)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync char *pszStr, *pNewLine;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync const uint32_t cbStr = *pcbStr;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!cbStr)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync /* zero-length string */
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return NULL;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if ((*ppszStr)[cbStr-1] != '\0')
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("string should be null-rerminated, forcing it!");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync (*ppszStr)[cbStr-1] = '\0';
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pszStr = *ppszStr;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!*pszStr)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pcbStr = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return NULL;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!(pNewLine = strstr(pszStr, "\n")))
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync /* the string contains a single line! */
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *ppszStr += strlen(pszStr);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pcbStr = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return pszStr;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pNewLine = '\0';
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *pcbStr = cbStr - (((uintptr_t)pNewLine) - ((uintptr_t)pszStr)) - 1;
e543dec2334831a2b1c04de12a5c4aab59d6746fvboxsync Assert((*pcbStr) < UINT32_MAX/2);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert((*pcbStr) < cbStr);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync *ppszStr = pNewLine + 1;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return pszStr;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic void crRecDumpStrByLine(CR_DUMPER *pDumper, char *pszStr, uint32_t cbStr)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync char *pszCurLine;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync while ((pszCurLine = crRecDumpGetLine(&pszStr, &cbStr)) != NULL)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pDumper, "%s", pszCurLine);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic DECLCALLBACK(GLuint) crDmpGetHwidShaderCB(void *pvObj)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return ((CRGLSLShader*)pvObj)->hwid;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic DECLCALLBACK(GLuint) crDmpGetHwidProgramCB(void *pvObj)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return ((CRGLSLProgram*)pvObj)->hwid;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync/* Context activation is done by the caller. */
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsyncvoid crRecDumpLog(CR_RECORDER *pRec, GLint hwid)
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync{
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync GLint cbLog = 0;
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_INFO_LOG_LENGTH_ARB, &cbLog);
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync crDmpStrF(pRec->pDumper, "Log===%d===", hwid);
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync if (cbLog > 1)
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync {
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync GLchar *pszLog = (GLchar *) crAlloc(cbLog*sizeof (GLchar));
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync pRec->pDispatch->GetInfoLogARB(hwid, cbLog, NULL, pszLog);
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync crRecDumpStrByLine(pRec->pDumper, pszLog, cbLog);
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync crFree(pszLog);
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync }
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync crDmpStrF(pRec->pDumper, "End Log======");
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync}
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid crRecDumpShader(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint length = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint type = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint compileStatus = 0;
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync#ifndef IN_GUEST
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRGLSLShader *pShad;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!id)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync unsigned long tstKey = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(hwid);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pShad = (CRGLSLShader *)crDmpHashtableSearchByHwid(ctx->glsl.shaders, hwid, crDmpGetHwidShaderCB, &tstKey);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pShad);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!pShad)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync id = pShad->id;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(tstKey == id);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pShad = (CRGLSLShader *)crHashtableSearch(ctx->glsl.shaders, id);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pShad);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!pShad)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!hwid)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync hwid = pShad->hwid;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pShad->hwid == hwid);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pShad->id == id);
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync#else
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync if (!id)
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync id = hwid;
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync else if (!hwid)
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync hwid = id;
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync Assert(id);
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync Assert(hwid);
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync Assert(hwid == id);
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync#endif
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
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
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync crRecDumpLog(pRec, hwid);
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_SHADER_SOURCE_LENGTH_ARB, &length);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync char *pszSource = (char*)crCalloc(length + 1);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!pszSource)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("crCalloc failed");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pRec->pDumper, "WARNING: crCalloc failed");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetShaderSource(hwid, length, NULL, pszSource);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crRecDumpStrByLine(pRec->pDumper, pszSource, length);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crFree(pszSource);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStr(pRec->pDumper, "===END SHADER====");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid crRecDumpProgram(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint cShaders = 0, linkStatus = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync char *source = NULL;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRGLSLProgram *pProg;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!id)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync unsigned long tstKey = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(hwid);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pProg = (CRGLSLProgram*)crDmpHashtableSearchByHwid(ctx->glsl.programs, hwid, crDmpGetHwidProgramCB, &tstKey);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pProg);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!pProg)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync id = pProg->id;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(tstKey == id);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pProg = (CRGLSLProgram *) crHashtableSearch(ctx->glsl.programs, id);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pProg);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!pProg)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!hwid)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync hwid = pProg->hwid;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pProg->hwid == hwid);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pProg->id == id);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_ATTACHED_OBJECTS_ARB, &cShaders);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_LINK_STATUS_ARB, &linkStatus);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pRec->pDumper, "PROGRAM ctx(%d) id(%d) hwid(%d) status(%d) shaders(%d):", ctx->id, id, hwid, linkStatus, cShaders);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync crRecDumpLog(pRec, hwid);
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync VBoxGLhandleARB *pShaders = (VBoxGLhandleARB*)crCalloc(cShaders * sizeof (*pShaders));
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!pShaders)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("crCalloc failed");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pRec->pDumper, "WARNING: crCalloc failed");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetAttachedObjectsARB(hwid, cShaders, NULL, pShaders);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync for (GLint i = 0; i < cShaders; ++i)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync if (pShaders[i])
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crRecDumpShader(pRec, ctx, 0, pShaders[i]);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync else
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crDmpStrF(pRec->pDumper, "WARNING: Shader[%d] is null", i);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crFree(pShaders);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLsizei cbLog = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_INFO_LOG_LENGTH_ARB, &cbLog);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (cbLog)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync char *pszLog = (char *)crCalloc(cbLog+1);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetInfoLogARB(hwid, cbLog, NULL, pszLog);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "==LOG==");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crRecDumpStrByLine(pRec->pDumper, pszLog, cbLog);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "==Done LOG==");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crFree(pszLog);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync else
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "==No LOG==");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStr(pRec->pDumper, "===END PROGRAM====");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsyncvoid crRecRecompileShader(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync{
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLint length = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLint type = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLint compileStatus = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync CRGLSLShader *pShad;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!id)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync unsigned long tstKey = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(hwid);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pShad = (CRGLSLShader *)crDmpHashtableSearchByHwid(ctx->glsl.shaders, hwid, crDmpGetHwidShaderCB, &tstKey);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(pShad);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!pShad)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync return;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync id = pShad->id;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(tstKey == id);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync else
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pShad = (CRGLSLShader *)crHashtableSearch(ctx->glsl.shaders, id);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(pShad);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!pShad)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync return;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!hwid)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync hwid = pShad->hwid;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(pShad->hwid == hwid);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(pShad->id == id);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
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
e20b6c04833c7afc840681167235afc1e1376f34vboxsync compileStatus = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLenum status;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync while ((status = pRec->pDispatch->GetError()) != GL_NO_ERROR) {/*Assert(0);*/}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->CompileShader(hwid);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync while ((status = pRec->pDispatch->GetError()) != GL_NO_ERROR) {Assert(0);}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_COMPILE_STATUS_ARB, &compileStatus);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "==Done RECOMPILE SHADER, status(%d)==", compileStatus);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsyncvoid crRecRecompileProgram(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync{
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLint cShaders = 0, linkStatus = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync char *source = NULL;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync CRGLSLProgram *pProg;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!id)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync unsigned long tstKey = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(hwid);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pProg = (CRGLSLProgram*)crDmpHashtableSearchByHwid(ctx->glsl.programs, hwid, crDmpGetHwidProgramCB, &tstKey);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(pProg);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!pProg)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync return;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync id = pProg->id;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(tstKey == id);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync else
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pProg = (CRGLSLProgram *) crHashtableSearch(ctx->glsl.programs, id);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(pProg);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!pProg)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync return;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!hwid)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync hwid = pProg->hwid;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(pProg->hwid == hwid);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(pProg->id == id);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_ATTACHED_OBJECTS_ARB, &cShaders);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_LINK_STATUS_ARB, &linkStatus);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "==RECOMPILE PROGRAM ctx(%d) id(%d) hwid(%d) status(%d) shaders(%d)==", ctx->id, id, hwid, linkStatus, cShaders);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync VBoxGLhandleARB *pShaders = (VBoxGLhandleARB*)crCalloc(cShaders * sizeof (*pShaders));
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!pShaders)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crWarning("crCalloc failed");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "WARNING: crCalloc failed");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync return;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetAttachedObjectsARB(hwid, cShaders, NULL, pShaders);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync for (GLint i = 0; i < cShaders; ++i)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crRecRecompileShader(pRec, ctx, 0, pShaders[i]);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crFree(pShaders);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync linkStatus = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLenum status;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync while ((status = pRec->pDispatch->GetError()) != GL_NO_ERROR) {/*Assert(0);*/}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->LinkProgram(hwid);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync while ((status = pRec->pDispatch->GetError()) != GL_NO_ERROR) {Assert(0);}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetObjectParameterivARB(hwid, GL_OBJECT_LINK_STATUS_ARB, &linkStatus);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "==Done RECOMPILE PROGRAM, status(%d)==", linkStatus);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncVBOXDUMPDECL(void) crRecDumpCurrentProgram(CR_RECORDER *pRec, CRContext *ctx)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint curProgram = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_CURRENT_PROGRAM, &curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (curProgram)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->glsl.activeProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!ctx->glsl.activeProgram)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("no active program state with active hw program");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->glsl.activeProgram->hwid == curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crRecDumpProgram(pRec, ctx, 0, curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(!ctx->glsl.activeProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pRec->pDumper, "--no active program");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid crRecDumpProgramUniforms(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRGLSLProgram *pProg;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!id)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync unsigned long tstKey = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(hwid);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pProg = (CRGLSLProgram*)crDmpHashtableSearchByHwid(ctx->glsl.programs, hwid, crDmpGetHwidProgramCB, &tstKey);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pProg);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!pProg)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync id = pProg->id;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(tstKey == id);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pProg = (CRGLSLProgram *) crHashtableSearch(ctx->glsl.programs, id);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pProg);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!pProg)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!hwid)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync hwid = pProg->hwid;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pProg->hwid == hwid);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pProg->id == id);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint maxUniformLen = 0, activeUniforms = 0, i, j, uniformsCount = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLenum type;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint size, location;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLchar *pszName = NULL;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetProgramiv(hwid, GL_ACTIVE_UNIFORM_MAX_LENGTH, &maxUniformLen);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetProgramiv(hwid, GL_ACTIVE_UNIFORMS, &activeUniforms);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!maxUniformLen)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (activeUniforms)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("activeUniforms (%d), while maxUniformLen is zero", activeUniforms);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync activeUniforms = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (activeUniforms>0)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pszName = (GLchar *) crAlloc((maxUniformLen+8)*sizeof(GLchar));
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!pszName)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("crRecDumpProgramUniforms: out of memory");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync for (i=0; i<activeUniforms; ++i)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetActiveUniform(hwid, i, maxUniformLen, NULL, &size, &type, pszName);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync uniformsCount += size;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(uniformsCount>=activeUniforms);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (activeUniforms>0)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLfloat fdata[16];
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint idata[16];
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync char *pIndexStr=NULL;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync for (i=0; i<activeUniforms; ++i)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync bool fPrintBraketsWithName = false;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetActiveUniform(hwid, i, maxUniformLen, NULL, &size, &type, pszName);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (size>1)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pIndexStr = crStrchr(pszName, '[');
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!pIndexStr)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pIndexStr = pszName+crStrlen(pszName);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fPrintBraketsWithName = true;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (fPrintBraketsWithName)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pRec->pDumper, "%s %s[%d];", crRecDumpVarTypeString(type, pRec->pDumper), pszName, size);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(size > 1);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pRec->pDumper, "%s %s;", crRecDumpVarTypeString(type, pRec->pDumper), pszName);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint uniformTypeSize = crStateGetUniformSize(type);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(uniformTypeSize >= 1);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync for (j=0; j<size; ++j)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (size>1)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync sprintf(pIndexStr, "[%i]", j);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync location = pRec->pDispatch->GetUniformLocation(hwid, pszName);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (crStateIsIntUniform(type))
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetUniformiv(hwid, location, &idata[0]);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync switch (uniformTypeSize)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync case 1:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = %d; //location %d", pszName, idata[0], location);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync break;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync case 2:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%d, %d}; //location %d", pszName, idata[0], idata[1], location);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync break;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync case 3:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d}; //location %d", pszName, idata[0], idata[1], idata[2], location);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync break;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync case 4:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d, %d}; //location %d", pszName, idata[0], idata[1], idata[2], idata[3], location);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync break;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync default:
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync for (GLint k = 0; k < uniformTypeSize; ++k)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s[%d] = %d; //location %d", pszName, k, idata[k], location);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync break;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetUniformfv(hwid, location, &fdata[0]);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync switch (uniformTypeSize)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync case 1:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = %f; //location %d", pszName, fdata[0], location);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync break;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync case 2:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%f, %f}; //location %d", pszName, fdata[0], fdata[1], location);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync break;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync case 3:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f}; //location %d", pszName, fdata[0], fdata[1], fdata[2], location);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync break;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync case 4:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f, %f}; //location %d", pszName, fdata[0], fdata[1], fdata[2], fdata[3], location);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync break;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync default:
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync for (GLint k = 0; k < uniformTypeSize; ++k)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s[%d] = %f; //location %d", pszName, k, fdata[k], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync break;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crFree(pszName);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsyncvoid crRecDumpProgramAttribs(CR_RECORDER *pRec, CRContext *ctx, GLint id, GLint hwid)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync{
e20b6c04833c7afc840681167235afc1e1376f34vboxsync CRGLSLProgram *pProg;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!id)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync unsigned long tstKey = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(hwid);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pProg = (CRGLSLProgram*)crDmpHashtableSearchByHwid(ctx->glsl.programs, hwid, crDmpGetHwidProgramCB, &tstKey);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(pProg);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!pProg)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync return;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync id = pProg->id;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(tstKey == id);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync else
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pProg = (CRGLSLProgram *) crHashtableSearch(ctx->glsl.programs, id);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(pProg);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!pProg)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync return;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!hwid)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync hwid = pProg->hwid;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(pProg->hwid == hwid);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(pProg->id == id);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLint maxAttribLen = 0, activeAttrib = 0, i, j, attribCount = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLenum type;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLint size, location;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLchar *pszName = NULL;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetProgramiv(hwid, GL_ACTIVE_ATTRIBUTE_MAX_LENGTH, &maxAttribLen);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetProgramiv(hwid, GL_ACTIVE_ATTRIBUTES, &activeAttrib);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!maxAttribLen)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (activeAttrib)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crWarning("activeAttrib (%d), while maxAttribLen is zero", activeAttrib);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync activeAttrib = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (activeAttrib>0)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pszName = (GLchar *) crAlloc((maxAttribLen+8)*sizeof(GLchar));
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!pszName)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crWarning("crRecDumpProgramAttrib: out of memory");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync return;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync for (i=0; i<activeAttrib; ++i)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetActiveAttrib(hwid, i, maxAttribLen, NULL, &size, &type, pszName);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync attribCount += size;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(attribCount>=activeAttrib);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (activeAttrib>0)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLfloat fdata[16];
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLint idata[16];
e20b6c04833c7afc840681167235afc1e1376f34vboxsync char *pIndexStr=NULL;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync for (i=0; i<activeAttrib; ++i)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync bool fPrintBraketsWithName = false;
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
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
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (size>1)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pIndexStr = crStrchr(pszName, '[');
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!pIndexStr)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pIndexStr = pszName+crStrlen(pszName);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync fPrintBraketsWithName = true;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (fPrintBraketsWithName)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s %s[%d];", crRecDumpVarTypeString(type, pRec->pDumper), pszName, size);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(size > 1);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync else
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s %s;", crRecDumpVarTypeString(type, pRec->pDumper), pszName);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
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
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLint attribTypeSize = crStateGetUniformSize(type);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(attribTypeSize >= 1);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync for (j=0; j<size; ++j)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (size>1)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync sprintf(pIndexStr, "[%i]", j);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync location = pRec->pDispatch->GetAttribLocation(hwid, pszName);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (crStateIsIntUniform(type))
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetVertexAttribivARB(location, GL_CURRENT_VERTEX_ATTRIB, &idata[0]);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync switch (attribTypeSize)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync case 1:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = %d; //location %d", pszName, idata[0], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync break;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync case 2:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%d, %d}; //location %d", pszName, idata[0], idata[1], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync break;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync case 3:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d}; //location %d", pszName, idata[0], idata[1], idata[2], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync break;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync case 4:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%d, %d, %d, %d}; //location %d", pszName, idata[0], idata[1], idata[2], idata[3], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync break;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync default:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync for (GLint k = 0; k < attribTypeSize; ++k)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s[%d] = %d; //location %d", pszName, k, idata[k], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync break;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync else
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetVertexAttribfvARB(location, GL_CURRENT_VERTEX_ATTRIB, &fdata[0]);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync switch (attribTypeSize)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync case 1:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = %f; //location %d", pszName, fdata[0], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync break;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync case 2:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%f, %f}; //location %d", pszName, fdata[0], fdata[1], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync break;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync case 3:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f}; //location %d", pszName, fdata[0], fdata[1], fdata[2], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync break;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync case 4:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s = {%f, %f, %f, %f}; //location %d", pszName, fdata[0], fdata[1], fdata[2], fdata[3], location);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync break;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync default:
e20b6c04833c7afc840681167235afc1e1376f34vboxsync for (GLint k = 0; k < attribTypeSize; ++k)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "%s[%d] = %f; //location %d", pszName, k, fdata[k], location);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync break;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crFree(pszName);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncVBOXDUMPDECL(void) crRecDumpCurrentProgramUniforms(CR_RECORDER *pRec, CRContext *ctx)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint curProgram = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_CURRENT_PROGRAM, &curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (curProgram)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->glsl.activeProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (!ctx->glsl.activeProgram)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("no active program state with active hw program");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->glsl.activeProgram->hwid == curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crRecDumpProgramUniforms(pRec, ctx, 0, curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(!ctx->glsl.activeProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpStrF(pRec->pDumper, "--no active program");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsyncVBOXDUMPDECL(void) crRecDumpCurrentProgramAttribs(CR_RECORDER *pRec, CRContext *ctx)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync{
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLint curProgram = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetIntegerv(GL_CURRENT_PROGRAM, &curProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (curProgram)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(ctx->glsl.activeProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!ctx->glsl.activeProgram)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crWarning("no active program state with active hw program");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync else
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(ctx->glsl.activeProgram->hwid == curProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crRecDumpProgramAttribs(pRec, ctx, 0, curProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync else
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(!ctx->glsl.activeProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "--no active program");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
e20b6c04833c7afc840681167235afc1e1376f34vboxsyncVBOXDUMPDECL(void) crRecRecompileCurrentProgram(CR_RECORDER *pRec, CRContext *ctx)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync{
e20b6c04833c7afc840681167235afc1e1376f34vboxsync GLint curProgram = 0;
e20b6c04833c7afc840681167235afc1e1376f34vboxsync pRec->pDispatch->GetIntegerv(GL_CURRENT_PROGRAM, &curProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (curProgram)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(ctx->glsl.activeProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync if (!ctx->glsl.activeProgram)
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crWarning("no active program state with active hw program");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync else
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(ctx->glsl.activeProgram->hwid == curProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crRecRecompileProgram(pRec, ctx, 0, curProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync else
e20b6c04833c7afc840681167235afc1e1376f34vboxsync {
e20b6c04833c7afc840681167235afc1e1376f34vboxsync Assert(!ctx->glsl.activeProgram);
e20b6c04833c7afc840681167235afc1e1376f34vboxsync crDmpStrF(pRec->pDumper, "--no active program");
e20b6c04833c7afc840681167235afc1e1376f34vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync}
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsyncint crRecAlphaImgCreate(const CR_BLITTER_IMG *pImg, CR_BLITTER_IMG *pAlphaImg)
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync{
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync if (pImg->enmFormat != GL_RGBA
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync && pImg->enmFormat != GL_BGRA)
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync {
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crWarning("unsupported format 0x%x", pImg->enmFormat);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync return VERR_NOT_IMPLEMENTED;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync }
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync pAlphaImg->bpp = 32;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync pAlphaImg->pitch = pImg->width * 4;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync pAlphaImg->cbData = pAlphaImg->pitch * pImg->height;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync pAlphaImg->enmFormat = GL_BGRA;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync pAlphaImg->width = pImg->width;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync pAlphaImg->height = pImg->height;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync pAlphaImg->pvData = RTMemAlloc(pAlphaImg->cbData);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync if (!pAlphaImg->pvData)
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync {
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crWarning("RTMemAlloc failed");
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync return VERR_NO_MEMORY;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync }
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync uint8_t *pu8SrcBuf = (uint8_t*)pImg->pvData;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync uint8_t *pu8DstBuf = (uint8_t*)pAlphaImg->pvData;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync for (uint32_t ih = 0; ih < pAlphaImg->height; ++ih)
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync {
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync uint32_t *pu32SrcBuf = (uint32_t*)pu8SrcBuf;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync uint32_t *pu32DstBuf = (uint32_t*)pu8DstBuf;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync for (uint32_t iw = 0; iw < pAlphaImg->width; ++iw)
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync {
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync uint8_t alpha = (((*pu32SrcBuf) >> 24) & 0xff);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync *pu32DstBuf = (0xff << 24) || (alpha << 16) || (alpha << 8) || alpha;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync ++pu32SrcBuf;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync ++pu32DstBuf;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync }
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync pu8SrcBuf += pImg->pitch;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync pu8DstBuf += pAlphaImg->pitch;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync }
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync return VINF_SUCCESS;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync}
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsyncvoid crRecAlphaImgDestroy(CR_BLITTER_IMG *pImg)
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync{
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync RTMemFree(pImg->pvData);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync pImg->pvData = NULL;
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync}
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncvoid crRecDumpTextureV(CR_RECORDER *pRec, const VBOXVR_TEXTURE *pTex, const char *pszStr, va_list pArgList)
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync{
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync CR_BLITTER_IMG Img = {0};
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync int rc = CrBltEnter(pRec->pBlitter);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync if (RT_SUCCESS(rc))
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync {
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync rc = CrBltImgGetTex(pRec->pBlitter, pTex, GL_BGRA, &Img);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync if (RT_SUCCESS(rc))
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync {
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync crDmpImgV(pRec->pDumper, &Img, pszStr, pArgList);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync if (g_CrDbgDumpAlphaData)
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync {
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync CR_BLITTER_IMG AlphaImg = {0};
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync rc = crRecAlphaImgCreate(&Img, &AlphaImg);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync if (RT_SUCCESS(rc))
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync {
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crDmpImgF(pRec->pDumper, &AlphaImg, "Texture ALPHA Data");
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crRecAlphaImgDestroy(&AlphaImg);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync }
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync else
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync {
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync crWarning("crRecAlphaImgCreate failed rc %d", rc);
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync }
2a094c4564ffa0ff64ea6dc7a8cdaafbac40580evboxsync }
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync CrBltImgFree(pRec->pBlitter, &Img);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync }
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync else
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync {
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync crWarning("CrBltImgGetTex failed, rc %d", rc);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync }
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync CrBltLeave(pRec->pBlitter);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync }
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync else
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync {
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync crWarning("CrBltEnter failed, rc %d", rc);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync }
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync}
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncvoid crRecDumpTextureF(CR_RECORDER *pRec, const VBOXVR_TEXTURE *pTex, const char *pszStr, ...)
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync{
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync va_list pArgList;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync va_start(pArgList, pszStr);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync crRecDumpTextureV(pRec, pTex, pszStr, pArgList);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync va_end(pArgList);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync}
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncvoid crRecDumpTextureByIdV(CR_RECORDER *pRec, CRContext *ctx, GLint id, const char *pszStr, va_list pArgList)
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync{
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync CRTextureObj *pTobj = (CRTextureObj *)crHashtableSearch(ctx->shared->textureTable, id);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync if (!pTobj)
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync {
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync crWarning("no texture of id %d", id);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync return;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync }
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync CRTextureLevel *pTl = &pTobj->level[0][0 /* level */];
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync VBOXVR_TEXTURE Tex;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync Tex.width = pTl->width;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync Tex.height = pTl->height;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync Tex.target = pTobj->target;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync Assert(Tex.target == GL_TEXTURE_2D);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync Tex.hwid = pTobj->hwid;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync if (!Tex.hwid)
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync {
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync crWarning("no texture hwid of id %d", id);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync return;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync }
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync crRecDumpTextureV(pRec, &Tex, pszStr, pArgList);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync}
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncvoid crRecDumpTextureByIdF(CR_RECORDER *pRec, CRContext *ctx, GLint id, const char *pszStr, ...)
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync{
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync va_list pArgList;
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync va_start(pArgList, pszStr);
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync crRecDumpTextureByIdV(pRec, ctx, id, pszStr, pArgList);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync va_end(pArgList);
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync}
32b624becaf56a356992d660b1618bd9be0c5b09vboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsyncvoid crRecDumpTextures(CR_RECORDER *pRec, CRContext *ctx)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint maxUnits = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint curTexUnit = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint restoreTexUnit = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint curProgram = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync int i;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS, &maxUnits);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync maxUnits = RT_MIN(CR_MAX_TEXTURE_UNITS, maxUnits);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_CURRENT_PROGRAM, &curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->glsl.activeProgram && ctx->glsl.activeProgram->hwid == curProgram);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(maxUnits);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_ACTIVE_TEXTURE, &curTexUnit);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync restoreTexUnit = curTexUnit;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(curTexUnit >= GL_TEXTURE0);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(curTexUnit < GL_TEXTURE0 + maxUnits);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(ctx->texture.curTextureUnit == restoreTexUnit - GL_TEXTURE0);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync for (i = 0; i < maxUnits; ++i)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLboolean enabled1D;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLboolean enabled2D;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLboolean enabled3D;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLboolean enabledCubeMap;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLboolean enabledRect;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRTextureUnit *tu = &ctx->texture.unit[i];
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (i > 1)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync break;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (curTexUnit != i + GL_TEXTURE0)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->ActiveTextureARB(i + GL_TEXTURE0);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync curTexUnit = i + GL_TEXTURE0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
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
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(enabled1D == tu->enabled1D);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(enabled2D == tu->enabled2D);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(enabled3D == tu->enabled3D);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(enabledCubeMap == tu->enabledCubeMap);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(enabledRect == tu->enabledRect);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (enabled1D)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("GL_TEXTURE_1D: unsupported");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// if (enabled2D)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint hwTex = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync VBOXVR_TEXTURE Tex;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint width = 0, height = 0, depth = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRTextureObj *pTobj = tu->currentTexture2D;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_TEXTURE_BINDING_2D, &hwTex);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (hwTex)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRTextureLevel *pTl = &pTobj->level[0][0 /* level */];
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pTobj
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync && pTobj->hwid == hwTex);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
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);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(width == pTl->width);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(height == pTl->height);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(depth == pTl->depth);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Tex.width = width;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Tex.height = height;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Tex.target = GL_TEXTURE_2D;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Tex.hwid = hwTex;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
78be54197d4b03ee467a9a20d041b4018ee47091vboxsync if (g_CrDbgDumpRecTexInfo)
78be54197d4b03ee467a9a20d041b4018ee47091vboxsync {
78be54197d4b03ee467a9a20d041b4018ee47091vboxsync crRecDumpTexParam(pRec, ctx, GL_TEXTURE_2D);
78be54197d4b03ee467a9a20d041b4018ee47091vboxsync crRecDumpTexEnv(pRec, ctx);
78be54197d4b03ee467a9a20d041b4018ee47091vboxsync crRecDumpTexGen(pRec, ctx);
78be54197d4b03ee467a9a20d041b4018ee47091vboxsync }
e20b6c04833c7afc840681167235afc1e1376f34vboxsync
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 }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// Assert(!pTobj || pTobj->hwid == 0);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// crWarning("no TEXTURE_2D bound!");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#if 0
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (enabled3D)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("GL_TEXTURE_3D: unsupported");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (enabledCubeMap)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("GL_TEXTURE_CUBE_MAP_ARB: unsupported");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// if (enabledRect)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint hwTex = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_BLITTER_IMG Img = {0};
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync VBOXVR_TEXTURE Tex;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync GLint width = 0, height = 0, depth = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRTextureObj *pTobj = tu->currentTextureRect;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->GetIntegerv(GL_TEXTURE_BINDING_RECTANGLE_NV, &hwTex);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (hwTex)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CRTextureLevel *pTl = &pTobj->level[0][0 /* level */];
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(pTobj
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync && pTobj->hwid == hwTex);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
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
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(width == pTl->width);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(height == pTl->height);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Assert(depth == pTl->depth);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Tex.width = width;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Tex.height = height;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Tex.target = GL_TEXTURE_RECTANGLE_NV;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync Tex.hwid = hwTex;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
01df41f7a4e5f7de195a059541d1c89676da9673vboxsync rc = CrBltEnter(pRec->pBlitter);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (RT_SUCCESS(rc))
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync rc = CrBltImgGetTex(pRec->pBlitter, &Tex, GL_BGRA, &Img);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (RT_SUCCESS(rc))
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpImgF(pRec->pDumper, &Img, "Unit %d: TEXTURE_RECTANGLE data", i);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CrBltImgFree(pRec->pBlitter, &Img);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("CrBltImgGetTex failed, rc %d", rc);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CrBltLeave(pRec->pBlitter);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("CrBltEnter failed, rc %d", rc);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// Assert(!pTobj || pTobj->hwid == 0);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// crWarning("no TEXTURE_RECTANGLE bound!");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync// }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#endif
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (curTexUnit != restoreTexUnit)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pRec->pDispatch->ActiveTextureARB(restoreTexUnit);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync curTexUnit = restoreTexUnit;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
e543dec2334831a2b1c04de12a5c4aab59d6746fvboxsync#ifdef RT_OS_WINDOWS
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic void crDmpPrint(const char* szString, ...)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync char szBuffer[4096] = {0};
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync va_list pArgList;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync va_start(pArgList, szString);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync RTStrPrintfV(szBuffer, sizeof (szBuffer), szString, pArgList);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync va_end(pArgList);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync OutputDebugStringA(szBuffer);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic void crDmpPrintDmlCmd(const char* pszDesc, const char* pszCmd)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpPrint("<?dml?><exec cmd=\"%s\">%s</exec>, ( %s )\n", pszCmd, pszDesc, pszCmd);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncvoid crDmpPrintDumpDmlCmd(const char* pszDesc, const void *pvData, uint32_t width, uint32_t height, uint32_t bpp, uint32_t pitch)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync char Cmd[1024];
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync sprintf(Cmd, "!vbvdbg.ms 0x%p 0n%d 0n%d 0n%d 0n%d", pvData, width, height, bpp, pitch);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpPrintDmlCmd(pszDesc, Cmd);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncDECLCALLBACK(void) crDmpDumpImgDmlBreak(struct CR_DUMPER * pDumper, CR_BLITTER_IMG *pImg, const char*pszEntryDesc)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpPrintDumpDmlCmd(pszEntryDesc, pImg->pvData, pImg->width, pImg->height, pImg->bpp, pImg->pitch);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync RT_BREAKPOINT();
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncDECLCALLBACK(void) crDmpDumpStrDbgPrint(struct CR_DUMPER * pDumper, const char*pszStr)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
0704ee3a4bf870165f86ee99ceacaf6f267f490dvboxsync crDmpPrint("%s\n", pszStr);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
e543dec2334831a2b1c04de12a5c4aab59d6746fvboxsync#endif
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic void crDmpHtmlDumpStrExact(struct CR_HTML_DUMPER * pDumper, const char *pszStr)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fprintf(pDumper->pFile, "%s", pszStr);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fflush(pDumper->pFile);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic DECLCALLBACK(void) crDmpHtmlDumpStr(struct CR_DUMPER * pDumper, const char*pszStr)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_HTML_DUMPER * pHtmlDumper = (CR_HTML_DUMPER*)pDumper;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fprintf(pHtmlDumper->pFile, "<pre>%s</pre>\n", pszStr);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fflush(pHtmlDumper->pFile);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic DECLCALLBACK(void) crDmpHtmlDumpImg(struct CR_DUMPER * pDumper, CR_BLITTER_IMG *pImg, const char*pszEntryDesc)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync CR_HTML_DUMPER * pHtmlDumper = (CR_HTML_DUMPER*)pDumper;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync char szBuffer[4096] = {0};
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync size_t cbWritten = RTStrPrintf(szBuffer, sizeof(szBuffer), "%s/", pHtmlDumper->pszDir);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync char *pszFileName = szBuffer + cbWritten;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync RTStrPrintf(pszFileName, sizeof(szBuffer) - cbWritten, "img%d.bmp", ++pHtmlDumper->cImg);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpImgBmp(pImg, szBuffer);
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);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fflush(pHtmlDumper->pFile);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic void crDmpHtmlPrintHeader(struct CR_HTML_DUMPER * pDumper)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fprintf(pDumper->pFile, "<html><body>\n");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fflush(pDumper->pFile);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncstatic void crDmpHtmlPrintFooter(struct CR_HTML_DUMPER * pDumper)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fprintf(pDumper->pFile, "</body></html>\n");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync fflush(pDumper->pFile);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncDECLEXPORT(bool) crDmpHtmlIsInited(struct CR_HTML_DUMPER * pDumper)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync return !!pDumper->pFile;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncDECLEXPORT(void) crDmpHtmlTerm(struct CR_HTML_DUMPER * pDumper)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync crDmpHtmlPrintFooter(pDumper);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync fclose (pDumper->pFile);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync pDumper->pFile = NULL;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsyncDECLEXPORT(int) crDmpHtmlInit(struct CR_HTML_DUMPER * pDumper, const char *pszDir, const char *pszFile)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync{
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync int rc = VERR_NO_MEMORY;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pDumper->Base.pfnDumpImg = crDmpHtmlDumpImg;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pDumper->Base.pfnDumpStr = crDmpHtmlDumpStr;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pDumper->cImg = 0;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pDumper->pszDir = crStrdup(pszDir);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (pDumper->pszDir)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pDumper->pszFile = crStrdup(pszFile);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (pDumper->pszFile)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync char szBuffer[4096] = {0};
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync RTStrPrintf(szBuffer, sizeof(szBuffer), "%s/%s", pszDir, pszFile);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pDumper->pszFile = crStrdup(pszFile);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync pDumper->pFile = fopen(szBuffer, "w");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync if (pDumper->pFile)
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crDmpHtmlPrintHeader(pDumper);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return VINF_SUCCESS;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("open failed");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync rc = VERR_OPEN_FAILED;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crFree((void*)pDumper->pszFile);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("open failed");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crFree((void*)pDumper->pszDir);
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync else
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync {
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync crWarning("open failed");
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync }
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync return rc;
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync}
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncDECLEXPORT(int) crDmpHtmlInitV(struct CR_HTML_DUMPER * pDumper, const char *pszDir, const char *pszFile, va_list pArgList)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync char szBuffer[4096] = {0};
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync vsprintf_s(szBuffer, sizeof (szBuffer), pszFile, pArgList);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync return crDmpHtmlInit(pDumper, pszDir, szBuffer);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsyncDECLEXPORT(int) crDmpHtmlInitF(struct CR_HTML_DUMPER * pDumper, const char *pszDir, const char *pszFile, ...)
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync{
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync int rc;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync va_list pArgList;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync va_start(pArgList, pszFile);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync rc = crDmpHtmlInitV(pDumper, pszDir, pszFile, pArgList);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync va_end(pArgList);
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync return rc;
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync}
f350d4fb2d12fd22c0905fe9c7a121499da7b52dvboxsync
12f23f71a23b2fc1bb8100885672f5310fa1989bvboxsync#endif