X-Git-Url: https://git.cworth.org/git?a=blobdiff_plain;f=retrace%2Fd3dretrace.py;h=3270161197f049bb8474cdf07dd914524dd2c2f0;hb=a4c698dfae954d04b459a9b9543d0404a4c80660;hp=e3f2745826f4efe7c18de1774c4c061310e87c67;hpb=bf1d59ff63a653fc7efed9aa19071465247f1d01;p=apitrace diff --git a/retrace/d3dretrace.py b/retrace/d3dretrace.py index e3f2745..3270161 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 @@ -48,13 +49,20 @@ class D3DRetracer(Retracer): # create windows as neccessary if method.name in ('CreateDevice', 'CreateDeviceEx'): - print r' HWND hWnd = createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);' + print r' HWND hWnd = d3dretrace::createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);' print r' hFocusWindow = hWnd;' print r' pPresentationParameters->hDeviceWindow = hWnd;' + # notify frame has been completed if method.name == 'Present': print r' retrace::frameComplete(call);' + 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) # check errors @@ -64,31 +72,22 @@ class D3DRetracer(Retracer): print r' }' if method.name in ('Lock', 'LockRect', 'LockBox'): - print ' size_t _LockedSize = _getLockSize(_this, %s);' % ', '.join(method.argNames()[:-1]) - if method.name == 'Lock': - # FIXME: handle recursive locks - print ' VOID *_pbData = *ppbData;' - elif method.name == 'LockRect': - print ' VOID *_pbData = pLockedRect->pBits;' - elif method.name == 'LockBox': - print ' VOID *_pbData = pLockedVolume->pBits;' - else: - raise NotImplementedError - print ' _this->SetPrivateData(GUID_APITRACE, &_pbData, sizeof _pbData, 0);' + 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_APITRACE, &_pbData, &dwSizeOfData);' - print ' if (_pbData) {' - print ' retrace::delRegionByPointer(_pbData);' - print ' }' + 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__': print r''' -#define INITGUID - #include #include @@ -97,145 +96,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); -} - - -DEFINE_GUID(GUID_APITRACE,0X7D71CAC9,0X7F58,0X432C,0XA9,0X75,0XA1,0X9F,0XCF,0XCE,0XFD,0X14); - - -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 (SUCCEEDED(hr)) { - return (DWORD *)pTokens->GetBufferPointer(); - } - - // FIXME: Don't leak pTokens - } - - return NULL; -} ''' retracer = D3DRetracer()