X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fd3dretrace.py;h=ddd37b95a8b7c3d4b3ca34e1b287846fed5d6f8a;hb=c94ef353dd2a8392ec5dbbfe1d345945acde7d20;hp=f1e8a68781a5d5d708fe143c59bcaae040d37a4d;hpb=a0e97860386786fcdb106471a3908b4ba66242e6;p=apitrace diff --git a/retrace/d3dretrace.py b/retrace/d3dretrace.py index f1e8a68..ddd37b9 100644 --- a/retrace/d3dretrace.py +++ b/retrace/d3dretrace.py @@ -34,12 +34,13 @@ from specs.d3d9 import * 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() + + Retracer.retraceApi(self, api) def invokeInterfaceMethod(self, interface, method): # keep track of the last used device for state dumping @@ -47,34 +48,53 @@ class D3DRetracer(Retracer): print r' d3dretrace::pLastDirect3DDevice9 = _this;' # create windows as neccessary - if method.name in ('CreateDevice', 'CreateDeviceEx'): - print r' HWND hWnd = createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);' - print r' hFocusWindow = hWnd;' + if method.name in ('CreateDevice', 'CreateDeviceEx', 'CreateAdditionalSwapChain'): + print r' HWND hWnd = d3dretrace::createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);' print r' pPresentationParameters->hDeviceWindow = 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 (FAILED(_result)) {' print r' retrace::warning(call) << "failed\n";' print r' }' - if interface.name in self.bufferInterfaceNames and method.name == 'Lock' or \ - interface.name == 'IDirect3DSurface9' and method.name == 'LockRect': - getDescMethod = interface.getMethodByName('GetDesc') - descArg = getDescMethod.args[0] - assert descArg.output - descType = getDescMethod.args[0].type.type - - if interface.name in self.bufferInterfaceNames: - print ' if (!SizeToLock) {' - print ' %s Desc;' % descType - print ' _this->GetDesc(&Desc);' - print ' SizeToLock = Desc.Size;' - print ' }' - elif interface.name == 'IDirect3DSurface9': - print ' size_t m_SizeToLock = _lockSize(_this, pLockedRect, pRect);' + 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__': @@ -87,142 +107,6 @@ if __name__ == '__main__': #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; -} ''' retracer = D3DRetracer()