1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263
|
%module(docstring="This is the API to QRenderDoc's high-level UI panels and functionality.") qrenderdoc
%feature("autodoc", "0");
// use documentation for docstrings
#define DOCUMENT(text) %feature("docstring") text
#define DOCUMENT2(text1, text2) %feature("docstring") text1 text2
#define DOCUMENT3(text1, text2, text3) %feature("docstring") text1 text2 text3
#define DOCUMENT4(text1, text2, text3, text4) %feature("docstring") text1 text2 text3 text4
%begin %{
#undef slots
#ifndef SWIG_GENERATED
#define SWIG_GENERATED
#endif
// we want visual assist to ignore this file, because it's a *lot* of generated code and has no
// useful results. This macro does nothing on normal builds, but is defined to _asm { in va_stdafx.h
#define VA_IGNORE_REST_OF_FILE
VA_IGNORE_REST_OF_FILE
%}
%{
#include "datetime.h"
%}
%init %{
PyDateTime_IMPORT;
%}
%{
#include "Code/Interface/QRDInterface.h"
%}
%include "pyconversion.i"
// import the renderdoc interface that we depend on
%import "renderdoc.i"
TEMPLATE_ARRAY_DECLARE(rdcarray);
TEMPLATE_FIXEDARRAY_DECLARE(rdcfixedarray);
// pass QWidget objects to PySide
%{
class QWidget;
extern "C" QWidget *QWidgetFromPy(PyObject *widget);
extern "C" PyObject *QWidgetToPy(QWidget *widget);
DECLARE_STRINGISE_TYPE(QWidget);
%}
%typemap(in) QWidget * {
if($input == Py_None)
$1 = NULL;
else
$1 = QWidgetFromPy($input);
if($input && $input != Py_None && !$1)
{
SWIG_exception_fail(SWIG_TypeError, "in method '$symname' QWidget expected for argument $argnum of type '$1_basetype'");
}
}
%typemap(out) QWidget * {
$result = QWidgetToPy($1);
}
// create a wrapper for passing python ICaptureViewer interface implementations to C++
%{
struct PythonCaptureViewer : public ICaptureViewer
{
PythonCaptureViewer(PyObject *s) : self(s)
{
Py_INCREF(self);
StackExceptionHandler ex;
PyObject *meth = NULL;
{
meth = PyObject_GetAttrString(self, "OnCaptureLoaded");
m_OnCaptureLoaded = ConvertFunc<std::function<void()>>("ICaptureViewer::OnCaptureLoaded", meth, ex);
Py_XDECREF(meth);
}
{
meth = PyObject_GetAttrString(self, "OnCaptureClosed");
m_OnCaptureClosed = ConvertFunc<std::function<void()>>("ICaptureViewer::OnCaptureClosed", meth, ex);
Py_XDECREF(meth);
}
{
meth = PyObject_GetAttrString(self, "OnSelectedEventChanged");
m_OnSelectedEventChanged = ConvertFunc<std::function<void(uint32_t)>>("ICaptureViewer::OnSelectedEventChanged", meth, ex);
Py_XDECREF(meth);
}
{
meth = PyObject_GetAttrString(self, "OnEventChanged");
m_OnEventChanged = ConvertFunc<std::function<void(uint32_t)>>("ICaptureViewer::OnEventChanged", meth, ex);
Py_XDECREF(meth);
}
}
virtual ~PythonCaptureViewer()
{
Py_DECREF(self);
}
void OnCaptureLoaded() override { if(m_OnCaptureLoaded) m_OnCaptureLoaded(); }
void OnCaptureClosed() override { if(m_OnCaptureClosed) m_OnCaptureClosed(); }
void OnSelectedEventChanged(uint32_t eventId) override { if(m_OnSelectedEventChanged) m_OnSelectedEventChanged(eventId); }
void OnEventChanged(uint32_t eventId) override { if(m_OnEventChanged) m_OnEventChanged(eventId); }
private:
PyObject *self;
std::function<void()> m_OnCaptureLoaded, m_OnCaptureClosed;
std::function<void(uint32_t)> m_OnSelectedEventChanged, m_OnEventChanged;
};
static int capviewer_init(PyObject *self, PyObject *args) {
PyObject *resultobj = 0;
ICaptureViewer *result = 0;
result = new PythonCaptureViewer(self);
resultobj = SWIG_NewPointerObj(SWIG_as_voidptr(result), SWIGTYPE_p_ICaptureViewer, SWIG_BUILTIN_INIT | 0);
return resultobj == Py_None ? -1 : 0;
}
SWIGINTERN PyObject *capviewer_deinit(PyObject *self, PyObject *args)
{
PythonCaptureViewer *viewer = NULL;
void *ptr = NULL;
int res = SWIG_ConvertPtr(self, &ptr, SWIGTYPE_p_ICaptureViewer, SWIG_POINTER_DISOWN | 0);
if(!SWIG_IsOK(res))
{
SWIG_exception_fail(SWIG_ArgError(res), "in method '" "delete_CaptureViewer" "', argument " "1"" of type '" "CaptureViewer *""'");
}
viewer = (PythonCaptureViewer *)ptr;
delete viewer;
return SWIG_Py_Void();
fail:
return NULL;
}
SWIGPY_DESTRUCTOR_CLOSURE(capviewer_deinit) /* defines capviewer_deinit_destructor_closure */
%}
%feature("python:tp_init") ICaptureViewer "&capviewer_init";
%feature("python:tp_dealloc") ICaptureViewer "&capviewer_deinit_destructor_closure";
// need to ignore the original function and add a helper that releases the python GIL while calling
%ignore IReplayManager::BlockInvoke;
// ignore these functions as we don't map QVariantMap to/from python
%ignore EnvironmentModification::toJSON;
%ignore EnvironmentModification::fromJSON;
// rename the interfaces to remove the I prefix
%rename("%(regex:/^I([A-Z].*)/\\1/)s", %$isclass) "";
%{
#ifndef slots
#define slots
#endif
DECLARE_STRINGISE_TYPE(rdcstrpair);
%}
%include <stdint.i>
%include "Code/Interface/QRDInterface.h"
%include "Code/Interface/PersistantConfig.h"
%include "Code/Interface/RemoteHost.h"
%include "Code/Interface/Extensions.h"
DOCUMENT("");
TEMPLATE_ARRAY_INSTANTIATE(rdcarray, EventBookmark)
TEMPLATE_ARRAY_INSTANTIATE(rdcarray, ShaderProcessingTool)
TEMPLATE_ARRAY_INSTANTIATE(rdcarray, rdcstrpair)
TEMPLATE_ARRAY_INSTANTIATE(rdcarray, BugReport)
TEMPLATE_ARRAY_INSTANTIATE(rdcarray, ExtensionMetadata)
TEMPLATE_ARRAY_INSTANTIATE(rdcarray, DialogButton)
TEMPLATE_ARRAY_INSTANTIATE(rdcarray, RemoteHost)
TEMPLATE_ARRAY_INSTANTIATE_PTR(rdcarray, ICaptureViewer)
// unignore the function from above
%rename("%s") IReplayManager::BlockInvoke;
%extend IReplayManager {
void BlockInvoke(InvokeCallback m) {
PyObject *global_internal_handle = NULL;
PyObject *globals = PyEval_GetGlobals();
if(globals)
global_internal_handle = PyDict_GetItemString(globals, "_renderdoc_internal");
SetThreadBlocking(global_internal_handle, true);
Py_BEGIN_ALLOW_THREADS
$self->BlockInvoke(m);
Py_END_ALLOW_THREADS
SetThreadBlocking(global_internal_handle, false);
}
};
%header %{
#include <set>
#include "Code/pyrenderdoc/interface_check.h"
// check interface, see interface_check.h for more information
static swig_type_info **interfaceCheckTypes;
static size_t interfaceCheckNumTypes = 0;
bool CheckQtInterface(rdcstr &log)
{
#if defined(RELEASE)
return false;
#else
if(interfaceCheckNumTypes == 0)
return false;
return check_interface(log, interfaceCheckTypes, interfaceCheckNumTypes);
#endif
}
%}
%init %{
interfaceCheckTypes = swig_type_initial;
interfaceCheckNumTypes = sizeof(swig_type_initial)/sizeof(swig_type_initial[0]);
%}
// declare functions for using swig opaque wrap/unwrap of QWidget, for when pyside isn't available.
%wrapper %{
PyObject *WrapBareQWidget(QWidget *widget)
{
return SWIG_InternalNewPointerObj(SWIG_as_voidptr(widget), SWIGTYPE_p_QWidget, 0);
}
QWidget *UnwrapBareQWidget(PyObject *obj)
{
QWidget *ret = NULL;
int res = 0;
res = SWIG_ConvertPtr(obj, (void **)&ret,SWIGTYPE_p_QWidget, 0);
if(!SWIG_IsOK(res))
{
return NULL;
}
return ret;
}
%}
|