##########################################################################/
-"""GL retracer generator."""
+"""D3D retracer generator."""
from dllretrace import DllRetracer as Retracer
class D3DRetracer(Retracer):
- table_name = 'd3dretrace::d3d9_callbacks'
+ def retraceApi(self, api):
+ print 'static const GUID GUID_D3DRETRACE = {0x7D71CAC9,0x7F58,0x432C,{0xA9,0x75,0xA1,0x9F,0xCF,0xCE,0xFD,0x14}};'
+ print
- bufferInterfaceNames = [
- 'IDirect3DVertexBuffer9',
- 'IDirect3DIndexBuffer9',
- ]
+ self.table_name = 'd3dretrace::%s_callbacks' % api.name.lower()
- def extractArg(self, function, arg, arg_type, lvalue, rvalue):
- if arg.type is D3DSHADER9:
- print r' %s = extractShader((%s).toString());' % (lvalue, rvalue)
- return
-
- Retracer.extractArg(self, function, arg, arg_type, lvalue, rvalue)
+ Retracer.retraceApi(self, api)
def invokeInterfaceMethod(self, interface, method):
- if interface.name == 'IDirect3D9' and method.name == 'CreateDevice':
- print r' HWND hWnd = createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);'
+ # keep track of the last used device for state dumping
+ if interface.name in ('IDirect3DDevice9', 'IDirect3DDevice9Ex'):
+ print r' d3dretrace::pLastDirect3DDevice9 = _this;'
+
+ # create windows as neccessary
+ if method.name in ('CreateDevice', 'CreateDeviceEx', 'CreateAdditionalSwapChain'):
+ print r' HWND hWnd = d3dretrace::createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);'
print r' pPresentationParameters->hDeviceWindow = hWnd;'
- print r' hFocusWindow = hWnd;'
+ if 'hFocusWindow' in method.argNames():
+ print r' hFocusWindow = hWnd;'
+
+ if method.name in ('Reset', 'ResetEx'):
+ print r' if (pPresentationParameters->Windowed) {'
+ print r' d3dretrace::resizeWindow(pPresentationParameters->hDeviceWindow, pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);'
+ print r' }'
+
+ # notify frame has been completed
+ if method.name == 'Present':
+ print r' retrace::frameComplete(call);'
+ print r' hDestWindowOverride = NULL;'
+
+ if 'pSharedHandle' in method.argNames():
+ print r' if (pSharedHandle) {'
+ print r' retrace::warning(call) << "shared surfaces unsupported\n";'
+ print r' pSharedHandle = NULL;'
+ print r' }'
Retracer.invokeInterfaceMethod(self, interface, method)
+ # process events after presents
+ if method.name == 'Present':
+ print r' d3dretrace::processEvents();'
+
+ # check errors
if str(method.type) == 'HRESULT':
- print r' if (_result != S_OK) {'
+ print r' if (FAILED(_result)) {'
print r' retrace::warning(call) << "failed\n";'
print r' }'
- if interface.name in self.bufferInterfaceNames and method.name == 'Lock':
- getDescMethod = interface.getMethodByName('GetDesc')
- descArg = getDescMethod.args[0]
- assert descArg.output
- descType = getDescMethod.args[0].type.type
-
- print ' if (!SizeToLock) {'
- print ' %s Desc;' % descType
- print ' _this->GetDesc(&Desc);'
- print ' SizeToLock = Desc.Size;'
- print ' }'
+ if method.name in ('Lock', 'LockRect', 'LockBox'):
+ print ' VOID *_pbData = NULL;'
+ print ' size_t _LockedSize = 0;'
+ print ' _getLockInfo(_this, %s, _pbData, _LockedSize);' % ', '.join(method.argNames()[:-1])
+ print ' _this->SetPrivateData(GUID_D3DRETRACE, &_pbData, sizeof _pbData, 0);'
+
+ if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'):
+ print ' VOID *_pbData = 0;'
+ print ' DWORD dwSizeOfData = sizeof _pbData;'
+ print ' _this->GetPrivateData(GUID_D3DRETRACE, &_pbData, &dwSizeOfData);'
+ print ' if (_pbData) {'
+ print ' retrace::delRegionByPointer(_pbData);'
+ print ' }'
if __name__ == '__main__':
#include <iostream>
#include "d3d9imports.hpp"
+#include "d3dsize.hpp"
#include "d3dretrace.hpp"
-
-// XXX: Don't duplicate this code.
-
-static LRESULT CALLBACK
-WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam)
-{
- MINMAXINFO *pMMI;
- switch (uMsg) {
- case WM_GETMINMAXINFO:
- // Allow to create a window bigger than the desktop
- pMMI = (MINMAXINFO *)lParam;
- pMMI->ptMaxSize.x = 60000;
- pMMI->ptMaxSize.y = 60000;
- pMMI->ptMaxTrackSize.x = 60000;
- pMMI->ptMaxTrackSize.y = 60000;
- break;
- default:
- break;
- }
-
- return DefWindowProc(hWnd, uMsg, wParam, lParam);
-}
-
-
-static HWND
-createWindow(int width, int height) {
- static bool first = TRUE;
- RECT rect;
-
- if (first) {
- WNDCLASS wc;
- memset(&wc, 0, sizeof wc);
- wc.hbrBackground = (HBRUSH) (COLOR_BTNFACE + 1);
- wc.hCursor = LoadCursor(NULL, IDC_ARROW);
- wc.hIcon = LoadIcon(NULL, IDI_APPLICATION);
- wc.lpfnWndProc = WndProc;
- wc.lpszClassName = "d3dretrace";
- wc.style = CS_OWNDC | CS_HREDRAW | CS_VREDRAW;
- RegisterClass(&wc);
- first = FALSE;
- }
-
- DWORD dwExStyle;
- DWORD dwStyle;
- HWND hWnd;
-
- dwExStyle = 0;
- dwStyle = WS_CLIPSIBLINGS | WS_CLIPCHILDREN | WS_OVERLAPPEDWINDOW;
-
- int x = 0, y = 0;
-
- rect.left = x;
- rect.top = y;
- rect.right = rect.left + width;
- rect.bottom = rect.top + height;
-
- AdjustWindowRectEx(&rect, dwStyle, FALSE, dwExStyle);
-
- hWnd = CreateWindowEx(dwExStyle,
- "d3dretrace", /* wc.lpszClassName */
- NULL,
- dwStyle,
- 0, /* x */
- 0, /* y */
- rect.right - rect.left, /* width */
- rect.bottom - rect.top, /* height */
- NULL,
- NULL,
- NULL,
- NULL);
- ShowWindow(hWnd, SW_SHOW);
- return hWnd;
-}
-
-
-
-typedef HRESULT
-(WINAPI *PD3DXASSEMBLESHADER)(
- LPCSTR pSrcData,
- UINT SrcDataLen,
- const D3DXMACRO *pDefines,
- LPD3DXINCLUDE pInclude,
- DWORD Flags,
- LPD3DXBUFFER *ppShader,
- LPD3DXBUFFER *ppErrorMsgs
-);
-
-DWORD *
-extractShader(LPCSTR pSrcData)
-{
- static BOOL firsttime = TRUE;
- static HMODULE hD3DXModule = NULL;
- static PD3DXASSEMBLESHADER pfnD3DXAssembleShader = NULL;
-
- if (firsttime) {
- if (!hD3DXModule) {
- unsigned release;
- int version;
- for (release = 0; release <= 1; ++release) {
- /* Version 41 corresponds to Mar 2009 version of DirectX Runtime / SDK */
- for (version = 41; version >= 0; --version) {
- char filename[256];
- _snprintf(filename, sizeof(filename),
- "d3dx9%s%s%u.dll", release ? "" : "d", version ? "_" : "", version);
- hD3DXModule = LoadLibraryA(filename);
- if (hD3DXModule)
- goto found;
- }
- }
-found:
- ;
- }
-
- if (hD3DXModule) {
- if (!pfnD3DXAssembleShader) {
- pfnD3DXAssembleShader = (PD3DXASSEMBLESHADER)GetProcAddress(hD3DXModule, "D3DXAssembleShader");
- }
- }
-
- firsttime = FALSE;
- }
-
- if (pfnD3DXAssembleShader) {
- LPD3DXBUFFER pTokens = NULL;
- HRESULT hr;
-
- hr = pfnD3DXAssembleShader(pSrcData, strlen(pSrcData), NULL, NULL, 0, &pTokens, NULL);
- if (hr == D3D_OK) {
- return (DWORD *)pTokens->GetBufferPointer();
- }
-
- // FIXME: Don't leak pTokens
- }
-
- return NULL;
-}
'''
- d3d9.name = 'd3d9d'
retracer = D3DRetracer()
retracer.retraceApi(d3d9)