--- /dev/null
+/**************************************************************************
+ *
+ * Copyright 2012 Jose Fonseca
+ * 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.
+ *
+ **************************************************************************/
+
+/*
+ * Dynamic library linking abstraction.
+ */
+
+#ifndef _OS_DL_HPP_
+#define _OS_DL_HPP_
+
+
+#if defined(_WIN32)
+#include <windows.h>
+#else
+#include <dlfcn.h>
+#endif
+
+
+#if defined(_WIN32)
+#define OS_LIBRARY_EXTENSION ".dll"
+#elif defined(__APPLE__)
+#define OS_LIBRARY_EXTENSION ".dylib"
+#else
+#define OS_LIBRARY_EXTENSION ".so"
+#endif
+
+
+namespace os {
+
+ // TODO: Wrap in a class
+#if defined(_WIN32)
+ typedef HMODULE Library;
+#else
+ typedef void * Library;
+#endif
+
+ inline Library
+ openLibrary(const char *filename) {
+#if defined(_WIN32)
+ return LoadLibraryA(filename);
+#else
+ return dlopen(filename, RTLD_LOCAL | RTLD_LAZY);
+#endif
+ }
+
+ inline void *
+ getLibrarySymbol(Library library, const char *symbol) {
+#if defined(_WIN32)
+ return (void *)GetProcAddress(library, symbol);
+#else
+ return dlsym(library, symbol);
+#endif
+ }
+
+ inline void
+ closeLibrary(Library library) {
+#if defined(_WIN32)
+ FreeLibrary(library);
+#else
+ dlclose(library);
+#endif
+ }
+
+
+} /* namespace os */
+
+#endif /* _OS_DL_HPP_ */
#
raise NotImplementedError
- def dispatchApi(self, api):
- for function in api.functions:
- self.dispatchFunction(api, function)
+ def dispatchModule(self, module):
+ for function in module.functions:
+ self.dispatchFunction(module, function)
# define standard name aliases for convenience, but only when not
# tracing, as that would cause symbol clashing with the tracing
# functions
print '#ifdef RETRACE'
- for function in api.functions:
+ for function in module.functions:
print '#define %s _%s' % (function.name, function.name)
print '#endif /* RETRACE */'
print
- def dispatchFunction(self, api, function):
+ def dispatchFunction(self, module, function):
ptype = function_pointer_type(function)
pvalue = function_pointer_value(function)
print 'typedef ' + function.prototype('* %s' % ptype) + ';'
ret = ''
else:
ret = 'return '
- self.invokeGetProcAddress(api, function)
+ self.invokeGetProcAddress(module, function)
print ' %s%s(%s);' % (ret, pvalue, ', '.join([str(arg.name) for arg in function.args]))
print '}'
print
- def isFunctionPublic(self, api, function):
+ def isFunctionPublic(self, module, function):
return True
- def getProcAddressName(self, api, function):
- if self.isFunctionPublic(api, function):
+ def getProcAddressName(self, module, function):
+ if self.isFunctionPublic(module, function):
return '_getPublicProcAddress'
else:
return '_getPrivateProcAddress'
- def invokeGetProcAddress(self, api, function):
+ def invokeGetProcAddress(self, module, function):
ptype = function_pointer_type(function)
pvalue = function_pointer_value(function)
- getProcAddressName = self.getProcAddressName(api, function)
+ getProcAddressName = self.getProcAddressName(module, function)
print ' if (!%s) {' % (pvalue,)
print ' %s = (%s)%s(_name);' % (pvalue, ptype, getProcAddressName)
print ' if (!%s) {' % (pvalue,)
void * _getPrivateProcAddress(const char *procName);
'''
- def isFunctionPublic(self, api, function):
+ def isFunctionPublic(self, module, function):
return function.name in public_symbols or function.name.startswith('CGL')
print
dispatcher.header()
print
- dispatcher.dispatchApi(eglapi)
+ dispatcher.dispatchModule(eglapi)
print
print '#if defined(_WIN32)'
print
- dispatcher.dispatchApi(wglapi)
+ dispatcher.dispatchModule(wglapi)
print
print '#elif defined(__APPLE__)'
print
- dispatcher.dispatchApi(cglapi)
+ dispatcher.dispatchModule(cglapi)
print
print '#elif defined(HAVE_X11)'
print
- dispatcher.dispatchApi(glxapi)
+ dispatcher.dispatchModule(glxapi)
print
print '#endif'
print
- dispatcher.dispatchApi(glapi)
+ dispatcher.dispatchModule(glapi)
print
- dispatcher.dispatchApi(glesapi)
+ dispatcher.dispatchModule(glesapi)
print
print '#endif /* !_GLPROC_HPP_ */'
m_image.height() + hScrollHeight);
QRect screenRect = QApplication::desktop()->availableGeometry();
- const float maxPercentOfDesktopSpace = 0.8;
+ const float maxPercentOfDesktopSpace = 0.8f;
QSize maxAvailableSize(maxPercentOfDesktopSpace * screenRect.width(),
maxPercentOfDesktopSpace * screenRect.height());
static inline void
-_getLockInfo(IDirect3DVertexBuffer9 *pBuffer, UINT OffsetToLock, UINT SizeToLock, void ** ppbData,
- void * & pLockedData, size_t & LockedSize) {
+_getMapInfo(IDirect3DVertexBuffer9 *pBuffer, UINT OffsetToLock, UINT SizeToLock, void ** ppbData,
+ void * & pLockedData, size_t & MappedSize) {
pLockedData = *ppbData;
- LockedSize = 0;
+ MappedSize = 0;
if (SizeToLock == 0) {
D3DVERTEXBUFFER_DESC Desc;
if (FAILED(hr)) {
return;
}
- LockedSize = Desc.Size;
+ MappedSize = Desc.Size;
} else {
- LockedSize = SizeToLock;
+ MappedSize = SizeToLock;
}
}
static inline void
-_getLockInfo(IDirect3DIndexBuffer9 *pBuffer, UINT OffsetToLock, UINT SizeToLock, void ** ppbData,
- void * & pLockedData, size_t & LockedSize) {
+_getMapInfo(IDirect3DIndexBuffer9 *pBuffer, UINT OffsetToLock, UINT SizeToLock, void ** ppbData,
+ void * & pLockedData, size_t & MappedSize) {
pLockedData = *ppbData;
- LockedSize = 0;
+ MappedSize = 0;
if (SizeToLock == 0) {
D3DINDEXBUFFER_DESC Desc;
if (FAILED(hr)) {
return;
}
- LockedSize = Desc.Size;
+ MappedSize = Desc.Size;
} else {
- LockedSize = SizeToLock;
+ MappedSize = SizeToLock;
}
}
static inline void
-_getLockInfo(IDirect3DSurface9 *pSurface, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect,
- void * & pLockedData, size_t & LockedSize) {
+_getMapInfo(IDirect3DSurface9 *pSurface, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect,
+ void * & pLockedData, size_t & MappedSize) {
pLockedData = pLockedRect->pBits;
- LockedSize = 0;
+ MappedSize = 0;
HRESULT hr;
Height = Desc.Height;
}
- LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch);
+ MappedSize = _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch);
}
static inline void
-_getLockInfo(IDirect3DTexture9 *pTexture, UINT Level, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect,
- void * & pLockedData, size_t & LockedSize) {
+_getMapInfo(IDirect3DTexture9 *pTexture, UINT Level, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect,
+ void * & pLockedData, size_t & MappedSize) {
pLockedData = pLockedRect->pBits;
- LockedSize = 0;
+ MappedSize = 0;
HRESULT hr;
Height = Desc.Height;
}
- LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch);
+ MappedSize = _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch);
}
static inline void
-_getLockInfo(IDirect3DCubeTexture9 *pTexture, D3DCUBEMAP_FACES FaceType, UINT Level, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect,
- void * & pLockedData, size_t & LockedSize) {
+_getMapInfo(IDirect3DCubeTexture9 *pTexture, D3DCUBEMAP_FACES FaceType, UINT Level, const D3DLOCKED_RECT *pLockedRect, const RECT *pRect,
+ void * & pLockedData, size_t & MappedSize) {
pLockedData = pLockedRect->pBits;
- LockedSize = 0;
+ MappedSize = 0;
HRESULT hr;
Height = Desc.Height;
}
- LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch);
+ MappedSize = _getLockSize(Desc.Format, Width, Height, pLockedRect->Pitch);
}
static inline void
-_getLockInfo(IDirect3DVolume9 *pVolume, const D3DLOCKED_BOX *pLockedVolume, const D3DBOX *pBox,
- void * & pLockedData, size_t & LockedSize) {
+_getMapInfo(IDirect3DVolume9 *pVolume, const D3DLOCKED_BOX *pLockedVolume, const D3DBOX *pBox,
+ void * & pLockedData, size_t & MappedSize) {
pLockedData = pLockedVolume->pBits;
- LockedSize = 0;
+ MappedSize = 0;
HRESULT hr;
Depth = Desc.Depth;
}
- LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedVolume->RowPitch, Depth, pLockedVolume->SlicePitch);
+ MappedSize = _getLockSize(Desc.Format, Width, Height, pLockedVolume->RowPitch, Depth, pLockedVolume->SlicePitch);
}
static inline void
-_getLockInfo(IDirect3DVolumeTexture9 *pTexture, UINT Level, const D3DLOCKED_BOX *pLockedVolume, const D3DBOX *pBox,
- void * & pLockedData, size_t & LockedSize) {
+_getMapInfo(IDirect3DVolumeTexture9 *pTexture, UINT Level, const D3DLOCKED_BOX *pLockedVolume, const D3DBOX *pBox,
+ void * & pLockedData, size_t & MappedSize) {
pLockedData = pLockedVolume->pBits;
- LockedSize = 0;
+ MappedSize = 0;
HRESULT hr;
Depth = Desc.Depth;
}
- LockedSize = _getLockSize(Desc.Format, Width, Height, pLockedVolume->RowPitch, Depth, pLockedVolume->SlicePitch);
+ MappedSize = _getLockSize(Desc.Format, Width, Height, pLockedVolume->RowPitch, Depth, pLockedVolume->SlicePitch);
}
return (x + (y - 1)) & ~(y - 1);
}
-static inline size_t
-_gl_image_size(GLenum format, GLenum type, GLsizei width, GLsizei height, GLsizei depth, GLboolean has_unpack_subimage) {
+static inline void
+_gl_format_size(GLenum format, GLenum type,
+ unsigned & bits_per_element, unsigned & bits_per_pixel)
+{
unsigned num_channels = _gl_format_channels(format);
- unsigned bits_per_element;
- unsigned bits_per_pixel;
switch (type) {
case GL_BITMAP:
bits_per_pixel = bits_per_element = 1;
bits_per_pixel = bits_per_element = 0;
break;
}
+}
+
+static inline size_t
+_glClearBufferData_size(GLenum format, GLenum type) {
+ unsigned bits_per_element;
+ unsigned bits_per_pixel;
+ _gl_format_size(format, type, bits_per_element, bits_per_pixel);
+ return (bits_per_pixel + 7)/8;
+}
+
+static inline size_t
+_gl_image_size(GLenum format, GLenum type, GLsizei width, GLsizei height, GLsizei depth, GLboolean has_unpack_subimage) {
+
+ unsigned bits_per_element;
+ unsigned bits_per_pixel;
+ _gl_format_size(format, type, bits_per_element, bits_per_pixel);
GLint alignment = 4;
GLint row_length = 0;
endif ()
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
${CMAKE_SOURCE_DIR}/specs/stdapi.py
)
- include_directories (SYSTEM ${DirectX_D3DX9_INCLUDE_DIR})
- add_executable (d3dretrace
- d3dretrace_main.cpp
- d3dretrace_d3d9.cpp
- d3dretrace_ws.cpp
- d3d9state.cpp
- d3d9state_images.cpp
- )
- target_link_libraries (d3dretrace
- retrace_common
- )
+ if (DirectX_D3D10_INCLUDE_DIR)
+ include_directories (SYSTEM ${DirectX_D3D10_INCLUDE_DIR})
+ set (MODULES d3d10)
+ if (DirectX_D3D10_1_INCLUDE_DIR)
+ include_directories (SYSTEM ${DirectX_D3D10_1_INCLUDE_DIR})
+ set (MODULES ${MODULES} d3d10_1)
+ endif ()
+ endif ()
- install (TARGETS d3dretrace RUNTIME DESTINATION bin)
-endif ()
+ if (DirectX_D3D11_INCLUDE_DIR)
+ include_directories (SYSTEM ${DirectX_D3D11_INCLUDE_DIR})
+ set (MODULES ${MODULES} d3d11)
+ if (DirectX_D3D11_1_INCLUDE_DIR)
+ include_directories (SYSTEM ${DirectX_D3D11_1_INCLUDE_DIR})
+ set (MODULES ${MODULES} d3d11_1)
+ endif ()
+ endif ()
-if (WIN32 AND DirectX_D3D10_INCLUDE_DIR)
add_custom_command (
OUTPUT d3dretrace_d3d10.cpp
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d10retrace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d10.cpp
+ COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3dcommonretrace.py ${MODULES} > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d10.cpp
DEPENDS
- d3d10retrace.py
d3dcommonretrace.py
dllretrace.py
retrace.py
${CMAKE_SOURCE_DIR}/dispatch/dispatch.py
+ ${CMAKE_SOURCE_DIR}/specs/d3d11_1.py
+ ${CMAKE_SOURCE_DIR}/specs/d3d11.py
+ ${CMAKE_SOURCE_DIR}/specs/d3d11sdklayers.py
+ ${CMAKE_SOURCE_DIR}/specs/d3d10_1.py
${CMAKE_SOURCE_DIR}/specs/d3d10.py
${CMAKE_SOURCE_DIR}/specs/d3d10misc.py
${CMAKE_SOURCE_DIR}/specs/d3d10sdklayers.py
${CMAKE_SOURCE_DIR}/specs/stdapi.py
)
- include_directories (SYSTEM ${DirectX_D3D10_INCLUDE_DIR})
- add_executable (d3d10retrace
+ add_executable (d3dretrace
d3dretrace_main.cpp
+ d3dretrace_d3d9.cpp
d3dretrace_d3d10.cpp
d3dretrace_ws.cpp
d3d9state.cpp
d3d9state_images.cpp
)
- target_link_libraries (d3d10retrace
- retrace_common
- )
-
- install (TARGETS d3d10retrace RUNTIME DESTINATION bin)
-endif ()
-
-if (WIN32 AND DirectX_D3D10_1_INCLUDE_DIR)
- add_custom_command (
- OUTPUT d3dretrace_d3d10_1.cpp
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d10_1retrace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d10_1.cpp
- DEPENDS
- d3d10retrace.py
- d3dcommonretrace.py
- dllretrace.py
- retrace.py
- ${CMAKE_SOURCE_DIR}/dispatch/dispatch.py
- ${CMAKE_SOURCE_DIR}/specs/d3d10_1.py
- ${CMAKE_SOURCE_DIR}/specs/d3d10.py
- ${CMAKE_SOURCE_DIR}/specs/d3d10sdklayers.py
- ${CMAKE_SOURCE_DIR}/specs/d3dcommon.py
- ${CMAKE_SOURCE_DIR}/specs/dxgi.py
- ${CMAKE_SOURCE_DIR}/specs/dxgitype.py
- ${CMAKE_SOURCE_DIR}/specs/dxgiformat.py
- ${CMAKE_SOURCE_DIR}/specs/winapi.py
- ${CMAKE_SOURCE_DIR}/specs/stdapi.py
- )
-
- include_directories (SYSTEM ${DirectX_D3D10_1_INCLUDE_DIR})
- add_executable (d3d10_1retrace
- d3dretrace_main.cpp
- d3dretrace_d3d10_1.cpp
- d3dretrace_ws.cpp
- d3d9state.cpp
- d3d9state_images.cpp
- )
- target_link_libraries (d3d10_1retrace
- retrace_common
- )
-
- install (TARGETS d3d10_1retrace RUNTIME DESTINATION bin)
-endif ()
-
-if (WIN32 AND DirectX_D3D11_INCLUDE_DIR)
- add_custom_command (
- OUTPUT d3dretrace_d3d11.cpp
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/d3d11retrace.py > ${CMAKE_CURRENT_BINARY_DIR}/d3dretrace_d3d11.cpp
- DEPENDS
- d3d11retrace.py
- d3dcommonretrace.py
- dllretrace.py
- retrace.py
- ${CMAKE_SOURCE_DIR}/dispatch/dispatch.py
- ${CMAKE_SOURCE_DIR}/specs/d3d11_1.py
- ${CMAKE_SOURCE_DIR}/specs/d3d11.py
- ${CMAKE_SOURCE_DIR}/specs/d3d11sdklayers.py
- ${CMAKE_SOURCE_DIR}/specs/d3dcommon.py
- ${CMAKE_SOURCE_DIR}/specs/dxgi.py
- ${CMAKE_SOURCE_DIR}/specs/dxgitype.py
- ${CMAKE_SOURCE_DIR}/specs/dxgiformat.py
- ${CMAKE_SOURCE_DIR}/specs/winapi.py
- ${CMAKE_SOURCE_DIR}/specs/stdapi.py
- )
-
- include_directories (SYSTEM ${DirectX_D3D11_INCLUDE_DIR})
- add_executable (d3d11retrace
- d3dretrace_main.cpp
- d3dretrace_d3d11.cpp
- d3dretrace_ws.cpp
- d3d9state.cpp
- d3d9state_images.cpp
- )
- target_link_libraries (d3d11retrace
+ target_link_libraries (d3dretrace
retrace_common
)
- install (TARGETS d3d11retrace RUNTIME DESTINATION bin)
+ install (TARGETS d3dretrace RUNTIME DESTINATION bin)
endif ()
+++ /dev/null
-##########################################################################
-#
-# Copyright 2011 Jose Fonseca
-# 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.
-#
-##########################################################################/
-
-
-"""D3D10 retracer generator."""
-
-
-from d3dcommonretrace import D3DRetracer
-import specs.stdapi as stdapi
-from specs.d3d10_1 import d3d10_1
-
-
-if __name__ == '__main__':
- print r'''
-#include <string.h>
-
-#include <iostream>
-
-#include "d3d10_1imports.hpp"
-#include "d3d10size.hpp"
-#include "d3dretrace.hpp"
-
-'''
-
- retracer = D3DRetracer()
- retracer.retraceApi(d3d10_1)
+++ /dev/null
-##########################################################################
-#
-# Copyright 2011 Jose Fonseca
-# 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.
-#
-##########################################################################/
-
-
-"""D3D10 retracer generator."""
-
-
-from d3dcommonretrace import D3DRetracer
-import specs.stdapi as stdapi
-from specs.d3d10 import d3d10
-
-
-if __name__ == '__main__':
- print r'''
-#include <string.h>
-
-#include <iostream>
-
-#include "d3d10imports.hpp"
-#include "d3d10size.hpp"
-#include "d3dretrace.hpp"
-
-'''
-
- retracer = D3DRetracer()
- retracer.retraceApi(d3d10)
+++ /dev/null
-##########################################################################
-#
-# Copyright 2011 Jose Fonseca
-# 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.
-#
-##########################################################################/
-
-
-"""D3D10 retracer generator."""
-
-
-from d3dcommonretrace import D3DRetracer
-import specs.stdapi as stdapi
-from specs.d3d11 import d3d11
-
-
-if __name__ == '__main__':
- print r'''
-#include <string.h>
-
-#include <iostream>
-
-#include "d3d11imports.hpp"
-#include "d3d11size.hpp"
-#include "d3dretrace.hpp"
-
-'''
-
- retracer = D3DRetracer()
- retracer.retraceApi(d3d11)
from dllretrace import DllRetracer as Retracer
-import specs.stdapi as stdapi
+from specs.stdapi import API
from specs.d3d9 import *
class D3DRetracer(Retracer):
def retraceApi(self, api):
+ print '''
+static IDirect3DDevice9 *
+pLastDirect3DDevice9 = NULL;
+
+image::Image *
+retrace::getSnapshot(void) {
+ if (!pLastDirect3DDevice9) {
+ return NULL;
+ }
+ return d3dstate::getRenderTargetImage(pLastDirect3DDevice9);
+}
+
+
+bool
+retrace::dumpState(std::ostream &os)
+{
+ if (!pLastDirect3DDevice9) {
+ return false;
+ }
+ d3dstate::dumpDevice(os, pLastDirect3DDevice9);
+ return true;
+}
+'''
+
print '// Swizzling mapping for lock addresses'
- print 'static std::map<void *, void *> _locks;'
+ print 'static std::map<void *, void *> _maps;'
print
- self.table_name = 'd3dretrace::d3d_callbacks'
+ self.table_name = 'd3dretrace::d3d9_callbacks'
Retracer.retraceApi(self, api)
def invokeInterfaceMethod(self, interface, method):
# keep track of the last used device for state dumping
if interface.name in ('IDirect3DDevice9', 'IDirect3DDevice9Ex'):
- print r' d3dretrace::pLastDirect3DDevice9 = _this;'
+ print r' pLastDirect3DDevice9 = _this;'
# create windows as neccessary
if method.name in ('CreateDevice', 'CreateDeviceEx', 'CreateAdditionalSwapChain'):
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 ' _locks[_this] = _pbData;'
+ print ' size_t _MappedSize = 0;'
+ print ' _getMapInfo(_this, %s, _pbData, _MappedSize);' % ', '.join(method.argNames()[:-1])
+ print ' _maps[_this] = _pbData;'
if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'):
print ' VOID *_pbData = 0;'
- print ' _pbData = _locks[_this];'
+ print ' _pbData = _maps[_this];'
print ' if (_pbData) {'
print ' retrace::delRegionByPointer(_pbData);'
print ' }'
#include "d3d9imports.hpp"
#include "d3d9size.hpp"
#include "d3dretrace.hpp"
+#include "d3d9state.hpp"
'''
+ api = API()
+ api.addModule(d3d9)
retracer = D3DRetracer()
- retracer.retraceApi(d3d9)
+ retracer.retraceApi(api)
"""D3D retracer generator."""
+import sys
from dllretrace import DllRetracer as Retracer
-import specs.stdapi as stdapi
+from specs.stdapi import API
+from specs.dxgi import dxgi
+from specs.d3d10 import d3d10
+from specs.d3d10_1 import d3d10_1
+from specs.d3d11 import d3d11
class D3DRetracer(Retracer):
print 'static std::map<void *, void *> _maps;'
print
- self.table_name = 'd3dretrace::d3d_callbacks'
+ self.table_name = 'd3dretrace::d3d10_callbacks'
Retracer.retraceApi(self, api)
if function.name in ('D3D10CreateDeviceAndSwapChain', 'D3D10CreateDeviceAndSwapChain1', 'D3D11CreateDeviceAndSwapChain'):
print r' pSwapChainDesc->OutputWindow = d3dretrace::createWindow(512, 512);'
+ if 'Software' in function.argNames():
+ print r' if (Software) {'
+ print r' retrace::warning(call) << "software device\n";'
+ print r' Software = LoadLibraryA("d3d10warp");'
+ print r' }'
+
Retracer.invokeFunction(self, function)
+
def invokeInterfaceMethod(self, interface, method):
# keep track of the last used device for state dumping
#if interface.name in ('IDirect3DDevice9', 'IDirect3DDevice9Ex'):
print ' if (_pbData) {'
print ' retrace::delRegionByPointer(_pbData);'
print ' }'
+
+
+def main():
+ print r'''#include <string.h>'''
+ print
+ print r'#include <iostream>'
+ print
+ print r'#include "d3dretrace.hpp"'
+ print
+
+ moduleNames = sys.argv[1:]
+
+ api = API()
+ if moduleNames:
+ api.addModule(dxgi)
+ if 'd3d10' in moduleNames:
+ if 'd3d10_1' in moduleNames:
+ print r'#include "d3d10_1imports.hpp"'
+ # D3D10CreateBlob is duplicated in d3d10 and d3d10_1
+ d3d10_1.functions = [function for function in d3d10_1.functions if function.name != 'D3D10CreateBlob']
+ api.addModule(d3d10_1)
+ else:
+ print r'#include "d3d10imports.hpp"'
+ print r'#include "d3d10size.hpp"'
+ api.addModule(d3d10)
+ if 'd3d11' in moduleNames:
+ print r'#include "d3d11imports.hpp"'
+ if 'd3d11_1' in moduleNames:
+ print '#include <d3d11_1.h>'
+ import specs.d3d11_1
+ print r'#include "d3d11size.hpp"'
+ api.addModule(d3d11)
+
+ retracer = D3DRetracer()
+ retracer.retraceApi(api)
+
+
+if __name__ == '__main__':
+ main()
#include "retrace.hpp"
-struct IDirect3DDevice9;
-
-
namespace d3dretrace {
-extern IDirect3DDevice9 *pLastDirect3DDevice9;
-
-
-extern const retrace::Entry d3d_callbacks[];
+extern const retrace::Entry d3d9_callbacks[];
+extern const retrace::Entry d3d10_callbacks[];
HWND
#include "d3dretrace.hpp"
-IDirect3DDevice9 *
-d3dretrace::pLastDirect3DDevice9 = NULL;
-
-
void
retrace::setUp(void) {
}
void
retrace::addCallbacks(retrace::Retracer &retracer)
{
- retracer.addCallbacks(d3dretrace::d3d_callbacks);
-}
-
-
-image::Image *
-retrace::getSnapshot(void) {
- if (!d3dretrace::pLastDirect3DDevice9) {
- return NULL;
- }
-
- return d3dstate::getRenderTargetImage(d3dretrace::pLastDirect3DDevice9);
-}
-
-
-bool
-retrace::dumpState(std::ostream &os)
-{
- if (!d3dretrace::pLastDirect3DDevice9) {
- return false;
- }
-
- d3dstate::dumpDevice(os, d3dretrace::pLastDirect3DDevice9);
-
- return true;
+ retracer.addCallbacks(d3dretrace::d3d9_callbacks);
+ retracer.addCallbacks(d3dretrace::d3d10_callbacks);
}
from retrace import Retracer
from dispatch import Dispatcher
+from specs.stdapi import API
class DllDispatcher(Dispatcher):
- def dispatchApi(self, api):
- tag = api.name.upper()
+ def dispatchModule(self, module):
+ tag = module.name.upper()
print r'const char *g_sz%sDllName = NULL;' % (tag,)
print r'HMODULE g_h%sModule = NULL;' % (tag,)
print r''
print r'static PROC'
- print r'_getPublicProcAddress(LPCSTR lpProcName) {'
+ print r'_get%sProcAddress(LPCSTR lpProcName) {' % tag
print r' if (!g_h%sModule) {' % tag
print r' if (g_sz%sDllName) {' % tag
print r' g_h%sModule = LoadLibraryA(g_sz%sDllName);' % (tag, tag)
print r' }'
print r' }'
print r' if (!g_h%sModule) {' % tag
- print r' g_h%sModule = LoadLibraryA("%s.dll");' % (tag, api.name)
+ print r' g_h%sModule = LoadLibraryA("%s.dll");' % (tag, module.name)
print r' }'
print r' if (!g_h%sModule) {' % tag
- print r' os::log("error: failed to load %s.dll\n");' % api.name
+ print r' os::log("error: failed to load %s.dll\n");' % module.name
print r' exit(1);'
print r' }'
print r' }'
print r'}'
print r''
- Dispatcher.dispatchApi(self, api)
+ Dispatcher.dispatchModule(self, module)
+
+ def getProcAddressName(self, module, function):
+ assert self.isFunctionPublic(module, function)
+ return '_get%sProcAddress' % (module.name.upper())
class DllRetracer(Retracer):
def retraceApi(self, api):
- dispatcher = DllDispatcher()
- dispatcher.dispatchApi(api)
+ for module in api.modules:
+ dispatcher = DllDispatcher()
+ dispatcher.dispatchModule(module)
Retracer.retraceApi(self, api)
-
static bool _pipelineHasBeenBound = false;
'''
- api = glapi.glapi
- api.addApi(glesapi.glesapi)
+ api = stdapi.API()
+ api.addModule(glapi.glapi)
+ api.addModule(glesapi.glesapi)
retracer = GlRetracer()
retracer.retraceApi(api)
pass
def visitObjPointer(self, pointer, lvalue, rvalue):
- print r' retrace::addObj(%s, %s);' % (rvalue, lvalue)
+ print r' retrace::addObj(call, %s, %s);' % (rvalue, lvalue)
def visitLinearPointer(self, pointer, lvalue, rvalue):
assert pointer.size is not None
handle_names.add(handle.name)
print
- functions = filter(self.filterFunction, api.functions)
+ functions = filter(self.filterFunction, api.getAllFunctions())
for function in functions:
if function.sideeffects and not function.internal:
self.retraceFunction(function)
static std::map<unsigned long long, void *> _obj_map;
void
-addObj(trace::Value &value, void *obj) {
+addObj(trace::Call &call, trace::Value &value, void *obj) {
unsigned long long address = value.toUIntPtr();
+
+ if (!address) {
+ assert(!obj);
+ return;
+ }
+
+ if (!obj) {
+ warning(call) << "got null for object 0x" << std::hex << address << std::dec << "\n";
+ }
+
_obj_map[address] = obj;
if (retrace::verbosity >= 2) {
if (address) {
obj = _obj_map[address];
if (!obj) {
- warning(call) << "unknown object 0x" << std::hex << address << std::dec << " call\n";
+ warning(call) << "unknown object 0x" << std::hex << address << std::dec << "\n";
}
} else {
obj = NULL;
void
-addObj(trace::Value &value, void *obj);
+addObj(trace::Call &call, trace::Value &value, void *obj);
void
delObj(trace::Value &value);
CGLContextObj = Opaque("CGLContextObj")
-cglapi = API("CGL")
+cglapi = Module("CGL")
cglapi.addFunctions([
# CGLCurrent.h, libGL.dylib
StdMethod(HRESULT, "CreateDCRenderTarget", [(Pointer(Const(D2D1_RENDER_TARGET_PROPERTIES)), "renderTargetProperties"), Out(Pointer(ObjPointer(ID2D1DCRenderTarget)), "dcRenderTarget")]),
]
-d2d1 = API("d2d1")
-d2d1.addInterface(ID2D1Factory)
+d2d1 = Module("d2d1")
+d2d1.addInterfaces([
+ ID2D1Factory
+])
d2d1.addFunctions([
- StdFunction(HRESULT, "D2D1CreateFactory", [(D2D1_FACTORY_TYPE, "factoryType"), (REFIID, "riid"), (Pointer(Const(D2D1_FACTORY_OPTIONS)), "pFactoryOptions"), Out(Pointer(OpaquePointer(Void)), "ppIFactory")]),
+ StdFunction(HRESULT, "D2D1CreateFactory", [(D2D1_FACTORY_TYPE, "factoryType"), (REFIID, "riid"), (Pointer(Const(D2D1_FACTORY_OPTIONS)), "pFactoryOptions"), Out(Pointer(ObjPointer(Void)), "ppIFactory")]),
StdFunction(Void, "D2D1MakeRotateMatrix", [(FLOAT, "angle"), (D2D1_POINT_2F, "center"), Out(Pointer(D2D1_MATRIX_3X2_F), "matrix")]),
StdFunction(Void, "D2D1MakeSkewMatrix", [(FLOAT, "angleX"), (FLOAT, "angleY"), (D2D1_POINT_2F, "center"), Out(Pointer(D2D1_MATRIX_3X2_F), "matrix")]),
StdFunction(BOOL, "D2D1IsMatrixInvertible", [(Pointer(Const(D2D1_MATRIX_3X2_F)), "matrix")]),
- StdFunction(BOOL, "D2D1InvertMatrix", [Out(Pointer(D2D1_MATRIX_3X2_F), "matrix")]),
+ StdFunction(BOOL, "D2D1InvertMatrix", [InOut(Pointer(D2D1_MATRIX_3X2_F), "matrix")]),
])
]
-d3d10 = API("d3d10")
+d3d10 = Module("d3d10")
from d3d10sdklayers import *
StdMethod(D3D10_FEATURE_LEVEL1, "GetFeatureLevel", [], sideeffects=False),
]
-d3d10_1 = API("d3d10_1")
+d3d10_1 = Module("d3d10_1")
d3d10_1.addFunctions([
StdFunction(HRESULT, "D3D10CreateDevice1", [(ObjPointer(IDXGIAdapter), "pAdapter"), (D3D10_DRIVER_TYPE, "DriverType"), (HMODULE, "Software"), (D3D10_CREATE_DEVICE_FLAG, "Flags"), (D3D10_FEATURE_LEVEL1, "HardwareLevel"), (UINT, "SDKVersion"), Out(Pointer(ObjPointer(ID3D10Device1)), "ppDevice")]),
StdFunction(HRESULT, "D3D10CreateDeviceAndSwapChain1", [(ObjPointer(IDXGIAdapter), "pAdapter"), (D3D10_DRIVER_TYPE, "DriverType"), (HMODULE, "Software"), (D3D10_CREATE_DEVICE_FLAG, "Flags"), (D3D10_FEATURE_LEVEL1, "HardwareLevel"), (UINT, "SDKVersion"), (Pointer(DXGI_SWAP_CHAIN_DESC), "pSwapChainDesc"), Out(Pointer(ObjPointer(IDXGISwapChain)), "ppSwapChain"), Out(Pointer(ObjPointer(ID3D10Device1)), "ppDevice")]),
StdMethod(UINT, "GetExceptionMode", [], sideeffects=False),
]
-d3d11 = API("d3d11")
+d3d11 = Module("d3d11")
d3d11.addFunctions([
StdFunction(HRESULT, "D3D11CreateDevice", [(ObjPointer(IDXGIAdapter), "pAdapter"), (D3D_DRIVER_TYPE, "DriverType"), (HMODULE, "Software"), (D3D11_CREATE_DEVICE_FLAG, "Flags"), (Array(Const(D3D_FEATURE_LEVEL), "FeatureLevels"), "pFeatureLevels"), (UINT, "FeatureLevels"), (UINT, "SDKVersion"), Out(Pointer(ObjPointer(ID3D11Device)), "ppDevice"), Out(Pointer(D3D_FEATURE_LEVEL), "pFeatureLevel"), Out(Pointer(ObjPointer(ID3D11DeviceContext)), "ppImmediateContext")]),
StdMethod(HRESULT, "UnlockBox", []),
]
-d3d8 = API("d3d8")
+d3d8 = Module("d3d8")
d3d8.addFunctions([
StdFunction(PDIRECT3D8, "Direct3DCreate8", [(UINT, "SDKVersion")]),
])
]
IDirect3DVertexBuffer9.methods += [
- StdMethod(HRESULT, "Lock", [(UINT, "OffsetToLock"), (UINT, "SizeToLock"), Out(Pointer(LinearPointer(Void, "_LockedSize")), "ppbData"), (D3DLOCK, "Flags")]),
+ StdMethod(HRESULT, "Lock", [(UINT, "OffsetToLock"), (UINT, "SizeToLock"), Out(Pointer(LinearPointer(Void, "_MappedSize")), "ppbData"), (D3DLOCK, "Flags")]),
StdMethod(HRESULT, "Unlock", []),
StdMethod(HRESULT, "GetDesc", [Out(Pointer(D3DVERTEXBUFFER_DESC), "pDesc")], sideeffects=False),
]
IDirect3DIndexBuffer9.methods += [
- StdMethod(HRESULT, "Lock", [(UINT, "OffsetToLock"), (UINT, "SizeToLock"), Out(Pointer(LinearPointer(Void, "_LockedSize")), "ppbData"), (D3DLOCK, "Flags")]),
+ StdMethod(HRESULT, "Lock", [(UINT, "OffsetToLock"), (UINT, "SizeToLock"), Out(Pointer(LinearPointer(Void, "_MappedSize")), "ppbData"), (D3DLOCK, "Flags")]),
StdMethod(HRESULT, "Unlock", []),
StdMethod(HRESULT, "GetDesc", [Out(Pointer(D3DINDEXBUFFER_DESC), "pDesc")], sideeffects=False),
]
StdMethod(HRESULT, "GetDisplayModeEx", [Out(Pointer(D3DDISPLAYMODEEX), "pMode"), Out(Pointer(D3DDISPLAYROTATION), "pRotation")], sideeffects=False),
]
-d3d9 = API("d3d9")
+d3d9 = Module("d3d9")
d3d9.addFunctions([
StdFunction(PDIRECT3D9, "Direct3DCreate9", [(UINT, "SDKVersion")], fail='NULL'),
StdFunction(HRESULT, "Direct3DCreate9Ex", [(UINT, "SDKVersion"), Out(Pointer(PDIRECT3D9EX), "ppD3D")], fail='D3DERR_NOTAVAILABLE'),
D3DLOCKED_RECT = Struct("D3DLOCKED_RECT", [
(INT, "Pitch"),
- (LinearPointer(Void, "_LockedSize"), "pBits"),
+ (LinearPointer(Void, "_MappedSize"), "pBits"),
])
D3DBOX = Struct("D3DBOX", [
D3DLOCKED_BOX = Struct("D3DLOCKED_BOX", [
(INT, "RowPitch"),
(INT, "SlicePitch"),
- (LinearPointer(Void, "_LockedSize"), "pBits"),
+ (LinearPointer(Void, "_MappedSize"), "pBits"),
])
D3DRANGE = Struct("D3DRANGE", [
"DDCREATE_EMULATIONONLY",
])
-ddraw = API("ddraw")
+ddraw = Module("ddraw")
ddraw.addFunctions([
StdFunction(HRESULT, "DirectDrawEnumerateW", [(LPDDENUMCALLBACKW, "lpCallback"), (LPVOID, "lpContext")]),
StdFunction(HRESULT, "DirectDrawEnumerateA", [(LPDDENUMCALLBACKA, "lpCallback"), (LPVOID, "lpContext")]),
StdFunction(HRESULT, "DirectDrawCreate", [(Pointer(GUID), "lpGUID"), Out(Pointer(LPDIRECTDRAW), "lplpDD"), (LPUNKNOWN, "pUnkOuter")]),
StdFunction(HRESULT, "DirectDrawCreateEx", [(Pointer(GUID), "lpGuid"), Out(Pointer(ObjPointer(Void)), "lplpDD"), (REFIID, "iid"), (LPUNKNOWN, "pUnkOuter")]),
StdFunction(HRESULT, "DirectDrawCreateClipper", [(DWORD, "dwFlags"), Out(Pointer(LPDIRECTDRAWCLIPPER), "lplpDDClipper"), (LPUNKNOWN, "pUnkOuter")]),
- StdFunction(Void, "AcquireDDThreadLock", []),
- StdFunction(Void, "ReleaseDDThreadLock", []),
+ StdFunction(Void, "AcquireDDThreadLock", [], internal=True),
+ StdFunction(Void, "ReleaseDDThreadLock", [], internal=True),
StdFunction(DWORD, "D3DParseUnknownCommand", [(LPVOID, "lpCmd"), Out(Pointer(LPVOID), "lpRetCmd")]),
StdFunction(HRESULT, "DllCanUnloadNow", []),
StdFunction(HRESULT, "DllGetClassObject", [(REFCLSID, "rclsid"), (REFIID, "riid"), Out(Pointer(ObjPointer(Void)), "ppv")]),
StdMethod(HRESULT, "SetReadingDirection", [(DWRITE_READING_DIRECTION, "readingDirection")]),
StdMethod(HRESULT, "SetFlowDirection", [(DWRITE_FLOW_DIRECTION, "flowDirection")]),
StdMethod(HRESULT, "SetIncrementalTabStop", [(FLOAT, "incrementalTabStop")]),
- StdMethod(HRESULT, "SetTrimming", [(Pointer(Const(DWRITE_TRIMMING)), "trimmingOptions"), (ObjPointer(IDWriteInlineObject), "trimmingSign")]),
+ StdMethod(HRESULT, "SetTrimming", [(Pointer(Const(DWRITE_TRIMMING)), "trimmingOptions"), (OpaquePointer(IDWriteInlineObject), "trimmingSign")]),
StdMethod(HRESULT, "SetLineSpacing", [(DWRITE_LINE_SPACING_METHOD, "lineSpacingMethod"), (FLOAT, "lineSpacing"), (FLOAT, "baseline")]),
StdMethod(DWRITE_TEXT_ALIGNMENT, "GetTextAlignment", []),
StdMethod(DWRITE_PARAGRAPH_ALIGNMENT, "GetParagraphAlignment", []),
StdMethod(DWRITE_READING_DIRECTION, "GetReadingDirection", []),
StdMethod(DWRITE_FLOW_DIRECTION, "GetFlowDirection", []),
StdMethod(FLOAT, "GetIncrementalTabStop", []),
- StdMethod(HRESULT, "GetTrimming", [Out(Pointer(DWRITE_TRIMMING), "trimmingOptions"), Out(Pointer(ObjPointer(IDWriteInlineObject)), "trimmingSign")]),
+ StdMethod(HRESULT, "GetTrimming", [Out(Pointer(DWRITE_TRIMMING), "trimmingOptions"), Out(Pointer(OpaquePointer(IDWriteInlineObject)), "trimmingSign")]),
StdMethod(HRESULT, "GetLineSpacing", [Out(Pointer(DWRITE_LINE_SPACING_METHOD), "lineSpacingMethod"), Out(Pointer(FLOAT), "lineSpacing"), Out(Pointer(FLOAT), "baseline")]),
StdMethod(HRESULT, "GetFontCollection", [Out(Pointer(ObjPointer(IDWriteFontCollection)), "fontCollection")]),
StdMethod(UINT32, "GetFontFamilyNameLength", []),
])
IDWriteInlineObject.methods += [
- StdMethod(HRESULT, "Draw", [(OpaquePointer(Void), "clientDrawingContext"), (ObjPointer(IDWriteTextRenderer), "renderer"), (FLOAT, "originX"), (FLOAT, "originY"), (BOOL, "isSideways"), (BOOL, "isRightToLeft"), (ObjPointer(IUnknown), "clientDrawingEffect")]),
+ StdMethod(HRESULT, "Draw", [(OpaquePointer(Void), "clientDrawingContext"), (OpaquePointer(IDWriteTextRenderer), "renderer"), (FLOAT, "originX"), (FLOAT, "originY"), (BOOL, "isSideways"), (BOOL, "isRightToLeft"), (ObjPointer(IUnknown), "clientDrawingEffect")]),
StdMethod(HRESULT, "GetMetrics", [Out(Pointer(DWRITE_INLINE_OBJECT_METRICS), "metrics")]),
StdMethod(HRESULT, "GetOverhangMetrics", [Out(Pointer(DWRITE_OVERHANG_METRICS), "overhangs")]),
StdMethod(HRESULT, "GetBreakConditions", [Out(Pointer(DWRITE_BREAK_CONDITION), "breakConditionBefore"), Out(Pointer(DWRITE_BREAK_CONDITION), "breakConditionAfter")]),
StdMethod(HRESULT, "GetTypography", [(UINT32, "currentPosition"), Out(Pointer(ObjPointer(IDWriteTypography)), "typography"), Out(Pointer(DWRITE_TEXT_RANGE), "textRange")]),
StdMethod(HRESULT, "GetLocaleNameLength", [(UINT32, "currentPosition"), Out(Pointer(UINT32), "nameLength"), Out(Pointer(DWRITE_TEXT_RANGE), "textRange")]),
StdMethod(HRESULT, "GetLocaleName", [(UINT32, "currentPosition"), Out(Pointer(WCHAR), "localeName"), (UINT32, "nameSize"), Out(Pointer(DWRITE_TEXT_RANGE), "textRange")]),
- StdMethod(HRESULT, "Draw", [(OpaquePointer(Void), "clientDrawingContext"), (ObjPointer(IDWriteTextRenderer), "renderer"), (FLOAT, "originX"), (FLOAT, "originY")]),
+ StdMethod(HRESULT, "Draw", [(OpaquePointer(Void), "clientDrawingContext"), (OpaquePointer(IDWriteTextRenderer), "renderer"), (FLOAT, "originX"), (FLOAT, "originY")]),
StdMethod(HRESULT, "GetLineMetrics", [Out(Pointer(DWRITE_LINE_METRICS), "lineMetrics"), (UINT32, "maxLineCount"), Out(Pointer(UINT32), "actualLineCount")]),
StdMethod(HRESULT, "GetMetrics", [Out(Pointer(DWRITE_TEXT_METRICS), "textMetrics")]),
StdMethod(HRESULT, "GetOverhangMetrics", [Out(Pointer(DWRITE_OVERHANG_METRICS), "overhangs")]),
StdMethod(HRESULT, "CreateGlyphRunAnalysis", [(Pointer(Const(DWRITE_GLYPH_RUN)), "glyphRun"), (FLOAT, "pixelsPerDip"), (Pointer(Const(DWRITE_MATRIX)), "transform"), (DWRITE_RENDERING_MODE, "renderingMode"), (DWRITE_MEASURING_MODE, "measuringMode"), (FLOAT, "baselineOriginX"), (FLOAT, "baselineOriginY"), Out(Pointer(ObjPointer(IDWriteGlyphRunAnalysis)), "glyphRunAnalysis")]),
]
-dwrite = API("dwrite")
-dwrite.addInterface(IDWriteFactory)
+dwrite = Module("dwrite")
+dwrite.addInterfaces([
+ IDWriteFactory
+])
dwrite.addFunctions([
StdFunction(HRESULT, "DWriteCreateFactory", [(DWRITE_FACTORY_TYPE, "factoryType"), (REFIID, "iid"), Out(Pointer(ObjPointer(IUnknown)), "factory")]),
])
StdMethod(HRESULT, "GetMaximumFrameLatency", [Out(Pointer(UINT), "pMaxLatency")], sideeffects=False),
]
-dxgi = API('dxgi')
+dxgi = Module('dxgi')
dxgi.addFunctions([
StdFunction(HRESULT, "CreateDXGIFactory", [(REFIID, "riid"), Out(Pointer(ObjPointer(Void)), "ppFactory")]),
StdFunction(HRESULT, "CreateDXGIFactory1", [(REFIID, "riid"), Out(Pointer(ObjPointer(Void)), "ppFactory")]),
# EGL_NV_system_time
EGLuint64NV = Alias("EGLuint64NV", UInt64)
-eglapi = API("EGL")
+eglapi = Module("EGL")
EGLAttribList = Array(Const(EGLattrib), "_AttribPairList_size(attrib_list, EGL_NONE)")
return Function(*args, **kwargs)
-glapi = API('GL')
+glapi = Module('GL')
glapi.addFunctions([
GlFunction(Void, "glGetObjectPtrLabel", [(OpaquePointer(Const(Void)), "ptr"), (GLsizei, "bufSize"), Out(Pointer(GLsizei), "length"), Out(Array(GLchar, "bufSize"), "label")], sideeffects=False),
# GL_ARB_clear_buffer_object
- GlFunction(Void, "glClearBufferData", [(GLenum, "target"), (GLenum, "internalformat"), (GLenum, "format"), (GLenum, "type"), (OpaqueArray(Const(Void), "_glClearBufferData_size(format, type)"), "data")]),
- GlFunction(Void, "glClearBufferSubData", [(GLenum, "target"), (GLenum, "internalformat"), (GLintptr, "offset"), (GLsizeiptr, "size"), (GLenum, "format"), (GLenum, "type"), (OpaqueArray(Const(Void), "_glClearBufferSubData_size(format, type)"), "data")]),
- GlFunction(Void, "glClearNamedBufferDataEXT", [(GLbuffer, "buffer"), (GLenum, "internalformat"), (GLenum, "format"), (GLenum, "type"), (OpaqueArray(Const(Void), "_glClearNamedBufferDataEXT_size(format, type)"), "data")]),
- GlFunction(Void, "glClearNamedBufferSubDataEXT", [(GLbuffer, "buffer"), (GLenum, "internalformat"), (GLenum, "format"), (GLenum, "type"), (GLsizeiptr, "offset"), (GLsizeiptr, "size"), (OpaqueArray(Const(Void), "_glClearNamedBufferSubDataEXT_size(format, type)"), "data")]),
+ GlFunction(Void, "glClearBufferData", [(GLenum, "target"), (GLenum, "internalformat"), (GLenum, "format"), (GLenum, "type"), (Blob(Const(Void), "_glClearBufferData_size(format, type)"), "data")]),
+ GlFunction(Void, "glClearBufferSubData", [(GLenum, "target"), (GLenum, "internalformat"), (GLintptr, "offset"), (GLsizeiptr, "size"), (GLenum, "format"), (GLenum, "type"), (Blob(Const(Void), "_glClearBufferData_size(format, type)"), "data")]),
+ GlFunction(Void, "glClearNamedBufferDataEXT", [(GLbuffer, "buffer"), (GLenum, "internalformat"), (GLenum, "format"), (GLenum, "type"), (Blob(Const(Void), "_glClearBufferData_size(format, type)"), "data")]),
+ GlFunction(Void, "glClearNamedBufferSubDataEXT", [(GLbuffer, "buffer"), (GLenum, "internalformat"), (GLenum, "format"), (GLenum, "type"), (GLsizeiptr, "offset"), (GLsizeiptr, "size"), (Blob(Const(Void), "_glClearBufferData_size(format, type)"), "data")]),
# GL_ARB_compute_shader
GlFunction(Void, "glDispatchCompute", [(GLuint, "num_groups_x"), (GLuint, "num_groups_y"), (GLuint, "num_groups_z")]),
return Function(*args, **kwargs)
-glesapi = API('GLES')
+glesapi = Module('GLES')
# OpenGL ES specific functions
"GLX_PBUFFER_CLOBBER_MASK",
])
-glxapi = API("GLX")
+glxapi = Module("GLX")
PROC = Opaque("__GLXextFuncPtr")
-class API:
- '''API abstraction.
-
- Essentially, a collection of types, functions, and interfaces.
- '''
+class Module:
+ '''A collection of functions.'''
def __init__(self, name = None):
self.name = name
self.functions = []
self.interfaces = []
+ def addFunctions(self, functions):
+ self.functions.extend(functions)
+
+ def addInterfaces(self, interfaces):
+ self.interfaces.extend(interfaces)
+
+ def mergeModule(self, module):
+ self.headers.extend(module.headers)
+ self.functions.extend(module.functions)
+ self.interfaces.extend(module.interfaces)
+
+ def getFunctionByName(self, name):
+ for function in self.functions:
+ if function.name == name:
+ return function
+ return None
+
+
+class API:
+ '''API abstraction.
+
+ Essentially, a collection of types, functions, and interfaces.
+ '''
+
+ def __init__(self, modules = None):
+ self.modules = []
+ if modules is not None:
+ self.modules.extend(modules)
+
def getAllTypes(self):
collector = Collector()
- for function in self.functions:
- for arg in function.args:
- collector.visit(arg.type)
- collector.visit(function.type)
- for interface in self.interfaces:
- collector.visit(interface)
- for method in interface.iterMethods():
- for arg in method.args:
+ for module in self.modules:
+ for function in module.functions:
+ for arg in function.args:
collector.visit(arg.type)
- collector.visit(method.type)
+ collector.visit(function.type)
+ for interface in module.interfaces:
+ collector.visit(interface)
+ for method in interface.iterMethods():
+ for arg in method.args:
+ collector.visit(arg.type)
+ collector.visit(method.type)
return collector.types
+ def getAllFunctions(self):
+ functions = []
+ for module in self.modules:
+ functions.extend(module.functions)
+ return functions
+
def getAllInterfaces(self):
types = self.getAllTypes()
interfaces = [type for type in types if isinstance(type, Interface)]
- for interface in self.interfaces:
- if interface not in interfaces:
- interfaces.append(interface)
+ for module in self.modules:
+ for interface in module.interfaces:
+ if interface not in interfaces:
+ interfaces.append(interface)
return interfaces
- def addFunction(self, function):
- self.functions.append(function)
-
- def addFunctions(self, functions):
- for function in functions:
- self.addFunction(function)
-
- def addInterface(self, interface):
- self.interfaces.append(interface)
-
- def addInterfaces(self, interfaces):
- self.interfaces.extend(interfaces)
-
- def addApi(self, api):
- self.headers.extend(api.headers)
- self.addFunctions(api.functions)
- self.addInterfaces(api.interfaces)
+ def addModule(self, module):
+ self.modules.append(module)
def getFunctionByName(self, name):
- for function in self.functions:
- if function.name == name:
- return function
+ for module in self.modules:
+ for function in module.functions:
+ if function.name == name:
+ return function
return None
from wglenum import *
-wglapi = API("WGL")
+wglapi = Module("WGL")
HGLRC = Alias("HGLRC", HANDLE)
])
LPRGNDATA = Pointer(RGNDATA)
-HMODULE = DECLARE_HANDLE("HMODULE")
+HMODULE = IntPointer("HMODULE")
FILETIME = Struct("FILETIME", [
(DWORD, "dwLowDateTime"),
d3d9trace.cpp
ddrawtrace.cpp
dlltrace.cpp
-dwritetrace.cpp
egltrace.cpp
gltrace.cpp
glxtrace.cpp
COMPILE_FLAGS "${CMAKE_SHARED_LIBRARY_CXX_FLAGS}"
)
+set (CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR})
+
if (WIN32)
if (MINGW)
# Silence warnings about @nn suffix mismatch
+ set (CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -Wl,--enable-stdcall-fixup")
set (CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -Wl,--enable-stdcall-fixup")
endif ()
${CMAKE_SOURCE_DIR}/specs/winapi.py
${CMAKE_SOURCE_DIR}/specs/stdapi.py
)
- add_library (d2d1 MODULE d2d1.def d2d1trace.cpp)
- target_link_libraries (d2d1
+ add_library (d2d1trace SHARED d2d1.def d2d1trace.cpp)
+ target_link_libraries (d2d1trace
common_trace
common
${ZLIB_LIBRARIES}
${SNAPPY_LIBRARIES}
)
- set_target_properties (d2d1
+ set_target_properties (d2d1trace
PROPERTIES PREFIX ""
OUTPUT_NAME d2d1
)
- install (TARGETS d2d1 LIBRARY DESTINATION ${WRAPPER_INSTALL_DIR})
-
- add_custom_command (
- OUTPUT dwritetrace.cpp
- COMMAND ${PYTHON_EXECUTABLE} ${CMAKE_CURRENT_SOURCE_DIR}/dwritetrace.py > ${CMAKE_CURRENT_BINARY_DIR}/dwritetrace.cpp
- DEPENDS
- dwritetrace.py
- trace.py
- ${CMAKE_SOURCE_DIR}/specs/d2d1.py
- ${CMAKE_SOURCE_DIR}/specs/d2d1.py
- ${CMAKE_SOURCE_DIR}/specs/d2dbasetypes.py
- ${CMAKE_SOURCE_DIR}/specs/d2derr.py
- ${CMAKE_SOURCE_DIR}/specs/dwrite.py
- ${CMAKE_SOURCE_DIR}/specs/dcommon.py
- ${CMAKE_SOURCE_DIR}/specs/dxgi.py
- ${CMAKE_SOURCE_DIR}/specs/dxgitype.py
- ${CMAKE_SOURCE_DIR}/specs/dxgiformat.py
- ${CMAKE_SOURCE_DIR}/specs/winapi.py
- ${CMAKE_SOURCE_DIR}/specs/stdapi.py
- )
- add_library (dwrite MODULE dwrite.def dwritetrace.cpp)
- target_link_libraries (dwrite
- common_trace
- common
- ${ZLIB_LIBRARIES}
- ${SNAPPY_LIBRARIES}
+ # http://www.cmake.org/pipermail/cmake/2009-March/028221.html
+ install (TARGETS d2d1trace
+ RUNTIME DESTINATION ${WRAPPER_INSTALL_DIR} COMPONENT RUNTIME
+ LIBRARY DESTINATION ${WRAPPER_INSTALL_DIR} COMPONENT RUNTIME
)
- set_target_properties (dwrite
+
+ # dwrite.dll is just an empty stub for d2d1.dll
+ add_library (dwritetrace MODULE dwrite.def dwritetrace.cpp)
+ target_link_libraries (dwritetrace d2d1trace)
+ set_target_properties (dwritetrace
PROPERTIES PREFIX ""
OUTPUT_NAME dwrite
)
- install (TARGETS dwrite LIBRARY DESTINATION ${WRAPPER_INSTALL_DIR})
+ install (TARGETS dwritetrace LIBRARY DESTINATION ${WRAPPER_INSTALL_DIR})
endif (DirectX_D2D1_INCLUDE_DIR)
# opengl32.dll
from gltrace import GlTracer
-from specs.stdapi import API
+from specs.stdapi import Module, API
from specs.glapi import glapi
from specs.cglapi import cglapi
print '#include "glsize.hpp"'
print
+ module = Module()
+ module.mergeModule(cglapi)
+ module.mergeModule(glapi)
api = API()
- api.addApi(cglapi)
- api.addApi(glapi)
+ api.addModule(module)
tracer = CglTracer()
tracer.traceApi(api)
LIBRARY "d2d1"
EXPORTS
- D2D1CreateFactory
- D2D1InvertMatrix
- D2D1IsMatrixInvertible
- D2D1MakeRotateMatrix
- D2D1MakeSkewMatrix
+ D2D1CreateFactory @1
+ D2D1MakeRotateMatrix @2
+ D2D1MakeSkewMatrix @3
+ D2D1IsMatrixInvertible @4
+ D2D1InvertMatrix @5
+
+ DWriteCreateFactory
from dlltrace import DllTracer
+from specs.stdapi import API
+from specs.dwrite import dwrite
from specs.d2d1 import d2d1
-class D2D1Tracer(DllTracer):
-
- def wrapArg(self, function, arg):
- if function.name == 'D2D1CreateFactory' and arg.output:
- print ' if (*%s) {' % arg.name
- for iface in d2d1.interfaces:
- print ' if (riid == IID_%s) {' % iface.name
- print ' *%s = (LPVOID) new Wrap%s((%s *)*%s);' % (arg.name, iface.name, iface.name, arg.name)
- print ' }'
- print ' }'
- else:
- DllTracer.wrapArg(self, function, arg)
-
-
if __name__ == '__main__':
print '#define INITGUID'
print
print '#include "trace_writer_local.hpp"'
print '#include "os.hpp"'
print
+ print '#define DWRITE_EXPORT WINAPI'
+ print
print '#include "d2dimports.hpp"'
print
- tracer = D2D1Tracer('d2d1.dll')
- tracer.traceApi(d2d1)
+ api = API()
+ api.addModule(d2d1)
+ api.addModule(dwrite)
+ tracer = DllTracer()
+ tracer.traceApi(api)
-LIBRARY "d3d10.dll"
+LIBRARY "d3d10"
EXPORTS
- D3D10CompileEffectFromMemory
- D3D10CompileShader
- D3D10CreateBlob
- D3D10CreateDevice
- D3D10CreateDeviceAndSwapChain
- D3D10CreateEffectFromMemory
- D3D10CreateEffectPoolFromMemory
- D3D10CreateStateBlock
- D3D10DisassembleEffect
- D3D10DisassembleShader
- D3D10GetGeometryShaderProfile
- D3D10GetInputAndOutputSignatureBlob
- D3D10GetInputSignatureBlob
- D3D10GetOutputSignatureBlob
- D3D10GetPixelShaderProfile
- D3D10GetShaderDebugInfo
- D3D10GetVersion
- D3D10GetVertexShaderProfile
- D3D10PreprocessShader
- D3D10ReflectShader
- D3D10RegisterLayers
- D3D10StateBlockMaskDifference
- D3D10StateBlockMaskDisableAll
- D3D10StateBlockMaskDisableCapture
- D3D10StateBlockMaskEnableAll
- D3D10StateBlockMaskEnableCapture
- D3D10StateBlockMaskGetSetting
- D3D10StateBlockMaskIntersect
- D3D10StateBlockMaskUnion
+ D3D10CompileEffectFromMemory
+ D3D10CompileShader
+ D3D10CreateBlob
+ D3D10CreateDevice
+ D3D10CreateDeviceAndSwapChain
+ D3D10CreateEffectFromMemory
+ D3D10CreateEffectPoolFromMemory
+ D3D10CreateStateBlock
+ D3D10DisassembleEffect
+ D3D10DisassembleShader
+ D3D10GetGeometryShaderProfile
+ D3D10GetInputAndOutputSignatureBlob
+ D3D10GetInputSignatureBlob
+ D3D10GetOutputSignatureBlob
+ D3D10GetPixelShaderProfile
+ D3D10GetShaderDebugInfo
+ D3D10GetVersion
+ D3D10GetVertexShaderProfile
+ D3D10PreprocessShader
+ D3D10ReflectShader
+ D3D10RegisterLayers
+ D3D10StateBlockMaskDifference
+ D3D10StateBlockMaskDisableAll
+ D3D10StateBlockMaskDisableCapture
+ D3D10StateBlockMaskEnableAll
+ D3D10StateBlockMaskEnableCapture
+ D3D10StateBlockMaskGetSetting
+ D3D10StateBlockMaskIntersect
+ D3D10StateBlockMaskUnion
-LIBRARY "d3d10_1"
+LIBRARY "d3d10_1"
EXPORTS
D3D10CreateDevice1
from d3dcommontrace import D3DCommonTracer
+from specs.stdapi import API
from specs.d3d10_1 import d3d10_1
print '#include "d3dcommonshader.hpp"'
print '#include "d3d10size.hpp"'
print
- tracer = D3DCommonTracer('d3d10_1.dll')
- tracer.traceApi(d3d10_1)
+
+ api = API()
+ api.addModule(d3d10_1)
+ tracer = D3DCommonTracer()
+ tracer.traceApi(api)
from d3dcommontrace import D3DCommonTracer
+from specs.stdapi import API
from specs.d3d10misc import d3d10
print '#include "d3dcommonshader.hpp"'
print '#include "d3d10size.hpp"'
print
- tracer = D3DCommonTracer('d3d10.dll')
- tracer.traceApi(d3d10)
+
+ api = API()
+ api.addModule(d3d10)
+ tracer = D3DCommonTracer()
+ tracer.traceApi(api)
-LIBRARY "d3d11"
+LIBRARY "d3d11"
EXPORTS
- D3D11CoreCreateDevice
- D3D11CoreCreateLayeredDevice
- D3D11CoreGetLayeredDeviceSize
- D3D11CoreRegisterLayers
- D3D11CreateDevice
- D3D11CreateDeviceAndSwapChain
+ D3D11CoreCreateDevice
+ D3D11CoreCreateLayeredDevice
+ D3D11CoreGetLayeredDeviceSize
+ D3D11CoreRegisterLayers
+ D3D11CreateDevice
+ D3D11CreateDeviceAndSwapChain
+
+ CreateDXGIFactory
+ CreateDXGIFactory1
import sys
from d3dcommontrace import D3DCommonTracer
+from specs.stdapi import API
+from specs.dxgi import dxgi
from specs.d3d11 import d3d11
print '#include "d3dcommonshader.hpp"'
print '#include "d3d11size.hpp"'
print
- tracer = D3DCommonTracer('d3d11.dll')
- tracer.traceApi(d3d11)
+
+ api = API()
+ api.addModule(dxgi)
+ api.addModule(d3d11)
+ tracer = D3DCommonTracer()
+ tracer.traceApi(api)
-LIBRARY "d3d8"
+LIBRARY "d3d8"
EXPORTS
Direct3DCreate8 @1
from dlltrace import DllTracer
+from specs.stdapi import API
from specs.d3d8 import d3d8
print '#include "trace_writer_local.hpp"'
print '#include "os.hpp"'
print
- tracer = D3D8Tracer('d3d8.dll')
- tracer.traceApi(d3d8)
+
+ api = API()
+ api.addModule(d3d8)
+ tracer = D3D8Tracer()
+ tracer.traceApi(api)
-LIBRARY "d3d9"
+LIBRARY "d3d9"
EXPORTS
Direct3DCreate9
from dlltrace import DllTracer
+from specs.stdapi import API
from specs.d3d9 import d3d9, D3DSHADER9
import specs.d3d9dxva2
interface.getMethodByName('LockRect') is not None or \
interface.getMethodByName('LockBox') is not None:
variables += [
- ('size_t', '_LockedSize', '0'),
+ ('size_t', '_MappedSize', '0'),
('VOID *', 'm_pbData', '0'),
]
def implementWrapperInterfaceMethodBody(self, interface, base, method):
if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'):
- print ' if (_LockedSize && m_pbData) {'
- self.emit_memcpy('(LPBYTE)m_pbData', '(LPBYTE)m_pbData', '_LockedSize')
+ print ' if (_MappedSize && m_pbData) {'
+ self.emit_memcpy('(LPBYTE)m_pbData', '(LPBYTE)m_pbData', '_MappedSize')
print ' }'
DllTracer.implementWrapperInterfaceMethodBody(self, interface, base, method)
if method.name in ('Lock', 'LockRect', 'LockBox'):
# FIXME: handle recursive locks
print ' if (SUCCEEDED(_result) && !(Flags & D3DLOCK_READONLY)) {'
- print ' _getLockInfo(_this, %s, m_pbData, _LockedSize);' % ', '.join(method.argNames()[:-1])
+ print ' _getMapInfo(_this, %s, m_pbData, _MappedSize);' % ', '.join(method.argNames()[:-1])
print ' } else {'
print ' m_pbData = NULL;'
- print ' _LockedSize = 0;'
+ print ' _MappedSize = 0;'
print ' }'
return count;
}
'''
- tracer = D3D9Tracer('d3d9.dll')
- tracer.traceApi(d3d9)
+ api = API()
+ api.addModule(d3d9)
+ tracer = D3D9Tracer()
+ tracer.traceApi(api)
from dlltrace import DllTracer
+from specs.stdapi import API
from specs.d3d import ddraw, interfaces
-class DDrawTracer(DllTracer):
-
- def traceFunctionImplBody(self, function):
- if function.name in ('AcquireDDThreadLock', 'ReleaseDDThreadLock'):
- self.invokeFunction(function)
- return
-
- DllTracer.traceFunctionImplBody(self, function)
-
-
if __name__ == '__main__':
print '#define INITGUID'
print '#include <windows.h>'
print '#include "trace_writer_local.hpp"'
print '#include "os.hpp"'
print
- tracer = DDrawTracer('ddraw.dll')
- tracer.traceApi(ddraw)
+
+ api = API()
+ api.addModule(ddraw)
+ tracer = DllTracer()
+ tracer.traceApi(api)
"""Trace code generation for Windows DLLs."""
+import ntpath
+
from trace import Tracer
from dispatch import Dispatcher
+from specs.stdapi import API
-class DllTracer(Tracer):
+class DllDispatcher(Dispatcher):
- def __init__(self, dllname):
- self.dllname = dllname
-
- def header(self, api):
- print '''
-static HMODULE g_hDll = NULL;
+ def dispatchModule(self, module):
+ tag = module.name.upper()
+ print r'HMODULE g_h%sModule = NULL;' % (tag,)
+ print r''
+ print r'static PROC'
+ print r'_get%sProcAddress(LPCSTR lpProcName) {' % tag
+ print r' if (!g_h%sModule) {' % tag
+ print r' char szDll[MAX_PATH] = {0};'
+ print r' if (!GetSystemDirectoryA(szDll, MAX_PATH)) {'
+ print r' return NULL;'
+ print r' }'
+ print r' strcat(szDll, "\\\\%s.dll");' % module.name
+ print r' g_h%sModule = LoadLibraryA(szDll);' % tag
+ print r' if (!g_h%sModule) {' % tag
+ print r' return NULL;'
+ print r' }'
+ print r' }'
+ print r' return GetProcAddress(g_h%sModule, lpProcName);' % tag
+ print r'}'
+ print r''
-static PROC
-_getPublicProcAddress(LPCSTR lpProcName)
-{
- if (!g_hDll) {
- char szDll[MAX_PATH] = {0};
-
- if (!GetSystemDirectoryA(szDll, MAX_PATH)) {
- return NULL;
- }
-
- strcat(szDll, "\\\\%s");
-
- g_hDll = LoadLibraryA(szDll);
- if (!g_hDll) {
- return NULL;
- }
- }
-
- return GetProcAddress(g_hDll, lpProcName);
-}
+ Dispatcher.dispatchModule(self, module)
-''' % self.dllname
+ def getProcAddressName(self, module, function):
+ assert self.isFunctionPublic(module, function)
+ return '_get%sProcAddress' % (module.name.upper())
- dispatcher = Dispatcher()
- dispatcher.dispatchApi(api)
- Tracer.header(self, api)
+class DllTracer(Tracer):
+ def header(self, api):
+
+ for module in api.modules:
+ dispatcher = DllDispatcher()
+ dispatcher.dispatchModule(module)
+
+ Tracer.header(self, api)
LIBRARY "d2d1"
EXPORTS
- DWriteCreateFactory
+ DWriteCreateFactory
--- /dev/null
+#include <windows.h>
+
+EXTERN_C BOOL WINAPI
+DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) {
+ return TRUE;
+}
+++ /dev/null
-##########################################################################
-#
-# 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.
-#
-##########################################################################/
-
-
-from dlltrace import DllTracer
-from specs.dwrite import dwrite
-from specs.d2d1 import d2d1 # cyclic dependency
-
-
-class DWriteTracer(DllTracer):
-
- def wrapArg(self, function, arg):
- if function.name == 'DWriteCreateFactory' and arg.output:
- print ' if (*%s) {' % arg.name
- for iface in dwrite.interfaces:
- print ' if (iid == IID_%s) {' % iface.name
- print ' *%s = new Wrap%s(static_cast<%s *>(*%s));' % (arg.name, iface.name, iface.name, arg.name)
- print ' }'
- print ' }'
- else:
- DllTracer.wrapArg(self, function, arg)
-
-
-if __name__ == '__main__':
- print '#define INITGUID'
- print
- print '#include "trace_writer_local.hpp"'
- print '#include "os.hpp"'
- print
- print '#define DWRITE_EXPORT WINAPI'
- print
- print '#include "d2dimports.hpp"'
- print
-
- tracer = DWriteTracer('dwrite.dll')
- tracer.traceApi(dwrite)
from gltrace import GlTracer
-from specs.stdapi import API
+from specs.stdapi import Module, API
from specs.glapi import glapi
from specs.eglapi import eglapi
from specs.glesapi import glesapi
print '#include "eglsize.hpp"'
print
+ module = Module()
+ module.mergeModule(eglapi)
+ module.mergeModule(glapi)
+ module.mergeModule(glesapi)
api = API()
- api.addApi(eglapi)
- api.addApi(glapi)
- api.addApi(glesapi)
+ api.addModule(module)
tracer = EglTracer()
tracer.traceApi(api)
print ' if (!procPtr) {'
print ' return procPtr;'
print ' }'
- for function in api.functions:
+ for function in api.getAllFunctions():
ptype = function_pointer_type(function)
pvalue = function_pointer_value(function)
print ' if (strcmp("%s", (const char *)procName) == 0) {' % function.name
from gltrace import GlTracer
-from specs.stdapi import API
+from specs.stdapi import Module, API
from specs.glapi import glapi
from specs.glxapi import glxapi
print '#include "glsize.hpp"'
print
+ module = Module()
+ module.mergeModule(glxapi)
+ module.mergeModule(glapi)
api = API()
- api.addApi(glxapi)
- api.addApi(glapi)
+ api.addModule(module)
tracer = GlxTracer()
tracer.traceApi(api)
LIBRARY opengl32
EXPORTS
-; GlmfBeginGlsBlock
-; GlmfCloseMetaFile
-; GlmfEndGlsBlock
-; GlmfEndPlayback
-; GlmfInitPlayback
-; GlmfPlayGlsRecord
- glAccum
- glAlphaFunc
- glAreTexturesResident
- glArrayElement
- glBegin
- glBindTexture
- glBitmap
- glBlendFunc
- glCallList
- glCallLists
- glClear
- glClearAccum
- glClearColor
- glClearDepth
- glClearIndex
- glClearStencil
- glClipPlane
- glColor3b
- glColor3bv
- glColor3d
- glColor3dv
- glColor3f
- glColor3fv
- glColor3i
- glColor3iv
- glColor3s
- glColor3sv
- glColor3ub
- glColor3ubv
- glColor3ui
- glColor3uiv
- glColor3us
- glColor3usv
- glColor4b
- glColor4bv
- glColor4d
- glColor4dv
- glColor4f
- glColor4fv
- glColor4i
- glColor4iv
- glColor4s
- glColor4sv
- glColor4ub
- glColor4ubv
- glColor4ui
- glColor4uiv
- glColor4us
- glColor4usv
- glColorMask
- glColorMaterial
- glColorPointer
- glCopyPixels
- glCopyTexImage1D
- glCopyTexImage2D
- glCopyTexSubImage1D
- glCopyTexSubImage2D
- glCullFace
-; glDebugEntry
- glDeleteLists
- glDeleteTextures
- glDepthFunc
- glDepthMask
- glDepthRange
- glDisable
- glDisableClientState
- glDrawArrays
- glDrawBuffer
- glDrawElements
- glDrawPixels
- glEdgeFlag
- glEdgeFlagPointer
- glEdgeFlagv
- glEnable
- glEnableClientState
- glEnd
- glEndList
- glEvalCoord1d
- glEvalCoord1dv
- glEvalCoord1f
- glEvalCoord1fv
- glEvalCoord2d
- glEvalCoord2dv
- glEvalCoord2f
- glEvalCoord2fv
- glEvalMesh1
- glEvalMesh2
- glEvalPoint1
- glEvalPoint2
- glFeedbackBuffer
- glFinish
- glFlush
- glFogf
- glFogfv
- glFogi
- glFogiv
- glFrontFace
- glFrustum
- glGenLists
- glGenTextures
- glGetBooleanv
- glGetClipPlane
- glGetDoublev
- glGetError
- glGetFloatv
- glGetIntegerv
- glGetLightfv
- glGetLightiv
- glGetMapdv
- glGetMapfv
- glGetMapiv
- glGetMaterialfv
- glGetMaterialiv
- glGetPixelMapfv
- glGetPixelMapuiv
- glGetPixelMapusv
- glGetPointerv
- glGetPolygonStipple
- glGetString
- glGetTexEnvfv
- glGetTexEnviv
- glGetTexGendv
- glGetTexGenfv
- glGetTexGeniv
- glGetTexImage
- glGetTexLevelParameterfv
- glGetTexLevelParameteriv
- glGetTexParameterfv
- glGetTexParameteriv
- glHint
- glIndexMask
- glIndexPointer
- glIndexd
- glIndexdv
- glIndexf
- glIndexfv
- glIndexi
- glIndexiv
- glIndexs
- glIndexsv
- glIndexub
- glIndexubv
- glInitNames
- glInterleavedArrays
- glIsEnabled
- glIsList
- glIsTexture
- glLightModelf
- glLightModelfv
- glLightModeli
- glLightModeliv
- glLightf
- glLightfv
- glLighti
- glLightiv
- glLineStipple
- glLineWidth
- glListBase
- glLoadIdentity
- glLoadMatrixd
- glLoadMatrixf
- glLoadName
- glLogicOp
- glMap1d
- glMap1f
- glMap2d
- glMap2f
- glMapGrid1d
- glMapGrid1f
- glMapGrid2d
- glMapGrid2f
- glMaterialf
- glMaterialfv
- glMateriali
- glMaterialiv
- glMatrixMode
- glMultMatrixd
- glMultMatrixf
- glNewList
- glNormal3b
- glNormal3bv
- glNormal3d
- glNormal3dv
- glNormal3f
- glNormal3fv
- glNormal3i
- glNormal3iv
- glNormal3s
- glNormal3sv
- glNormalPointer
- glOrtho
- glPassThrough
- glPixelMapfv
- glPixelMapuiv
- glPixelMapusv
- glPixelStoref
- glPixelStorei
- glPixelTransferf
- glPixelTransferi
- glPixelZoom
- glPointSize
- glPolygonMode
- glPolygonOffset
- glPolygonStipple
- glPopAttrib
- glPopClientAttrib
- glPopMatrix
- glPopName
- glPrioritizeTextures
- glPushAttrib
- glPushClientAttrib
- glPushMatrix
- glPushName
- glRasterPos2d
- glRasterPos2dv
- glRasterPos2f
- glRasterPos2fv
- glRasterPos2i
- glRasterPos2iv
- glRasterPos2s
- glRasterPos2sv
- glRasterPos3d
- glRasterPos3dv
- glRasterPos3f
- glRasterPos3fv
- glRasterPos3i
- glRasterPos3iv
- glRasterPos3s
- glRasterPos3sv
- glRasterPos4d
- glRasterPos4dv
- glRasterPos4f
- glRasterPos4fv
- glRasterPos4i
- glRasterPos4iv
- glRasterPos4s
- glRasterPos4sv
- glReadBuffer
- glReadPixels
- glRectd
- glRectdv
- glRectf
- glRectfv
- glRecti
- glRectiv
- glRects
- glRectsv
- glRenderMode
- glRotated
- glRotatef
- glScaled
- glScalef
- glScissor
- glSelectBuffer
- glShadeModel
- glStencilFunc
- glStencilMask
- glStencilOp
- glTexCoord1d
- glTexCoord1dv
- glTexCoord1f
- glTexCoord1fv
- glTexCoord1i
- glTexCoord1iv
- glTexCoord1s
- glTexCoord1sv
- glTexCoord2d
- glTexCoord2dv
- glTexCoord2f
- glTexCoord2fv
- glTexCoord2i
- glTexCoord2iv
- glTexCoord2s
- glTexCoord2sv
- glTexCoord3d
- glTexCoord3dv
- glTexCoord3f
- glTexCoord3fv
- glTexCoord3i
- glTexCoord3iv
- glTexCoord3s
- glTexCoord3sv
- glTexCoord4d
- glTexCoord4dv
- glTexCoord4f
- glTexCoord4fv
- glTexCoord4i
- glTexCoord4iv
- glTexCoord4s
- glTexCoord4sv
- glTexCoordPointer
- glTexEnvf
- glTexEnvfv
- glTexEnvi
- glTexEnviv
- glTexGend
- glTexGendv
- glTexGenf
- glTexGenfv
- glTexGeni
- glTexGeniv
- glTexImage1D
- glTexImage2D
- glTexParameterf
- glTexParameterfv
- glTexParameteri
- glTexParameteriv
- glTexSubImage1D
- glTexSubImage2D
- glTranslated
- glTranslatef
- glVertex2d
- glVertex2dv
- glVertex2f
- glVertex2fv
- glVertex2i
- glVertex2iv
- glVertex2s
- glVertex2sv
- glVertex3d
- glVertex3dv
- glVertex3f
- glVertex3fv
- glVertex3i
- glVertex3iv
- glVertex3s
- glVertex3sv
- glVertex4d
- glVertex4dv
- glVertex4f
- glVertex4fv
- glVertex4i
- glVertex4iv
- glVertex4s
- glVertex4sv
- glVertexPointer
- glViewport
- wglChoosePixelFormat
- wglCopyContext
- wglCreateContext
- wglCreateLayerContext
- wglDeleteContext
- wglDescribeLayerPlane
- wglDescribePixelFormat
- wglGetCurrentContext
- wglGetCurrentDC
- wglGetDefaultProcAddress
- wglGetLayerPaletteEntries
- wglGetPixelFormat
- wglGetProcAddress
- wglMakeCurrent
- wglRealizeLayerPalette
- wglSetLayerPaletteEntries
- wglSetPixelFormat
- wglShareLists
- wglSwapBuffers
- wglSwapLayerBuffers
- wglSwapMultipleBuffers
- wglUseFontBitmapsA
- wglUseFontBitmapsW
- wglUseFontOutlinesA
- wglUseFontOutlinesW
+ ;GlmfBeginGlsBlock
+ ;GlmfCloseMetaFile
+ ;GlmfEndGlsBlock
+ ;GlmfEndPlayback
+ ;GlmfInitPlayback
+ ;GlmfPlayGlsRecord
+ glAccum
+ glAlphaFunc
+ glAreTexturesResident
+ glArrayElement
+ glBegin
+ glBindTexture
+ glBitmap
+ glBlendFunc
+ glCallList
+ glCallLists
+ glClear
+ glClearAccum
+ glClearColor
+ glClearDepth
+ glClearIndex
+ glClearStencil
+ glClipPlane
+ glColor3b
+ glColor3bv
+ glColor3d
+ glColor3dv
+ glColor3f
+ glColor3fv
+ glColor3i
+ glColor3iv
+ glColor3s
+ glColor3sv
+ glColor3ub
+ glColor3ubv
+ glColor3ui
+ glColor3uiv
+ glColor3us
+ glColor3usv
+ glColor4b
+ glColor4bv
+ glColor4d
+ glColor4dv
+ glColor4f
+ glColor4fv
+ glColor4i
+ glColor4iv
+ glColor4s
+ glColor4sv
+ glColor4ub
+ glColor4ubv
+ glColor4ui
+ glColor4uiv
+ glColor4us
+ glColor4usv
+ glColorMask
+ glColorMaterial
+ glColorPointer
+ glCopyPixels
+ glCopyTexImage1D
+ glCopyTexImage2D
+ glCopyTexSubImage1D
+ glCopyTexSubImage2D
+ glCullFace
+ ;glDebugEntry
+ glDeleteLists
+ glDeleteTextures
+ glDepthFunc
+ glDepthMask
+ glDepthRange
+ glDisable
+ glDisableClientState
+ glDrawArrays
+ glDrawBuffer
+ glDrawElements
+ glDrawPixels
+ glEdgeFlag
+ glEdgeFlagPointer
+ glEdgeFlagv
+ glEnable
+ glEnableClientState
+ glEnd
+ glEndList
+ glEvalCoord1d
+ glEvalCoord1dv
+ glEvalCoord1f
+ glEvalCoord1fv
+ glEvalCoord2d
+ glEvalCoord2dv
+ glEvalCoord2f
+ glEvalCoord2fv
+ glEvalMesh1
+ glEvalMesh2
+ glEvalPoint1
+ glEvalPoint2
+ glFeedbackBuffer
+ glFinish
+ glFlush
+ glFogf
+ glFogfv
+ glFogi
+ glFogiv
+ glFrontFace
+ glFrustum
+ glGenLists
+ glGenTextures
+ glGetBooleanv
+ glGetClipPlane
+ glGetDoublev
+ glGetError
+ glGetFloatv
+ glGetIntegerv
+ glGetLightfv
+ glGetLightiv
+ glGetMapdv
+ glGetMapfv
+ glGetMapiv
+ glGetMaterialfv
+ glGetMaterialiv
+ glGetPixelMapfv
+ glGetPixelMapuiv
+ glGetPixelMapusv
+ glGetPointerv
+ glGetPolygonStipple
+ glGetString
+ glGetTexEnvfv
+ glGetTexEnviv
+ glGetTexGendv
+ glGetTexGenfv
+ glGetTexGeniv
+ glGetTexImage
+ glGetTexLevelParameterfv
+ glGetTexLevelParameteriv
+ glGetTexParameterfv
+ glGetTexParameteriv
+ glHint
+ glIndexMask
+ glIndexPointer
+ glIndexd
+ glIndexdv
+ glIndexf
+ glIndexfv
+ glIndexi
+ glIndexiv
+ glIndexs
+ glIndexsv
+ glIndexub
+ glIndexubv
+ glInitNames
+ glInterleavedArrays
+ glIsEnabled
+ glIsList
+ glIsTexture
+ glLightModelf
+ glLightModelfv
+ glLightModeli
+ glLightModeliv
+ glLightf
+ glLightfv
+ glLighti
+ glLightiv
+ glLineStipple
+ glLineWidth
+ glListBase
+ glLoadIdentity
+ glLoadMatrixd
+ glLoadMatrixf
+ glLoadName
+ glLogicOp
+ glMap1d
+ glMap1f
+ glMap2d
+ glMap2f
+ glMapGrid1d
+ glMapGrid1f
+ glMapGrid2d
+ glMapGrid2f
+ glMaterialf
+ glMaterialfv
+ glMateriali
+ glMaterialiv
+ glMatrixMode
+ glMultMatrixd
+ glMultMatrixf
+ glNewList
+ glNormal3b
+ glNormal3bv
+ glNormal3d
+ glNormal3dv
+ glNormal3f
+ glNormal3fv
+ glNormal3i
+ glNormal3iv
+ glNormal3s
+ glNormal3sv
+ glNormalPointer
+ glOrtho
+ glPassThrough
+ glPixelMapfv
+ glPixelMapuiv
+ glPixelMapusv
+ glPixelStoref
+ glPixelStorei
+ glPixelTransferf
+ glPixelTransferi
+ glPixelZoom
+ glPointSize
+ glPolygonMode
+ glPolygonOffset
+ glPolygonStipple
+ glPopAttrib
+ glPopClientAttrib
+ glPopMatrix
+ glPopName
+ glPrioritizeTextures
+ glPushAttrib
+ glPushClientAttrib
+ glPushMatrix
+ glPushName
+ glRasterPos2d
+ glRasterPos2dv
+ glRasterPos2f
+ glRasterPos2fv
+ glRasterPos2i
+ glRasterPos2iv
+ glRasterPos2s
+ glRasterPos2sv
+ glRasterPos3d
+ glRasterPos3dv
+ glRasterPos3f
+ glRasterPos3fv
+ glRasterPos3i
+ glRasterPos3iv
+ glRasterPos3s
+ glRasterPos3sv
+ glRasterPos4d
+ glRasterPos4dv
+ glRasterPos4f
+ glRasterPos4fv
+ glRasterPos4i
+ glRasterPos4iv
+ glRasterPos4s
+ glRasterPos4sv
+ glReadBuffer
+ glReadPixels
+ glRectd
+ glRectdv
+ glRectf
+ glRectfv
+ glRecti
+ glRectiv
+ glRects
+ glRectsv
+ glRenderMode
+ glRotated
+ glRotatef
+ glScaled
+ glScalef
+ glScissor
+ glSelectBuffer
+ glShadeModel
+ glStencilFunc
+ glStencilMask
+ glStencilOp
+ glTexCoord1d
+ glTexCoord1dv
+ glTexCoord1f
+ glTexCoord1fv
+ glTexCoord1i
+ glTexCoord1iv
+ glTexCoord1s
+ glTexCoord1sv
+ glTexCoord2d
+ glTexCoord2dv
+ glTexCoord2f
+ glTexCoord2fv
+ glTexCoord2i
+ glTexCoord2iv
+ glTexCoord2s
+ glTexCoord2sv
+ glTexCoord3d
+ glTexCoord3dv
+ glTexCoord3f
+ glTexCoord3fv
+ glTexCoord3i
+ glTexCoord3iv
+ glTexCoord3s
+ glTexCoord3sv
+ glTexCoord4d
+ glTexCoord4dv
+ glTexCoord4f
+ glTexCoord4fv
+ glTexCoord4i
+ glTexCoord4iv
+ glTexCoord4s
+ glTexCoord4sv
+ glTexCoordPointer
+ glTexEnvf
+ glTexEnvfv
+ glTexEnvi
+ glTexEnviv
+ glTexGend
+ glTexGendv
+ glTexGenf
+ glTexGenfv
+ glTexGeni
+ glTexGeniv
+ glTexImage1D
+ glTexImage2D
+ glTexParameterf
+ glTexParameterfv
+ glTexParameteri
+ glTexParameteriv
+ glTexSubImage1D
+ glTexSubImage2D
+ glTranslated
+ glTranslatef
+ glVertex2d
+ glVertex2dv
+ glVertex2f
+ glVertex2fv
+ glVertex2i
+ glVertex2iv
+ glVertex2s
+ glVertex2sv
+ glVertex3d
+ glVertex3dv
+ glVertex3f
+ glVertex3fv
+ glVertex3i
+ glVertex3iv
+ glVertex3s
+ glVertex3sv
+ glVertex4d
+ glVertex4dv
+ glVertex4f
+ glVertex4fv
+ glVertex4i
+ glVertex4iv
+ glVertex4s
+ glVertex4sv
+ glVertexPointer
+ glViewport
+ wglChoosePixelFormat
+ wglCopyContext
+ wglCreateContext
+ wglCreateLayerContext
+ wglDeleteContext
+ wglDescribeLayerPlane
+ wglDescribePixelFormat
+ wglGetCurrentContext
+ wglGetCurrentDC
+ wglGetDefaultProcAddress
+ wglGetLayerPaletteEntries
+ wglGetPixelFormat
+ wglGetProcAddress
+ wglMakeCurrent
+ wglRealizeLayerPalette
+ wglSetLayerPaletteEntries
+ wglSetPixelFormat
+ wglShareLists
+ wglSwapBuffers
+ wglSwapLayerBuffers
+ wglSwapMultipleBuffers
+ wglUseFontBitmapsA
+ wglUseFontBitmapsW
+ wglUseFontOutlinesA
+ wglUseFontOutlinesW
self.header(api)
# Includes
- for header in api.headers:
- print header
+ for module in api.modules:
+ for header in module.headers:
+ print header
print
# Generate the serializer functions
# Function wrappers
self.interface = None
self.base = None
- map(self.traceFunctionDecl, api.functions)
- map(self.traceFunctionImpl, api.functions)
+ for function in api.getAllFunctions():
+ self.traceFunctionDecl(function)
+ for function in api.getAllFunctions():
+ self.traceFunctionImpl(function)
print
self.footer(api)
from gltrace import GlTracer
-from specs.stdapi import API
+from specs.stdapi import Module, API
from specs.glapi import glapi
from specs.wglapi import wglapi
print '#include "glproc.hpp"'
print '#include "glsize.hpp"'
print
+ module = Module()
+ module.mergeModule(glapi)
+ module.mergeModule(wglapi)
api = API()
- api.addApi(glapi)
- api.addApi(wglapi)
+ api.addModule(module)
tracer = WglTracer()
tracer.traceApi(api)