From 73341c2fc4c5d70ccca9871043edfd588477d8b8 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Sat, 24 Nov 2012 13:04:42 +0000 Subject: [PATCH] d3dretrace: Basic d3d8 support. --- retrace/CMakeLists.txt | 22 ++++++++++++- retrace/d3d9retrace.py | 62 +++++++++++++++++++++++++------------ retrace/d3dretrace.hpp | 3 +- retrace/d3dretrace_main.cpp | 3 +- retrace/dxgiretrace.py | 5 ++- 5 files changed, 70 insertions(+), 25 deletions(-) diff --git a/retrace/CMakeLists.txt b/retrace/CMakeLists.txt index b3068fc..9071998 100644 --- a/retrace/CMakeLists.txt +++ b/retrace/CMakeLists.txt @@ -133,7 +133,7 @@ if (WIN32 AND DirectX_D3DX9_INCLUDE_DIR) include_directories (SYSTEM ${DirectX_D3DX9_INCLUDE_DIR}) add_custom_command ( OUTPUT d3dretrace_d3d9.cpp - COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9retrace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d9.cpp + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9retrace.py d3d9 1 > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d9.cpp DEPENDS d3d9retrace.py dllretrace.py @@ -146,6 +146,25 @@ if (WIN32 AND DirectX_D3DX9_INCLUDE_DIR) ${CMAKE_SOURCE_DIR}/specs/stdapi.py ) + if (DirectX_D3D8_INCLUDE_DIR) + include_directories (SYSTEM ${DirectX_D3D8_INCLUDE_DIR}) + set (HAVE_D3D8 1) + endif () + add_custom_command ( + OUTPUT d3dretrace_d3d8.cpp + COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d9retrace.py d3d8 ${HAVE_D3D8} > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d8.cpp + DEPENDS + d3d9retrace.py + dllretrace.py + retrace.py + ${CMAKE_SOURCE_DIR}/dispatch/dispatch.py + ${CMAKE_SOURCE_DIR}/specs/d3d8.py + ${CMAKE_SOURCE_DIR}/specs/d3d8types.py + ${CMAKE_SOURCE_DIR}/specs/d3d8caps.py + ${CMAKE_SOURCE_DIR}/specs/winapi.py + ${CMAKE_SOURCE_DIR}/specs/stdapi.py + ) + if (DirectX_D3D10_INCLUDE_DIR) include_directories (SYSTEM ${DirectX_D3D10_INCLUDE_DIR}) set (DXGI_MODULES d3d10) @@ -199,6 +218,7 @@ if (WIN32 AND DirectX_D3DX9_INCLUDE_DIR) add_executable (d3dretrace d3dretrace_main.cpp + d3dretrace_d3d8.cpp d3dretrace_d3d9.cpp d3dretrace_dxgi.cpp d3dretrace_ws.cpp diff --git a/retrace/d3d9retrace.py b/retrace/d3d9retrace.py index 1b89b68..0ddcf27 100644 --- a/retrace/d3d9retrace.py +++ b/retrace/d3d9retrace.py @@ -27,23 +27,18 @@ """D3D retracer generator.""" +import sys from dllretrace import DllRetracer as Retracer from specs.stdapi import API -from specs.d3d9 import * class D3DRetracer(Retracer): def retraceApi(self, api): - print '''static d3dretrace::D3DDumper d3d9Dumper;''' - print - print '// Swizzling mapping for lock addresses' print 'static std::map _maps;' print - self.table_name = 'd3dretrace::d3d9_callbacks' - Retracer.retraceApi(self, api) def invokeFunction(self, function): @@ -101,30 +96,59 @@ class D3DRetracer(Retracer): print ' VOID *_pbData = NULL;' print ' size_t _MappedSize = 0;' print ' _getMapInfo(_this, %s, _pbData, _MappedSize);' % ', '.join(method.argNames()[:-1]) - print ' _maps[_this] = _pbData;' + print ' if (_MappedSize) {' + print ' _maps[_this] = _pbData;' + print ' } else {' + print ' return;' + print ' }' if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'): print ' VOID *_pbData = 0;' print ' _pbData = _maps[_this];' print ' if (_pbData) {' print ' retrace::delRegionByPointer(_pbData);' + print ' _maps[_this] = 0;' print ' }' -if __name__ == '__main__': - print r''' -#include - -#include +def main(): + print r'#include ' + print + print r'#include ' + print + print r'#include "d3dretrace.hpp"' + print -#include "d3d9imports.hpp" -#include "d3d9size.hpp" -#include "d3dretrace.hpp" -#include "d3dstate.hpp" - -''' + moduleName = sys.argv[1] + support = bool(sys.argv[2]) api = API() - api.addModule(d3d9) + + if support: + if moduleName == 'd3d9': + from specs.d3d9 import d3d9 + print r'#include "d3d9imports.hpp"' + print r'#include "d3d9size.hpp"' + api.addModule(d3d9) + print + print '''static d3dretrace::D3DDumper d3d9Dumper;''' + print + elif moduleName == 'd3d8': + from specs.d3d8 import d3d8 + print r'#include ' + print r'#include ' + print r'#include "d3d8size.hpp"' + api.addModule(d3d8) + print + #print '''static d3dretrace::D3DDumper d3d8Dumper;''' + print + else: + assert False + retracer = D3DRetracer() + retracer.table_name = 'd3dretrace::%s_callbacks' % moduleName retracer.retraceApi(api) + + +if __name__ == '__main__': + main() diff --git a/retrace/d3dretrace.hpp b/retrace/d3dretrace.hpp index 144a5c4..41cc1c5 100644 --- a/retrace/d3dretrace.hpp +++ b/retrace/d3dretrace.hpp @@ -36,8 +36,9 @@ namespace d3dretrace { +extern const retrace::Entry d3d8_callbacks[]; extern const retrace::Entry d3d9_callbacks[]; -extern const retrace::Entry d3d10_callbacks[]; +extern const retrace::Entry dxgi_callbacks[]; template< class Device > diff --git a/retrace/d3dretrace_main.cpp b/retrace/d3dretrace_main.cpp index e62b761..3de6daa 100644 --- a/retrace/d3dretrace_main.cpp +++ b/retrace/d3dretrace_main.cpp @@ -41,8 +41,9 @@ retrace::setUp(void) { void retrace::addCallbacks(retrace::Retracer &retracer) { + retracer.addCallbacks(d3dretrace::d3d8_callbacks); retracer.addCallbacks(d3dretrace::d3d9_callbacks); - retracer.addCallbacks(d3dretrace::d3d10_callbacks); + retracer.addCallbacks(d3dretrace::dxgi_callbacks); } diff --git a/retrace/dxgiretrace.py b/retrace/dxgiretrace.py index e3eddbb..c7baaf2 100644 --- a/retrace/dxgiretrace.py +++ b/retrace/dxgiretrace.py @@ -55,7 +55,7 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) { } ''' - self.table_name = 'd3dretrace::d3d10_callbacks' + self.table_name = 'd3dretrace::dxgi_callbacks' Retracer.retraceApi(self, api) @@ -90,7 +90,6 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) { Retracer.invokeFunction(self, function) - def invokeInterfaceMethod(self, interface, method): # keep track of the last used device for state dumping if interface.name in ('ID3D10Device', 'ID3D10Device1'): @@ -144,7 +143,7 @@ createWindow(DXGI_SWAP_CHAIN_DESC *pSwapChainDesc) { def main(): - print r'''#include ''' + print r'#include ' print print r'#include ' print -- 2.43.0