]> git.cworth.org Git - apitrace/blobdiff - wrappers/d3d8trace.py
d3d8: Update specs to match d3d9.
[apitrace] / wrappers / d3d8trace.py
index 2abaf4e54f27923f45bfa66964ebacfe6a53c624..fd2c8f5303fc759c7712f03cdef8c235f7bc3e0c 100644 (file)
 
 from dlltrace import DllTracer
 from specs.stdapi import API
-from specs.d3d8 import d3d8
+from specs.d3d8 import d3d8, D3DSHADER8
 
 
 class D3D8Tracer(DllTracer):
 
     def serializeArgValue(self, function, arg):
         # Dump shaders as strings
-        if function.name in ('CreateVertexShader', 'CreatePixelShader') and arg.name == 'pFunction':
+        if arg.type is D3DSHADER8:
             print '    DumpShader(trace::localWriter, %s);' % (arg.name)
             return
 
         DllTracer.serializeArgValue(self, function, arg)
 
+    def enumWrapperInterfaceVariables(self, interface):
+        variables = DllTracer.enumWrapperInterfaceVariables(self, interface)
+        
+        # Add additional members to track locks
+        if interface.getMethodByName('Lock') is not None or \
+           interface.getMethodByName('LockRect') is not None or \
+           interface.getMethodByName('LockBox') is not None:
+            variables += [
+                ('size_t', '_MappedSize', '0'),
+                ('VOID *', 'm_pbData', '0'),
+            ]
+
+        return variables
+
+    def implementWrapperInterfaceMethodBody(self, interface, base, method):
+        if method.name in ('Unlock', 'UnlockRect', 'UnlockBox'):
+            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 '        _getMapInfo(_this, %s, m_pbData, _MappedSize);' % ', '.join(method.argNames()[:-1])
+            print '    } else {'
+            print '        m_pbData = NULL;'
+            print '        _MappedSize = 0;'
+            print '    }'
+
 
 if __name__ == '__main__':
     print '#define INITGUID'
     print
+    print '#include "trace_writer_local.hpp"'
+    print '#include "os.hpp"'
+    print
     print '#include <windows.h>'
     print '#include <d3d8.h>'
+    print '#include "d3d8size.hpp"'
     print '#include "d3d9shader.hpp"'
     print
-    print '#include "trace_writer_local.hpp"'
-    print '#include "os.hpp"'
-    print
-
 
     api = API()
     api.addModule(d3d8)