From 46a2db052b7bd310c27b63f72ac6c617457e2f49 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Jos=C3=A9=20Fonseca?= Date: Thu, 28 Apr 2011 08:48:20 +0100 Subject: [PATCH] Dump D3D9 shaders as text, as done previously. --- CMakeLists.txt | 32 ++++++++++-------- d3d9.py | 8 ++++- d3d9imports.hpp | 1 + d3d9shader.hpp | 102 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 128 insertions(+), 15 deletions(-) create mode 100644 d3d9shader.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index fdf0f53..cd2c8f9 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -147,11 +147,8 @@ add_custom_command ( ) if (WIN32) - # Put wrappers in a separate directory - set (LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/wrappers) - # d3d8.dll - #if (DirectX_D3D8_FOUND) + #if (DirectX_D3D8_INCLUDE_DIR) # include_directories (${DirectX_D3D8_INCLUDE_DIR}) # add_custom_command ( # OUTPUT d3d8.cpp @@ -160,10 +157,10 @@ if (WIN32) # ) # add_library (d3d8 SHARED d3d8.def d3d8.cpp trace_write.cpp os_win32.cpp) # set_target_properties (d3d8 PROPERTIES PREFIX "") - #endif (DirectX_D3D8_FOUND) + #endif (DirectX_D3D8_INCLUDE_DIR) # d3d9.dll - if (DirectX_D3DX9_FOUND) + if (DirectX_D3DX9_INCLUDE_DIR) include_directories (${DirectX_D3DX9_INCLUDE_DIR}) add_custom_command ( OUTPUT d3d9.cpp @@ -171,11 +168,15 @@ if (WIN32) DEPENDS d3d9.py trace.py d3d9types.py d3d9caps.py d3dshader.py winapi.py stdapi.py ) add_library (d3d9 SHARED d3d9.def d3d9.cpp trace_write.cpp os_win32.cpp) - set_target_properties (d3d9 PROPERTIES PREFIX "") - endif (DirectX_D3DX9_FOUND) + set_target_properties (d3d9 + PROPERTIES PREFIX "" + RUNTIME_OUTPUT_PATH ${PROJECT_BINARY_DIR}/wrappers + LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/wrappers + ) + endif (DirectX_D3DX9_INCLUDE_DIR) # d3d10.dll - #if (DirectX_D3D10_FOUND) + #if (DirectX_D3D10_INCLUDE_DIR) # include_directories (${DirectX_D3D10_INCLUDE_DIR}) # add_custom_command ( # OUTPUT d3d10.cpp @@ -184,7 +185,7 @@ if (WIN32) # ) # add_library (d3d10 SHARED d3d10.def d3d10.cpp trace_write.cpp os_win32.cpp) # set_target_properties (d3d10 PROPERTIES PREFIX "") - #endif (DirectX_D3D10_FOUND) + #endif (DirectX_D3D10_INCLUDE_DIR) # opengl32.dll add_custom_command ( @@ -192,12 +193,15 @@ if (WIN32) COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/wgltrace.py > ${CMAKE_CURRENT_BINARY_DIR}/wgltrace.cpp DEPENDS wgltrace.py gltrace.py trace.py wglapi.py wglenum.py glapi.py glenum.py winapi.py stdapi.py ) - add_library (opengl SHARED opengl32.def wgltrace.cpp trace_write.cpp os_win32.cpp ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp) - set_target_properties (opengl PROPERTIES + add_library (wgltrace SHARED opengl32.def wgltrace.cpp trace_write.cpp os_win32.cpp ${CMAKE_CURRENT_BINARY_DIR}/glproc.hpp) + set_target_properties (wgltrace PROPERTIES PREFIX "" - OUTPUT_NAME opengl32) + OUTPUT_NAME opengl32 + RUNTIME_OUTPUT_PATH ${PROJECT_BINARY_DIR}/wrappers + LIBRARY_OUTPUT_PATH ${PROJECT_BINARY_DIR}/wrappers + ) if (MINGW) - set_target_properties(opengl PROPERTIES LINK_FLAGS "-Wl,--enable-stdcall-fixup ${CMAKE_CURRENT_SOURCE_DIR}/opengl32.def") + set_target_properties(wgltrace PROPERTIES LINK_FLAGS "-Wl,--enable-stdcall-fixup ${CMAKE_CURRENT_SOURCE_DIR}/opengl32.def") endif (MINGW) else () diff --git a/d3d9.py b/d3d9.py index 81d310a..6db9536 100644 --- a/d3d9.py +++ b/d3d9.py @@ -406,12 +406,18 @@ d3d9.add_functions([ class D3D9Tracer(DllTracer): - pass + def dump_arg_instance(self, function, arg): + # Dump shaders as strings + if function.name in ('CreateVertexShader', 'CreatePixelShader') and arg.name == 'pFunction': + print ' DumpShader(%s);' % (arg.name) + return + DllTracer.dump_arg_instance(self, function, arg) if __name__ == '__main__': print '#include "d3d9imports.hpp"' + print '#include "d3d9shader.hpp"' print print '#include "trace_write.hpp"' print '#include "os.hpp"' diff --git a/d3d9imports.hpp b/d3d9imports.hpp index a7cfcbf..e2e2015 100644 --- a/d3d9imports.hpp +++ b/d3d9imports.hpp @@ -36,6 +36,7 @@ #include "compat.h" #include +#include #ifndef D3DFMT_ATI1 diff --git a/d3d9shader.hpp b/d3d9shader.hpp new file mode 100644 index 0000000..63883f2 --- /dev/null +++ b/d3d9shader.hpp @@ -0,0 +1,102 @@ +/************************************************************************** + * + * Copyright 2011 Jose Fonseca + * Copyright 2008-2009 VMware, Inc. + * All Rights Reserved. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + * + **************************************************************************/ + +#ifndef _D3D9SHADER_HPP_ +#define _D3D9SHADER_HPP_ + + +#include + +#include "d3d9imports.hpp" +#include "trace_write.hpp" + + +typedef HRESULT +(WINAPI *PD3DXDISASSEMBLESHADER)( + CONST DWORD *pShader, + BOOL EnableColorCode, + LPCSTR pComments, + LPD3DXBUFFER *ppDisassembly +); + + +static void DumpShader(const DWORD *tokens) +{ + static BOOL firsttime = TRUE; + static HMODULE hD3DXModule = NULL; + static PD3DXDISASSEMBLESHADER pfnD3DXDisassembleShader = 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 (!pfnD3DXDisassembleShader) { + pfnD3DXDisassembleShader = (PD3DXDISASSEMBLESHADER)GetProcAddress(hD3DXModule, "D3DXDisassembleShader"); + } + } + + firsttime = FALSE; + } + + if (pfnD3DXDisassembleShader) { + LPD3DXBUFFER pDisassembly = NULL; + HRESULT hr; + + hr = pfnD3DXDisassembleShader( (DWORD *)tokens, FALSE, NULL, &pDisassembly); + if (hr == D3D_OK) { + Trace::LiteralString((const char *)pDisassembly->GetBufferPointer()); + } + + if (pDisassembly) { + pDisassembly->Release(); + } + + if (hr == D3D_OK) { + return; + } + } + + Trace::LiteralOpaque(tokens); +} + + +#endif /* _D3D9SHADER_HPP_ */ -- 2.7.4