##########################################################################/
-"""GL retracer generator."""
+"""D3D retracer generator."""
from dllretrace import DllRetracer as Retracer
import specs.stdapi as stdapi
-from specs.d3d9 import d3d9
+from specs.d3d9 import *
class D3DRetracer(Retracer):
]
def invokeInterfaceMethod(self, interface, method):
- if interface.name == 'IDirect3D9' and method.name == 'CreateDevice':
- print 'HWND hWnd = createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);'
- print 'pPresentationParameters->hDeviceWindow = hWnd;'
- print 'hFocusWindow = hWnd;'
+ # 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'):
+ print r' HWND hWnd = createWindow(pPresentationParameters->BackBufferWidth, pPresentationParameters->BackBufferHeight);'
+ print r' hFocusWindow = hWnd;'
+ print r' pPresentationParameters->hDeviceWindow = hWnd;'
Retracer.invokeInterfaceMethod(self, interface, method)
+ # 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 ' size_t _LockedSize = _getLockSize(_this, %s);' % ', '.join(method.argNames()[:-1])
if __name__ == '__main__':
#include <iostream>
#include "d3d9imports.hpp"
+#include "d3dsize.hpp"
#include "d3dretrace.hpp"
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()
retracer.retraceApi(d3d9)